やりたいこと
uGUIを使ってUIを作成する。ただし、UIはゲームのように常に前面に表示されるのではなく、3Dオブジェクトと同じようにシーンに配置されるようにする。
環境
MacOS Mojave 10.14.6
Unity : 2019.3.9f1
Oculus Integration : 16.0
手順
0.前準備
- AssetStoreから
Oculus Integration
をインポートしてある。 - シーンには
OVRPlayerController
を配置してある。 -
OVRPlayerController>OVRCameraRig>TrackingSpace>LeftHandAnchor
にOculusTouchForQuestAndRiftS_Left
を追加、OVRPlayerController>OVRCameraRig>TrackingSpace>RightHandAnchor
にOculusTouchForQuestAndRiftS_Right
を追加してある。
Canvasの配置と設定
ゲームを作成するのと同じようにCanvas
を配置する。ただし、Canvas
コンポーネントの
-
RenderMode
をWorldSpace
にする。 -
EventCamera
に、OVRPlayerController>OVRCameraRig>TrackingSpace>CenterEyeAnchor
を設定する。
Canvas
のサイズを3Dオブジェクトとどうやっても合わせるのか迷うが、サンプルシーン(Oculus>VR>Scenes>UI.scene
)を確認すると、スケールを変更している事がわかる。
例えば幅2メートル高さ1メートルのUIを作成したいのなら、2000×1000で作成後、スケールを0.001にするのが良いのかもしれない。
UIHelpersプレハブを配置
UIインタラクションを提供してくれるのが**UIHelpers
**プレハブ。これをシーンに配置する。
既存のEventSystemを削除
このUIHelpers
は子にEventSystem
を持っており、Canvas作成時に自動生成されたEventSystem
は不要なので削除する。
OVRInputModule
UIHelpers
のEventSystem
には**OVRInputModule
**がアタッチされている。
**OVRInputModule
**のRayTransform
に関しては、
Object which points with Z axis. E.g. CentreEyeAnchor from OVRCameraRig
とあるのでCentreEyeAnchor
を設定する。
右手のトリガーでクリックをさせたい
UIHelpersはデフォルトだとOne
ボタンでクリックを判定するように設定されている。右手のトリガーを引いたときにクリックとするのが自然な気がするのでそう設定する。**OVRInputModule
**のJoy Pad Click Button
でSecondary Index Trigger
にチェックを入れる。
OVRRaycaster
Canvas
にはデフォルトでGraphicRaycaster
がアタッチされている。これはスクリーン上でのレイキャストのみをサポートしており、VR空間内のレイキャストには使用できないので削除する。代わりに、VR空間内でのレイキャストをサポートしている**OVRRaycaster
**をアタッチする
Laser Pointer
UIHelper
の子オブジェクトのLaser Pointer
のMaterialがMissingになっているので、適当なマテリアルを設定する。
ここまでの結果
このようなスクリプトを作成する。
using UnityEngine;
using UnityEngine.UI;
using TMPro;
public class UITest : MonoBehaviour
{
[SerializeField] private Button button1 = default;
[SerializeField] private Button button2 = default;
[SerializeField] private Button button3 = default;
[SerializeField] private TextMeshProUGUI debugText = default;
void Start()
{
button1.onClick.AddListener(() => debugText.text = $"pushed button is {button1.name}");
button2.onClick.AddListener(() => debugText.text = $"pushed button is {button2.name}");
button3.onClick.AddListener(() => debugText.text = $"pushed button is {button3.name}");
}
}
結果はこちら。