13
10

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

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**がアタッチされている。
**OVRInputModule**のRayTransformに関しては、

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

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

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

UIHelpersはデフォルトだとOneボタンでクリックを判定するように設定されている。右手のトリガーを引いたときにクリックとするのが自然な気がするのでそう設定する。**OVRInputModule**のJoy 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

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?