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 オブジェクトを追加してください。

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

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

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

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()メソッドを選択

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

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

GazePointerの編集
OVR Gaze Pointerコンポーネントをアタッチ
→ Ray Transformに、OVRPlayerController > OVRCameraRig > TrackingSpace > LeftHandAnchor 内のLeftControllerAnchorオブジェクト、もしくはTrackingSpace > RightHandAnchor 内のRightControllerAnchorオブジェクトをセットしてください。

SelectionVisualizerの編集
Line Rendererコンポーネントをアタッチ →Width(コントローラーから出るレーザーの幅)を好みの値に設定 →Materialsに好きなマテリアルをセット (レーザーに使用されるマテリアル)
OVR Pointer Visualizerコンポーネントをアタッチ →Ray Transformに、OVRPlayerController > OVRCameraRig > TrackingSpace > LeftHandAnchor内のLeftControllerAnchorオブジェクト、もしくはTrackingSpace > RightHandAnchor内のRightControllerAnchorオブジェクトをセット →Line Pointerに、先ほど編集したLine Rendererコンポーネントをセット
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オブジェクトをアタッチしてください。

Joy Pad Click Buttonで、コントローラーのどのボタンが押されたときに、入力を受け付けるかを設定してください。コントローラーから出ているレーザーがボタンにあたっているときに、ここで設定されたコントローラーのボタンが押されると、画面上のボタンが押されたことになります。
ビルド・実行
PCとQuest Proを接続した状態で、File > Build And Run でビルド・実行してください。
Quest Proで以下のように見えていればOKです。

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