Unityでボタンを設置して、コントローラーからのレーザーでクリックする方法 [Meta Quest Pro]

前提

すでに、UnityでMeta Quest用のアプリを開発できる環境が整っていることを前提とします。

もしできていなければ、以下を参考に環境構築してください。

Unity + Meta Quest(Oculus Quest)開発メモ

動作確認環境

  • HMD: Meta Quest Pro
  • Unity Version: 2021.3.2f1
  • PC: Ubuntu 22.04

設定手順

本手順では、Oculus/VR/ScenesフォルダのControllerModelsシーンを編集し、コントローラーからのレーザーでボタンをクリックできるようにします。

手順一覧

  • ボタン
    • ボタンの作成・位置調整
    • Canvasオブジェクトの編集
    • ボタンがクリックされたときの挙動を設定
    • ボタンのコライダー設定
  • GazePointer、SelectionVisualizerオブジェクト
    • GazePointerの編集
    • SelectionVisualizerの編集
  • EventSystem
    • Input Moduleの変更
    • OVR Input Moduleの編集

ボタン

ボタンの作成・位置調整

OVRPlayerController > OVRCameraRig内に、新しくCanvas > Button オブジェクトを追加してください。

Screenshot from 2023-05-27 17-03-28.png

Buttonの位置を、Gameビューで確認しながら、好きな位置に調節してください。最初は大雑把にGameビューで確認できる位置に置いておき、細かい調節は後でVRで確認しながらやるといいかもしれません。

Screenshot from 2023-05-27 17-05-24.png

Canvasオブジェクトの編集

  • Graphic Raycasterコンポーネントのチェックを外してください。
  • OVR Raycasterコンポーネントをアタッチ Pointerに、OVRPlayerController > OVRCameraRig > TrackingSpace > LeftHandAnchor 内のLeftControllerAnchorオブジェクト、もしくはTrackingSpace > RightHandAnchor 内のRightControllerAnchorオブジェクトをセットしてください。どちらにするかは、左右どちらのコントローラーで操作したいか次第です。

Screenshot from 2023-05-27 18-19-09.png

ボタンがクリックされたときの挙動を設定

Buttonオブジェクトに、ボタンがクリックされたときの挙動を記述するためのスクリプトをアタッチしてください。今回は ButtonClick.cs という名前にしました。

Screenshot from 2023-05-27 17-06-26.png

ButtonClick.csの中身は以下です。ボタンがクリックされたら、シーンが切り替わるようにしています。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;

public class ButtonClick : MonoBehaviour
{
    public void OnClick()
    {
        Debug.Log("Button Clicked");
        SceneManager.LoadScene("Oculus/VR/Scenes/Cubes");
    }
}

次に以下のようにして、Buttonオブジェクトがクリックされたときの挙動を追加してください。

ButtonオブジェクトにアタッチされているButtonコンポーネントに、On Click () があるので、その + ボタンを押す

→ ここで作成したButtonオプジェクトを選択

Buttonオブジェクト内の先程作成されたButtonClickスクリプトを選択

OnClick()メソッドを選択

Screenshot from 2023-05-27 17-08-29.png

ボタンのコライダー設定

ボタンがクリックされたことを判定するためにコライダーが必要なので、Box ColliderButtonオブジェクトにアタッチしてください。

Screenshot from 2023-05-27 17-08-52.png

GazePointer、SelectionVisualizerオブジェクト

新しく、GazePointer(子にGazeIconを持つ)とSelectionVisualizerという名前(この名前は他のシーンと統一させるためにこうしていますが、好きに決めて大丈夫です)で、空のオブジェクトを作成してください。

Screenshot from 2023-05-27 17-11-44.png

GazePointerの編集

OVR Gaze Pointerコンポーネントをアタッチ

Ray Transformに、OVRPlayerController > OVRCameraRig > TrackingSpace > LeftHandAnchor 内のLeftControllerAnchorオブジェクト、もしくはTrackingSpace > RightHandAnchor 内のRightControllerAnchorオブジェクトをセットしてください。

Screenshot from 2023-05-27 17-51-42.png

SelectionVisualizerの編集

  • Line Rendererコンポーネントをアタッチ → Width(コントローラーから出るレーザーの幅)を好みの値に設定 → Materialsに好きなマテリアルをセット (レーザーに使用されるマテリアル) Screenshot from 2023-05-27 17-15-27.png
  • OVR Pointer Visualizerコンポーネントをアタッチ → Ray Transformに、OVRPlayerController > OVRCameraRig > TrackingSpace > LeftHandAnchor 内のLeftControllerAnchorオブジェクト、もしくはTrackingSpace > RightHandAnchor 内のRightControllerAnchorオブジェクトをセット → Line Pointerに、先ほど編集したLine Rendererコンポーネントをセット Screenshot from 2023-05-27 18-00-30.png

EventSystem

Input Moduleの変更

以下のように、Input Moduleを変更してください。

  • HierarchyからEventSystemオブジェクトを選択 → Standard Input Module コンポーネントのチェックを外す
  • Add Componentで、OVR Input Moduleスクリプトをアタッチ

OVR Input Moduleの編集

  • Ray Transformに、OVRPlayerController > OVRCameraRig > TrackingSpace > LeftHandAnchor 内のLeftControllerAnchorオブジェクト、もしくはTrackingSpace > RightHandAnchor 内のRightControllerAnchorオブジェクトをセットしてください。
  • Cursorに、先程作成したGazePointerオブジェクトをアタッチしてください。

Screenshot from 2023-05-27 18-04-13.png

  • Joy Pad Click Buttonで、コントローラーのどのボタンが押されたときに、入力を受け付けるかを設定してください。コントローラーから出ているレーザーがボタンにあたっているときに、ここで設定されたコントローラーのボタンが押されると、画面上のボタンが押されたことになります。 Screenshot from 2023-05-27 17-16-58.png

ビルド・実行

PCとQuest Proを接続した状態で、File > Build And Run でビルド・実行してください。

Quest Proで以下のように見えていればOKです。

Screenshot from 2023-05-27 18-51-22.png

コントローラーのレーザーがボタンに当たっている状態で、先程設定したコントローラーのボタンを押して以下のシーンに切り替わると、完璧です。

Screenshot from 2023-05-27 18-53-53.png

sankou

【Oculus Quest2】レーザーポインターでUIと物理オブジェクトを操作する - Qiita