VR
SteamVR
OpenVR

UnityでOpen VRを叩くときの勘所(Steam VR Plugin for Unity)

はじめに

Unityで、例えばVRアプリケーションではないものからOverlayを使いたいときや、コントローラーの詳細情報が欲しいときなどは、Open VRの機能に直接アクセスしたほうが早いことがあります。
私もそうして知見が溜まってきたので、メモを残しておきます。

メモ

公式のWikiはアテになったりならなかったりする

とりあえず困ったら、まずはAPI Documentationを見ましょう。
https://github.com/ValveSoftware/openvr/wiki/API-Documentation

しかしながら、情報が不足していたり古かったりします。
openvr_api.csや、Steam VR Pluginのソースの中にヒントや答えがあることがあります。
新機能がしれっと増えていたりします。

他に当てになる情報は、正直ないです。
他の人の作ったサンプルソースを探してさまよう事が多いです。

だいたい必要な定数は

OpenVR.k_~で定義されている

HMDのindexとか
k_unTrackedDeviceIndex_Hmd = 0;
デバイスの最大接続数とか
k_unMaxTrackedDeviceCount = 64;

シングルトンなんだよなぁ

OpenVR.System
OpenVR.Overlay
などのクラスは、内部でシングルトンになっているので、引っ張り回す必要なく軽率に使える。

逆にこれらはstaticに確保されているようで、アプリケーションを終了する(UnityEditorで動作させている場合はUnityEditorを終了する)まで、変な挙動をし続けることがある。

なお、OpenVR.Systemがnullを返してくる場合は、OpenVRが適切に初期化されていない証拠となる。

HMD持ってるユーザーか調べたい

IsHmdPresentを使うと、高速に判定できる。
ただしTrueだからといって本当に使える環境とは限らない

初期化の必要性

OpenVR.Initは、すでに同じアプリケーション内にVRを動作させているやつがいる場合はやってはいけない。
一方、誰も居ない場合、明示的に呼び出してやらないと恐ろしく不安定な動作になる。
基本的にこれを手動で呼び出す場合は、ApplicationTypeはOverlayだろう。

ここで帰ってくるCVRSystemは、OpenVR.Systemで取得できるものと同じものだが、nullが帰ってくる場合は異常。

明示的なshutdownは不要

基本的に不安定になるので不要。
きっちりオブジェクトが開放されていればそれで問題ないはず。