この記事のゴール

常に傍らに付き続けるボタン付きUIを作成し,オブジェクトを初期位置にリスポーンさせる機能を搭載する.

面白がってオブジェクトを投げて遊んでいると,地面を飛び越えて奈落の底に落ちることはよくある.
また,手やコントローラーのレイが届かないところに飛んでいくこともよくある.
そんなときにアプリを再起動せずに初期位置にリスポーンさせられたら便利.
常に自分の左斜め前にUIがあってボタンが押せたらSF映画みたいで面白そう.

と,いうわけで作ります.MetaQuest3でVRデモ 3. Blenderで自作したモデルをつかむ and 投げるの続きにあたります.

Canvasを使う準備

Hierarchyの空いたところを右クリックし,Create Emptyを作成.
名前は任意だが,ここでは「CanvasModule」に変更.
CanvasModuleのInspectorでAdd Component > Pointable Canvas Moduleを追加.

このコンポーネントは,シーン内の各キャンバスコンポーネントの状態をトラッキングする.忘れず追加すること.
CanvasModuleをPrefabとして保存しておくと後々便利.HierarchyからAssetにドラッグアンドドロップすれば自動的にPrefabとして保存される.

UIの作成

Hierarchyの空いたところを右クリックし,UI > Canvasを作成.

CanvasをOVRCameraRig > TrackingSpace > CenterEyeAnchorの子になるよう移動
また,参考までにCanvasの相対位置と角度は以下のように設定した.あと,Render Modeが「World Space」になっているか要確認.

OVRCameraRig > TrackingSpace > CenterEyeAnchor > Canvasを右クリックし,UI > Button – TextMeshProを追加.
サイズや位置,中身の文字を適宜調整する.参考例↓

OVRCameraRig > TrackingSpace > CenterEyeAnchor > Canvasを右クリックし,Interaction SDK > Add Poke Interaction to Canvasを追加.
※Add Ray Interaction to Canvasでもこれ以降同じ処理.両方追加しても問題なし.また,ボタンが複数あってもAdd Poke Interaction to Canvasは1つでいい.

C#スクリプトでリスポーン機能を実装

Project > Assetの任意の箇所で右クリックし,Create > MonoBehaviourScriptでcsファイルを作成.
名前は任意だが,ここでは「respawn.cs」とする.中身は下記のとおり.

respawn.cs

Hierarchyの空いたところを右クリックし,Create Emptyを作成.
名前は任意だが,ここでは「Respawn」に変更

RespawnのInspectorにrespawn.csをドラッグアンドドロップして追加.
Targetの枠内にHierarchyの3Dモデルをドラッグアンドドロップ.

OVRCameraRig > TrackingSpace > CenterEyeAnchor > Canvas > ButtonのInspectorで,Button内のOnclickの「+」をクリック.
None (Object)枠にHierarchyのRespawnをドラッグアンドドロップ.
No Function枠をクリックし,respawn > ResetToInitialTranform()を選択.

この状態でビルドすると,視点左側に「Respawn」と書かれたボタンが視点を追随して表示される.これをRayやPokeで押すと,3Dモデル位置が初期位置に戻る.