たこやき部屋

SteamVRを使って、Unityでゲームを開発したい

ヘッドセット・コントローラ参照 + オブジェクトをハイライト

「SteamVR Plugin 1.2.2」と「VRTK 3.2.1」の記事です。

ヘッドセット・コントローラ参照

VRTKがバージョンアップして、SteamVR PluginのプレハブとかがVRTK_SDKManagerの中に隠蔽されちゃいました。
takoyakiroom.hatenablog.com

これによって、OculusとかDaydreamとかでも使えるようになったのは良いけれど、んじゃヘッドセットやコントローラのオブジェクトはどうやって参照したら良いんだ?

といろいろ調べていたところ、その気持を察してか、最近のVRTK公式動画でやり方説明してました。(いいタイミングだ!)

[Intermediate] SDK Manager Script Registering

これによると、ヘッドセットやコントローラ等のデバイスは「VRTK_DeviceFinder」で参照できるらしい。

バイス 関数 備考
左コントローラ VRTK_DeviceFinder.GetControllerLeftHand()  
右コントローラ VRTK_DeviceFinder.GetControllerRightHand()  
ヘッドセット VRTK_DeviceFinder.HeadsetTransform() SteamVRなら"Camera (eye)"
プレイエリア VRTK_DeviceFinder.PlayAreaTransform() SteamVRなら"[CameraRig]"

主要そうなのはこの4つかな? 他にもいろいろ状態を取得できます。

ただし、「Awake」で「VRTK_SDKManager.instance.AddBehaviourToToggleOnLoadedSetupChange」を、「OnDestroy」で「VRTK_SDKManager.instance.RemoveBehaviourToToggleOnLoadedSetupChange」を呼び出す必要があります。
「NullReferenceException」が発生していたら、こいつが原因の可能性ありです。
また、VRTK_DeviceFinderはオブジェクトの生成順的に(?)「OnEnable」以降が良いらしいです。

んで、具体的には以下のようになります。

適当なオブジェクトにアタッチして、トリガーボタンを押すとConsoleにヘッドセットとプレイエリアの情報が出力されます。

オブジェクトをハイライト

「VRTK_OutlineObjectCopyHighlighter」を使えば、オブジェクトのハイライト表示ができます。

まず、ハイライトさせたいオブジェクトに「VRTK_OutlineObjectCopyHighlighter」をアタッチ。
「Thickness」で線の太さを決めます。
f:id:takoyakiroom:20170811014440j:plain

スクリプトの中で「VRTK_OutlineObjectCopyHighlighter」の「Initialise()」を使って初期化、「Highlight(new Color(1, 0, 0))」でハイライト表示。
引数でハイライトの色が指定可能です。
「Unhighlight()」でハイライト終わり。

トリガーボタンを押している間、ハイライト表示させる場合、こんな感じのスクリプトになるかと。
「using VRTK.Highlighters;」を忘れないでね。

f:id:takoyakiroom:20170811014054j:plain
実行すると、ちゃんとハイライトしている・・・ がっ! モデルによってはハイライトしないのがある・・・
調べてないけど、自前のシェーダ使っているやつとかかな??