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

面白がってオブジェクトを投げて遊んでいると,地面を飛び越えて奈落の底に落ちることはよくある.
また,手やコントローラーのレイが届かないところに飛んでいくこともよくある.
そんなときにアプリを再起動せずに初期位置にリスポーンさせられたら便利.
常に自分の左斜め前にUIがあってボタンが押せたらSF映画みたいで面白そう.
と,いうわけで作ります.MetaQuest3でVRデモ 3. Blenderで自作したモデルをつかむ and 投げるの続きにあたります.
Canvasを使う準備
Hierarchyの空いたところを右クリックし,Create Emptyを作成.
名前は任意だが,ここでは「CanvasModule」に変更.
CanvasModuleのInspectorでAdd Component > Pointable Canvas Moduleを追加.

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
using UnityEngine;
public class respawn : MonoBehaviour
{
[SerializeField] private Transform target; // 初期化対象のオブジェクト
private Vector3 initialPosition;
private Quaternion initialRotation;
private Vector3 initialScale;
void Start()
{
// 起動時のTransform値を保存
if (target != null)
{
initialPosition = target.position;
initialRotation = target.rotation;
initialScale = target.localScale;
}
}
public void ResetToInitialTransform()
{
if (target != null)
{
target.position = initialPosition;
target.rotation = initialRotation;
target.localScale = initialScale;
}
}
}
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モデル位置が初期位置に戻る.