SteamVRなんもわからん…
SteamVR 1.x の時代は、コントローラーの情報を無理やり取得できたのですが、
SteamVR 2.x になってからはHMD必須になったようです。
普通の人はここで NullDriver を設定して問題を回避します。
なんとかHMD無しでSteamVR.Input単体で動かせないか検証しました。
何故こんな不毛な検証をするのか
VRアプリ以外で、高性能コントローラーとしてVRコントローラーを使いたい
その際に余計なリソースを持ちたくない
環境要件
- Unity 2018.4.13f1
- SteamVR Unity Plugin 2.5.0
[SteamVR の設定] HMD無しでエラーにしない方法
Steamのインストールディレクトリを探して、あなたのVR設定を発掘します
例えば、 D:\Steam\config\steamvr.vrsettings
など、Steamインストールしたディレクトリの config
を探してみましょう。
見つけたら "steamvr"
のエントリを編集して、以下のように書き換えましょう。項目が存在するなら更新、無いなら追加です。
{ ~略~ "steamvr" : { "activateMultipleDrivers" : true, "requireHmd" : false, ~略~ }, ~略~ }
SteamVR を終了し、HMDを外す。場合によっては再起動する必要があります。
後で分かりますが、この状態は負けフラグです。
地獄の検証結果
(HMDが)あるとき
全てが正常に動きます。
何もしない
openvr_api.dll
が読めない(手動設置するしかない)- 手動で
OpenVR.Init()
してもOpenVR.Input
が取得できない
Package missing for Virtual Reality SDK OpenVR. Please add the OpenVR (Desktop) package using the Package Manager Window.
Will attempt to enable None instead.
そりゃそうだ。
UnityProjectSettings > Player > Virtual Reality Supported
openvr_api.dll
が読めるようになる (Version 1.0.5)- アプリケーション初期化時に
OpenVR.Init()
が走る Virtual Reality Supported
の子の設定項目を読み込む- よくわからないけど SteamVR がうまいことやってくれる
SUCCESS!!
PackageManager > OpenVR (Desktop)
openvr_api.dll
が読めるようになる (Version 1.0.5)- アプリケーション初期化時に
OpenVR.Init()
は勝手には走らない (手動で初期化またはシーン中にSteamVR_Behaviour
があれば走る) - 好きなように OpenVR を使うことができる
SUCCESS!!
(HMDが)ないとき
地獄です。
何もしない
openvr_api.dll
が読めない(手動設置するしかない)- 手動で
OpenVR.Init()
してもOpenVR.Input
が取得できない
UnityProjectSettings > Player > Virtual Reality Supported
openvr_api.dll
が読めるようになる (Version 1.0.5)- アプリケーション初期化時に
OpenVR.Init()
が走る Virtual Reality Supported
の子の設定項目を読み込むOpenVR.Init()
実行時に HMDが無ければ落ちる
XR: OpenVR Error! OpenVR failed initialization with error code VRInitError_Init_HmdNotFound: "Hmd Not Found (108)"!
PackageManager > OpenVR (Desktop)
openvr_api.dll
が読めるようになる (Version 1.0.5)- アプリケーション初期化時に
OpenVR.Init()
は勝手には走らない (手動で初期化またはシーン中にSteamVR_Behaviour
があれば走る) OpenVR.Init()
実行時に HMDが無ければ落ちる
XR: OpenVR Error! OpenVR failed initialization with error code VRInitError_Init_HmdNotFound: "Hmd Not Found (108)"!
悪あがきで初期化時の設定を変えたり無理やりクラスを引っ張り出そうとすると、ぬるぽやUnityEditor落ちと闘う羽目になります。。。
OpenVRのソース読む
ピュア初期化のためのイースターエッグを求めて、 OpenVRのリポジトリを見るも…
https://github.com/ValveSoftware/openvr/blob/master/src/ivrclientcore.h
初期化処理を追いかけると、最終的にヘッダからlib読みに行くところで試合終了です。
libのソースは無い。
結論
OpenVRで VRコンを使うときに、HMDは「存在しなければいけない」
NullDriverに頼らざるを得ないことが証明された。
余計なリソースを持ちたくないー (2回目)
Appendix:NullDriverの導入方法
Steamのインストールディレクトリを探して、あなたのVR設定を発掘します
例えば、 D:\Steam\config\steamvr.vrsettings
など、Steamインストールしたディレクトリの config
を探してみましょう。
"steamvr"
のエントリの並びに、 "driver_null"
を追加しましょう。1項目追加するだけです。
"forcedDriver"
の設定は不要です。NullDriverを強制しなくてもHMDが無ければ最低優先度でNullDriverが読み込まれます。
{ ~略~ "steamvr" : { ~略~ }, "driver_null" : { "enable" : true }, ~略~ }
参考資料
懐かしのまとめ記事で、全ての始まり shop-0761.hatenablog.com