ディレクトリ丸ごとの VRChat avatar をコマンド一発で全部アップロード
VRC-Auto-Uploader は VRChat avatar のバッチアップロードツールで、ディレクトリ内のモデルをコマンド一発で全部アップロードする。従来の流れだと1つ上げるだけでも Unity を開き、プロジェクトを作り、SDK を入れ、パッケージをインポートし、Prefab を探し、Blueprint ID を消し、大量のダイアログをクリックする必要があって、1つで十数分、数十個なら丸一日が飛ぶ。このツールはその機械的な作業を丸ごと自動化する。
アーキテクチャは Python の主制御に、Unity へ注入する C# を組み合わせたもの。最初は -batchmode -nographics でヘッドレス実行しようとしたが、壁にぶつかった。VRChat のアップロードは VRCSdkControlPanel.TryGetBuilder() に頼っていて、これが Unity Editor の GUI 初期化に依存しているため、ヘッドレスモードでは Builder がそもそも登録されない。だから GUI モードで起動するしかないが、実行中は誰もマウスに触れず全自動で進む。Python がディレクトリをスキャンし、展開し、クリーンな一時プロジェクトを作り、SDK と lilToon をインストールしてから Unity を起動してログをリアルタイムで読む。Unity 側は [InitializeOnLoad] が起動と同時に引き継ぎ、SDK パネルを開き、unitypackage をインポートし、Prefab を探し、Blueprint ID を消し、最後に BuildAndUpload() を呼ぶ。両者は1つの JSON 結果ファイルで通信する。
手こずるのはアップロードそのものではなく、周辺の細かい部分だ。他人からもらったモデルには元作者の Blueprint ID が付いていて、そのまま上げると「他人の Avatar を上書きできない」とエラーが出るので、1つずつ先に消しておく必要がある。界隈のモデルは十中八九 lilToon を使っていて、shader を入れないと全部ピンクになるので、一時プロジェクトには lilToon と Modular Avatar も自動でインストールする。SDK は著作権表示や更新通知を大量にポップアップしてきて、手動でクリックする分には問題ないが、自動化では即デッドロックになるので、専用の PopupSuppressor を書いて自動で閉じるようにした。プロジェクトは毎回独立した一時的なものを開き、アップロードが終わったら捨てて、互いの汚染を防ぐ。展開はついでに .zip/.rar/.7z に対応し、中の unitypackage を自動で取り出し、shader のみのパッケージは除外する。
使うにはまず python main.py setup を実行すると、Unity のインストール先を自動検出し、vrc-get をダウンロードする。初回アップロードでは一度だけ手動で VRChat SDK アカウントにログインする必要がある。SDK はコード内にアカウントとパスワードを埋め込む口を用意していないためだ。ログインすればセッションは永続化され、以降は気にしなくていい。
# 展開のみ、アップロードはしない まずディレクトリの中身を確認
python main.py extract --dir "D:\Model"
# 問題なければ ディレクトリ丸ごとバッチアップロード
python main.py batch --dir "D:\Model" -y
結果は upload_results.json に出力され、各モデルの blueprintId と成否ステータスが入る。環境は Unity 2022.3.22f1 に固定してある。VRChat が公式に指定するバージョンで、他のバージョンだと SDK が不調を起こしやすい。このツールは自分の管理する著作権付きモデル用で、使う人の自己責任、自分のものでないものはアップロードしないこと。発想は VRCMultiUploader を参考にした。コードは github.com/dwgx/VRC-Auto-Uploader にある。