Unity ゲーム用の VR MOD の作り方 (とりあえず立体視できるまで)
前提条件
Unity での VR 関連がどう動くかの理解がある
BepInEx を利用した MOD の作成方法への理解がある
SteamVR 環境がある
SteamVR がいない OpenXR オンリーな環境で (com.unity.xr.openxr を使って) 同様の手法が使えるかは謎
対象ゲームが Mono である (IL2CPP でない)
いわゆる _Data/Managed があるゲーム
IL2CPP でも頑張ったらできなくはないと思う…たぶん (先行事例はある)
対象ゲームの BepInEx (5.x) MOD 環境導入済み
6.x でも動くかもしれないし動かないかもしれない
例コードは Unity 2022.3.12f1 用なのでバージョンが違う場合は頑張って調べてください
たぶんメジャーバージョンが違うとわりと違う
生贄プロジェクト編
必要な DLL などのファイルを用意するために同じ Unity バージョンをインストールしてプロジェクトを作る
ゲームが使っているレンダリングパイプライン (Built-in, URP, etc...) にテンプレートを合わせる必要がある?
ここでは合わせる必要なくてもおそらく後々 AssetBundle とか作るハメになると思うので合わせておいて損はなさそう
バージョンに拘りがあるわけではないのでその時の最新版とかでたぶん良いです
com.valvesoftware.unity.openvr-1.1.4.tgz を Package Manager → + → Add package from tarball… から追加
Project Settings → XR Plug-in Management で OpenVR Loader を有効化
Project Settings → XR Plug-in Management → OpenVR で
Application Type: Scene
Stereo Rendering Mode: Multi Pass
Single Pass Instanced でも運が良ければ行けるかも (未検証)
Mirror View Mode: 知らん
Build Settings
Target Platform を Windows
Architecture をゲームのbit数に合わせる
注入編 (ここを対象ゲーム非破壊でやる方法はあるんだろうか)
生贄_Data/ 下の以下のファイルを 対象ゲーム_Data/ にコピーする (被ったファイルはスキップ、フォルダ構造は合わせて)
Plugins
UnitySubsystems
Managed
StreamingAssets/SteamVR
対象ゲームのトップにある UnityCrashHandler64.exe を消しておく (わけのわからんクラッシュログが飛ぶと迷惑なので)
コード編
こんな感じでVRを有効化する (BepInEx の Awake あたりで)
code:Awake.cs
// UnityEngine.XR.Management
var generalSettings = ScriptableObject.CreateInstance<XRGeneralSettings>();
var managerSettings = ScriptableObject.CreateInstance<XRManagerSettings>();
// Unity.XR.OpenVR
var vrLoader = ScriptableObject.CreateInstance<OpenVRLoader>();
managerSettings.loaders.Clear();
managerSettings.loaders.Add(vrLoader);
managerSettings.InitializeLoaderSync();
generalSettings.Manager = managerSettings;
managerSettings.StartSubsystems();
HMDにカメラ追従
UnityEngine.SpatialTracking.TrackedPoseDriver Component を Camera が付いている GameObject に付与する
あとは頑張ってゲームのシーン移動とかに追従する
頑張って!
なんか Screen position out of view frustum がめっちゃ出ますけど……
うちの環境でも出るけど直し方は知らん、直し方わかったら教えてください
ゲームのUIがHMD内に出ませんけど……
頑張って Canvas を VR 内に持ってくる必要がある、頑張ってください
SteamVRのメニュー内でアプリ毎解像度を変えても変わらないんですけど……
これなぜなのかよくわかってない
VRのコントローラーの入力ってどうやって受け取るんですか?
そこまで行く前に飽きたので知らない