LoginSignup
13
10

More than 3 years have passed since last update.

【Unity】【Oculus Quest】 uGUIを使う

Last updated at Posted at 2020-05-27

やりたいこと

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>LeftHandAnchorOculusTouchForQuestAndRiftS_Leftを追加、OVRPlayerController>OVRCameraRig>TrackingSpace>RightHandAnchorOculusTouchForQuestAndRiftS_Rightを追加してある。

Canvasの配置と設定

ゲームを作成するのと同じようにCanvasを配置する。ただし、Canvasコンポーネントの

  • RenderModeWorldSpaceにする。
  • EventCameraに、OVRPlayerController>OVRCameraRig>TrackingSpace>CenterEyeAnchorを設定する。

Canvasのサイズを3Dオブジェクトとどうやっても合わせるのか迷うが、サンプルシーン(Oculus>VR>Scenes>UI.scene)を確認すると、スケールを変更している事がわかる。
スクリーンショット 2020-05-19 21.59.31.png
例えば幅2メートル高さ1メートルのUIを作成したいのなら、2000×1000で作成後、スケールを0.001にするのが良いのかもしれない。

UIHelpersプレハブを配置

UIインタラクションを提供してくれるのがUIHelpersプレハブ。これをシーンに配置する。

既存のEventSystemを削除

このUIHelpersは子にEventSystemを持っており、Canvas作成時に自動生成されたEventSystemは不要なので削除する。

OVRInputModule

UIHelpersEventSystemにはOVRInputModuleがアタッチされている。
OVRInputModuleRayTransformに関しては、

Object which points with Z axis. E.g. CentreEyeAnchor from OVRCameraRig

とあるのでCentreEyeAnchorを設定する。

右手のトリガーでクリックをさせたい

UIHelpersはデフォルトだとOneボタンでクリックを判定するように設定されている。右手のトリガーを引いたときにクリックとするのが自然な気がするのでそう設定する。OVRInputModuleJoy Pad Click ButtonSecondary Index Triggerにチェックを入れる。

OVRRaycaster

CanvasにはデフォルトでGraphicRaycasterがアタッチされている。これはスクリーン上でのレイキャストのみをサポートしており、VR空間内のレイキャストには使用できないので削除する。代わりに、VR空間内でのレイキャストをサポートしているOVRRaycasterをアタッチする

Laser Pointer

UIHelperの子オブジェクトのLaser PointerのMaterialがMissingになっているので、適当なマテリアルを設定する。

ここまでの結果

このようなUIを作成して、
スクリーンショット 2020-05-27 15.00.42.png

このようなスクリプトを作成する。

UITest.cs
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}");
    }
}

結果はこちら。

output.gif

13
10
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
13
10