雑なメモです。
追記:2025年11月6日
この記事の内容について、もう少しマシにした改訂版の記事を別記事として出しました:
【改訂版】NixOSでVRChatのアバターをアップロードする方法(GPU Offloading付き)
下記の内容に誤りが含まれている訳でもないのですが、上記の記事ではより改善された手法を紹介しているので、 よかったらそちらも参考にして下さい。
0. 話の前提
- 最近NixOS上のProton環境でVRChatを始めた
- ランクが
New Userになったのでアバターをうpできるようになった - しかしアバターのうpにはUnityが必要でして……
と言う流れがあり、その中で色々とやっていく必要があったので色々をやった、という事についてメモったのが今回の記事です。
なおLinux上のUnityからVRChatへのアバターアップロードには成功しており、今のところ、
キプフェル Kipfel / オリジナル3Dモデル - もち山金魚 - BOOTH
を被りつつVRChat生活をやっております。
1. まずUnityの起動環境を確保する
遭遇した問題
しょっぱなから難題だったのですが、まずUnityをインストールするためにはUnityHubと言うソフトウェアが必要です。
そしてUnityHubについてはnixpkgs#unityhubとしてnixpkgsで提供されているので、これについては問題がありませんでした。
しかしですね?
nixpkgs#unityhubでインストールしたUnityは、workaroundを挟んでいないNixOS環境では動きません。
は?
と思われるかもしれませんが、動かないものは動きません。どうしてそうなる。
これについての原因は、
Can't create any project in UnityHub · Issue #419634 · NixOS/nixpkgs
というGitHubでのIssueにも書いてある通りなのですが、どうもVRChatで使うUnity 2022.3.22f1 は libxml2.so.2 のABIを要求するらしく、
これが入ってないシステムだと起動すらしません。そのためここに対する手当が必要。
よってNixOSでUnityを使うためにはこの辺りをなんとかしたパッケージングが必要なのですが、 私は次のような方法でこの問題をなんとかしました。
解決策
まず buildFHSEnv を使って次のようなFHS環境を用意します。私の場合、
この環境を利用するためのコマンドである unityhub-shell というパッケージ定義を nixpkgs.overlays 経由で生やしました、抜粋するとこんな感じ:
final: prev: {
unityhub-shell = prev.buildFHSEnv {
name = "unityhub-shell";
# `targetPkgs` や `multiPkgs` に必要なパッケージは `unityhub` のパッケージ定義から直接引っ張ってきてます。
# またその際に依存の順序を昇順に並び換えました。
targetPkgs =
p: with p; [
unityhub
fontconfig
freetype
gsettings-desktop-schemas
hicolor-icon-theme
lsb-release
xdg-utils
xorg.libXrandr
];
multiPkgs =
p: with p; [
alsa-lib
at-spi2-core
atk
cairo
clang
cpio
cups
dbus
expat
gdk-pixbuf
git
glib
gnome2.GConf
gtk3
harfbuzz
icu
krb5
libappindicator
libcap
libdrm
libgbm
libglvnd
libnotify
libpulseaudio
libsecret
libuuid
libva
libxkbcommon
libxml2
lttng-ust_2_12
nspr
nss
openssl
pango
udev
vulkan-loader
wayland
xorg.libX11
xorg.libXScrnSaver
xorg.libXcomposite
xorg.libXcursor
xorg.libXdamage
xorg.libXext
xorg.libXfixes
xorg.libXi
xorg.libXrender
xorg.libXtst
xorg.libxcb
xorg.libxshmfence
zlib
# これが今回のポイント
# https://github.com/NixOS/nixpkgs/issues/419634 で紹介されていた workaround をアレンジしたもの
(p.runCommand "libxml2-fake-abi" { } ''
mkdir -p $out/lib
ln -s "${pkgs.lib.getLib pkgs.libxml2}/lib/libxml2.so" $out/lib/libxml2.so.2
'')
];
};
}
次いでこの unityhub-shell をシステムのパッケージリストへ追加(私は home-manager の home.packagesへ追加した)し、
unityhub-shell というコマンドを打つと、上記FHS環境へアクセスできるようにしました。なおこの環境はUnityを起動する際に使います。
ちなみにこの際の unityhub-shell は最終的に bash を起動するようになっているため、
unityhub-shell への引数は bash と同じになります。ここはポイントです。
あとはUnityをインストールすれば良いだけなので、これは各種端末エミュレーターから、
$ unityhub-shell -c "unityhub unityhub://2022.3.22f1/887be4894c44"
というコマンドを打ち、UnityHubからUnity 2022.3.22f1 のインストールを成功させます。
なおこの時の諸々のインストールオプションなどはWindowsでVRChatのアバターをアップロードする際のオプションと同じなので、 それは各位で調べてやっていきましょう。
また 2022.3.22f1 を使っている理由はVRChat側がUnityのバージョンを決め打ちしてる(?)ためなので、
他のバージョンを使っても多分アバターのアップロードは成功しません。そのためここは注意。
以上でUnityのインストールが成功しているのなら、下記のようなコマンドでUnityが起動できるので、一応サンプルを掲載しておきます。
ここでのポイントは LD_LIBRARY_PATH=/usr/libという環境変数の指定で、
Unity 2022.3.22.f1 が必要とする libxml2.so.2 はFHS環境で /usr/lib に存在するため、LD_LIBRARY_PATHの指定は必須です。
$ unityhub-shell -c "LD_LIBRARY_PATH=/usr/lib ~/Applications/Programs/Unity/Editor/2022.3.22f1/Editor/Unity -projectpath ~/Documents/ALCOM/Kipfel"
2. VRChat Creator Companionの変わりにALCOMを使う
遭遇した問題
通常のWindows環境では、VRChat用Unityプロジェクトを管理するために、
Creator Companion | VRChat Creator Companion
と言うWindows用ソフトウェアを利用します。
しかしここはLinux、しかもtmpfs as rootfsを実現したNixOS、再起動すると不要なファイルはすべて蒸発する魔の領域です。 無論Windows用ソフトウェアなんぞ動かせません、というかWindows用Unity自体がwineを使っても(たぶん)起動しません。
となれば当然、ではどうする?
となる訳ですが、ここでは、
というクロスプラットフォームでOSSなソフトウェアを利用します。
というかそういうソフトウェア、あるんだ(今日のあるんだ)。
解決策
これは普通に nixpkgs#alcom をシステムへ突っ込むだけで作業は終わります。
ただ nixpkgs#alcom はどうも master ブランチでもversionが最新ではないため、
最新版を使いたい場合には overrideDerivation 辺りでも使って src を入れ替えないとダメっぽい気がします。
ここでnixpkgsへの貢献チャンス。
そしてALCOMを使えるようになったら、GUI画面をポチポチして初期設定を済ませ、 VRChat用のアバタープロジェクトの作成などをやっておきます。
この際の注意としては、まず初期設定の際にUnityHub周りの設定をスキップすることと、 VRChat用Unityプロジェクトを作った時に下記のパッチライブラリを導入しておくことです:
Linux VRChat SDK Patch Listing
上記のパッチが必要な理由はVRChat用のプロジェクトをLinux上で作っているから、 らしいのですが、Unityについて詳しくないので、細かいところまでは分かっていません。
またこのパッチや注意点についての情報は、
Unity | Linux VR Adventures Wiki
というページに大体は掲載されているので、この辺りは読みましょう。英語だけど。
3. ALCOMでUnityが開けない問題をなんとかする
遭遇した問題
さてここまでやればALCOM経由でUnityを起動し、VRChatへアバターをアップロードする段階へ入れる……、 とでも思った?残念、まだやることがあるんだなこれが。
エッ、どう言うこと?
というと、まず先のALCOMの初期設定を済ませる際に、
初期設定の際にUnityHub周りの設定をスキップすること
と書きましたが、何故こう言った注意書をしたのかと言えば、 ALCOMのUnity検出周りの機能、どうもNixOSだと動いていません。
もしかすると動かす方法があるのかもしれませんが、何の加減なのか、 ALCOMの持つ、
- UnityHubからインストールされたUnityのバージョンを検出する
という機能が上手く動かないため、ALCOMからUnityを直接起動する、と言う機能が使えないんですよね。
そのためこの辺りは次のようなworkaroundをやります、なおこのworkaroundが最期のworkaroundです。
解決策
まずこの記事の最初の方で unityhub-shell というFHS環境を用意しましたね?
で、その上で下記のような起動サンプルを紹介したはずです:
$ unityhub-shell -c "LD_LIBRARY_PATH=/usr/lib ~/Applications/Programs/Unity/Editor/2022.3.22f1/Editor/Unity -projectpath ~/Documents/ALCOM/Kipfel"
で、このサンプルに記載した、
-projectpath ~/Documents/ALCOM/Kipfel
は、実際のところ、ALCOMで作ったVRChat用Unityプロジェクトのパスを指定しています。
つまりALCOM経由でUnityが起動できないのであれば、端末エミュレーターから直接起動してしまえばいいじゃない! という事です。なるほど、これで万事解決。簡単ですね(本当か?)
残り
ここまで分けの分からんノリで記事を書いてきて疲れてきたんですが、 ここまでの流れでようやくVRChatへアバターをアップロードするためのUnity環境構築が完了します。
あとはWindows環境などと同じ要領で、VRChatのアバターをアップロードすれば作業は終了です。
この際の注意点としては、
ライセンスを良く読み、アップロードの際に
Privateを指定すること
と言う辺りで、アバターをPublicで公開してしまうと全世界からそのアバターが利用可能になってしまうため、
こう言う事故が起きると、恐らくライセンス違反はもちろんのこと、著作権的にもヤバいことになるので本当に気をつけましょう。
また他の注意点として、アバターが依存するAssetsの中にWindows用バイナリが含まれていた場合、 Linux環境で動かしている都合上、その辺りは当然のように動かないので、そこも気を払う必要があります。
それ以外については普通にUnityを使ってVRChatへアバターをアップロードする際と同じなので、
アバター導入方法 Step.4c : VCC版 - VRChat初心者向けガイド
辺りの後半を参考にして、各位やっていってください。お疲れさまでした。
以上
という事で半分ノリで書いていた雑なメモは以上です。
上記の内容については先日の朝5時に目が覚めてから、朝食前の7時までの間、 つまり2時間ぐらい試行錯誤して辿り付いた感じなのですが、まーなんとかなったと言えばなんとかなりました。
そのため今のところ普通のキプフェルが自分のVRChatアカウントに居るのですが、 今後はキプフェルのアバター改変へ手を出したりとか、あるいは一から自分のネタアバターとか作れたらいいなーとか思っています。
あと今回の作業、NixOS固有の問題に結構手を焼いた感じだったのですが、 これが他のLinux distroだと、
- UnityHubをインストールしてUnity
2022.3.22f1を導入する - ALCOMを導入する
- ALCOMでプロジェクトを作ってpatchesを導入、そこからプロジェクトをUnityで開く
- あとはUnity経由でVRChatへアバターをアップロード
という流れでここまで詰まることもなくアップロードできると思います。
いやぁ本当、NixOSって大変ですね、かしこ。