Meta Quest2 で3Dオブジェクトをコントローラで操作する

やりたいこと

Meta Quest2 で3Dオブジェクトをコントローラで操作したい!
たとえば、3Dオブジェクトをレイで選択した状態でトリガーを引くことで、何かのイベントを発火したい。
ドキュメントが少なく、思ったよりも難しかったので知見を公開します。

ポイント

Oculus Integrationを使用して3Dオブジェクトをコントローラ操作するには以下がポイントになります。

  • 3DオブジェクトにはEventTrigerを設定する。
  • OVRCameraRigにOVRPhysicsRaycasterを設定する。
  • 3Dオブジェクトにはコライダーを設定する。

環境

HMD: Meta(Oculus) Quest 2
Unityバージョン: 2021.3.11f1
Oculus Integrationバージョン: Version 44.0 – October 04, 2022

手順

  • MainCameraなど、既存のCameraがあれば削除する。
  • 既存のEventSystemがあれば削除する。
  • OVRPlayerControllerを追加。
    Assets > Oculus > VR > Prefabs > OVRPlayerController をHierarchyウインドウにドラッグ&ドロップする。
  • OVRPlayerControllerのPosition > Y を2に変更。
  • UIHelperを追加。
    Assets > Oculus > SampleFramework > Core > DebugUI > Prefabs > UIHelpers をHierarchyウインドウにドラッグ&ドロップする。
  • 地面になるPlaneを追加。
    右クリック > 3D Object > Plane。
  • 操作対象のCubeを追加。
    右クリック > 3D Object > Cube。
  • 3Dオブジェクトにイベントを伝播できるようにするため、OVRPlayerControlerの下にあるOVRCameraRigを選択する。また、OVRCameraRigのInspector画面のAdd Componentを押下し、OVRPhysicsRaycasterを追加する。
  • OculusのコントローラとOVRInputModuleを紐づけるため、UIHelpers の下にあるEventSystemを選択する。
    また、EventSystem のInspector画面のOVR Input Module -> Ray TransformにRightControllerAnchorを設定する。
  • コントローラからの線を見やすくするため、UIHelpersの下にあるLaserPointerの Line RendereをONにする。
  • Cubeに以下のテスト用スクリプト「ChangeColor」を追加する。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class ChangeColor : MonoBehaviour
{
    public void toRed() {
        gameObject.GetComponent<Renderer>().material.color = Color.red;
    }

    public void toWhite() {
        gameObject.GetComponent<Renderer>().material.color = Color.white;
    }
}
  • CubeにEventTrigerを追加し、コントローラからのイベントを取得できるようにするため、
    Pointer Down(コントローラのボタンを押す)イベントにtoRedを割り当てる。
    また、Pointer Up(コントローラのボタンを離す)イベントにtoWhiteを割り当てる。

ビルドして実行

参考

Oculus Goでコントローラ操作(3DオブジェクトとuGUI)

Oculus Go – UI interaction with the controller

追記

記事を作成したあと、QiitaのMiicoco様の投稿された記事に同じ趣旨の記事があることに気が付きました!
【Oculus Quest2】レーザーポインターでUIと物理オブジェクトを操作する