GNU/Linux上で、VRChatプロジェクトをUnity 2022.3.6f1に更新するためのガイド

当然ながらVRChatはGNU/Linux上での動作をサポートしていないが、ゲーム本体はProtonの使用によりプレイ出来る上、Unityは元々クロスプラットフォームなのでワールドとアバターの開発は可能である。
しかしやはりサポートされていないだけあって、作業する上で多数の問題に遭遇するのが現状だ。

このガイドではGNU/Linux(や、macOSを始めとしたUnixオペレーティングシステム)上にて、Unity 2019.4.31f1で作成されたVRC用のアバターやワールドプロジェクトを、Unity 2022.3.61用に更新して、ビルドしアップロードする手順を紹介する。

VRChat関連のパッケージの更新

GNU/Linux上にはGUIのVRChat Creator Companionは存在しないため、CLI版のvpmコマンドを利用する。

パッケージの追加と更新はvpmコマンド内のaddコマンドで実行出来る。
プロジェクトフォルダに入ったら、基本的には以下のコマンドを最低限実行すれば良い。

#アバターの場合
vpm add package com.vrchat.base
vpm add package com.vrchat.avatars
vpm add package com.vrchat.core.vpm-resolver
# ワールドの場合
vpm add package com.vrchat.base
vpm add package com.vrchat.worlds
vpm add package com.vrchat.core.vpm-resolver

ワールドのパッケージを更新すると、ClientSimとUdonSharpのパッケージが削除されるが、どうやらWorldsパッケージに統合されたようなので問題はなく、今後も機能を利用する事が出来る。
ClientSimに至っては、以前のバージョンではマウスカーソルが捕捉されず視点操作が出来ないバグがあったが、GNU/Linux環境でも問題無く使えるようになった。Build and Testが利用出来ないGNU/Linux環境では重宝するのでおすすめだ。

スクリプトの修正

GNU/Linux環境ではこのままでは動作しない。VRCSDKのスクリプトを修正しする必要がある。

修正する必要があるファイルは、
(プロジェクトフォルダ)/Packages/com.vrchat.base/Editor/VRCSDK/Dependencies/VRChat/API/VRCTools.cs
これを適当なテキストエディタで開く。

このスクリプト内には、「IncreaseSendBuffer」という関数が存在する。この関数は、その直上に挿入されているコメントの通り、MonoバージョンのUnityでは動作しない。つまりMicrosoftによる.NETの実装でしか動作しない。これはWindows以外の環境ではこの関数が利用出来ないことを示しており、GNU/Linuxではこの関数を無効化する必要がある。
IncreaseSendBuffer関数はVRChat SDK Baseの3.5.0では、88行目に存在する。

最も手っ取り早いのは、その関数の先頭行に「return;」を挿入すること。プログラミングに精通している者であれば分かるとは思うが、知らない人のために説明すると、returnはその関数を終了させる文だ。これを先頭に挿入することで、それ以降のコードを無効化する。
変更後は以下のようになる。

internal static async Task IncreaseSendBuffer(Uri targetUrl, Task sendRequest,
            CancellationToken cancellationToken)
        {
	return;
	var serv...

参考: https://ask.vrchat.com/t/error-uploading-avatar-from-unity-linux-2022-3-6f1/21530

プロジェクト設定の変更

必要なファイルが揃ったので、Unity Hubから、使用するUnityのバージョンを変更する作業に入る。
めんどくさいので、Unity 2022.3.6f1は既にインストールしている前提で進める。2022.3.6f1はUnity Hub内から簡単にインストール出来るので、そう迷わないと思われる。

プロジェクト一覧より、「エディターのバージョン」をクリックし、Unity 2022.3.6f1を指定する。変更してもよいか聞かれるので「バージョンを変更」を押して次へ進む。
今度はUnity Editorが「Opening Project in Non-Matchin Editor Installation」と、Unityのバージョンが違うプロジェクトを開こうとしているが良いかまたしても聞かれるので、「Continue」で進む。

プロジェクトを開いている間、Unityが数度強制終了するが、根気良くUnity Hubからプロジェクトを開き直そう。何度か繰替えしているうちにプロジェクトが開かれ、プロジェクトのUnity 2022.3.6f1への更新が完了する。

ワールドのアップロード

アバターのアップロードについては何ら問題完了する一方で、ワールドのアップロードには一工夫必要となる。

僕が自分で質問しておいて自分で解決してしまったVRCフォーラムの投稿を元に解説する。

1. ファイルの削除

Unity 2019.4.31f1でワールドを作成していた場合は、Unityの一時ファイルを一度削除する必要がある。
Flatpak版のUnityHubの場合、〜/.var/app/com.unity.UnityHub/cache/tmp/DefaultCompany/ の内容を全て削除する。Flatpak以外の場合は場所が異なるため、各自環境に合わせて読み換えてほしい。

2. 一旦ビルドする、失敗するけれど

失敗は成功のもと、とはよく言うが、アップロードするためには一旦”必ず失敗するビルド”をする必要がある。

とりあえず、いつも通りVRCSDK Control Panelから「Build and Upload」をクリックする。
すると、必ず何らかのエラーとともに「Upload Faild」してしまう。エラーの内容は「AssetBundle was not built」だったり「This file was already uploaded」だったりと様々だが、とにかくエラーが出て失敗する。

3. ファイル名の修正

先程内容を削除した~/.var/app/com.unity.UnityHub/cache/tmp/DefaultCompany/の中に、プロジェクト名と同じか、もしプロジェクトを途中で改名していれば、最初に付けた名前のフォルダーが作成されている。その作成されたフォルダに入る。

そのフォルダ内に、scene-standalonewindows64-(Unityのシーンファイル名、すべて小文字).vrcwといった形でVRChatシーンのデータファイルが存在する。このファイルへのシンボリックリンクを、scene-StandaloneWindows64-(Unityのシーンファイル名、実際の名前).vrcwといった風の名前で作成する。
元の小文字ファイルの名前を変更しても上手く動作しない。すべて小文字のファイル名と、大文字を含んだファイル名の両方が存在する必要がある。

例えば、Unityのシーンファイルを「Main.unity」という名前で保存していたとすると、~/.var/app/com.unity.UnityHub/cache/tmp/DefaultCompany/下には、
scene-standalonewindows64-main.vrcw
というファイルが存在するはずなので、これに対し、
scene-StandaloneWindows64-Main.vrcw
という名前でシンボリックリンクを作成する。

4. 再度ビルド

シンボリックリンクを作成したら、今度は”上手く行くビルド”をする。と言っても手順2と同様に、UnityのVRCSDK Control PanelからBuild and uploadを実行する。今度はワールド自体に問題が無けばアップロードが正常に完了するはずだ。

次回以降ビルドする時は

やや面倒な作業を踏む必要があるが、何と作成した大文字を含んだシーンファイルはビルドの度に消えてしまう。そのためビルドする度に手順2〜4を繰替えす必要がある。
ツールで自動化するのも良いだろうが、面倒なので僕はやっていないし解説もしない。各自自分で考えて実装する事。

終わりに

面倒な手順を踏む必要こそあったが、海外ユーザーの研究と、僕の努力と才能もあってGNN/Linux上でのVRChat関連の創作がUnity 2022.3.6f1でも可能になった。

日本にはおそらく僕以外にGNU/LinuxでVRChat関連の創作を行なう者は居ないだろうとは思われるが、もし僕以外にそんな物好きがいて、この記事が役に立ったなら幸いだ。

追記: GNU/LinuxでVRChatのあれこれをやっているような変態が僕以外にも居るならば、是非ともフレンドになりたい所。まずは僕のTwitterをフォローしてね!

コメントする

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください