【Oculus Quest】UnityでOculus Touchコントローラーの表示と入力取得

UnityでOculus Quest(オキュラス クエスト)のコントローラをアプリ内に表示する方法とコントローラー入力を取得する方法についてご紹介します。
Oculus Touchコントローラーはタッチセンサーが搭載されているのでボタン押下以外にもタッチしたときのイベントも取得できます。

UnityでOculus Quest用のアプリをビルドするまでの手順や設定などについてはこちらをご確認ください。

Oculus Touch コントローラーの表示

最初にシーンにデフォルトで存在する、MainCameraを削除します。

Unityでデフォルトのカメラの削除

シーンに Oculus > VR > Prefabs 内にある「OVRCameraRig」を追加します。

UnityでOculus用VRカメラを追加

シーンに追加した「OVRCameraRig」を選択して、Inspectorウィンドウを表示します。
「OVR Manager(Script)」のTarget Devices > Quest にチェックが入っていることを確認してください。

Oculus用VRカメラの設定

次に、シーンに配置した「OVRCameraRig」オブジェクトの中身を展開していき、以下の2つのオブジェクトを表示しておきます。

  • OVRCameraRig > TrackingSpace > LeftHandAnchor > LeftControllerAnchor
  • OVRCameraRig > TrackingSpace > RightHandAnchor > RightControllerAnchor
Oculusコントローラのアンカーを表示

Oculus > VR > Prefabs 内にある「OVRControllerPrefab」プレハブを「LeftControllerAnchor」と「RightControllerAnchor」それぞれにドラッグ&ドロップで追加します。

UnityでOculus用コントローラーを追加
UnityでOculus用コントローラーを追加完了

追加した左右のコントローラプレハブ「OVRControllerPrefab」の設定を変更します。

まずは左手用コントローラの設定です。
シーンに存在する OVRCameraRig > TrackingSpace > LeftHandAnchor > LeftControllerAnchor > OVRControllerPrefabのInspectorウィンドウで「OVR Controller Helper(Script)」の「Controller」を「L Tracked Remote」に設定してください。

Oculus用VR左手コントローラの設定

同様に右手用コントローラの設定を行います。
シーンに存在する OVRCameraRig > TrackingSpace > RightHandAnchor > RightControllerAnchor > OVRControllerPrefabのInspectorウィンドウで「OVR Controller Helper(Script)」の「Controller」を「R Tracked Remote」に設定してください。

Oculus用VR右手コントローラの設定

ここまでの変更で実行してみると以下のような実行画面になります。

Oculus Questアプリにコントローラーを表示

Oculus Touch コントローラーの入力を取得する

ボタン押下の取得

以下のようなプログラムで各ボタンを押しているかどうか取得することができます。

if (OVRInput.Get(OVRInput.RawButton.A)) {
    //Aボタンを押しているとき
}
if (OVRInput.Get(OVRInput.RawButton.B)) {
    //Bボタンを押しているとき
}
if(OVRInput.Get(OVRInput.RawButton.X)) {
    //Xボタンを押しているとき
}
if (OVRInput.Get(OVRInput.RawButton.Y)) {
    //Yボタンを押しているとき
}
if (OVRInput.Get(OVRInput.RawButton.RIndexTrigger)) {
    //右人差し指トリガーを押しているとき
}
if (OVRInput.Get(OVRInput.RawButton.RHandTrigger)) {
    //右中指トリガーを押しているとき
}
if (OVRInput.Get(OVRInput.RawButton.LIndexTrigger)) {
    //左人差し指トリガーを押しているとき
}
if (OVRInput.Get(OVRInput.RawButton.LHandTrigger)) {
    //左中指トリガーを押しているとき
}

上記の「OVRInput.Get」関数のほかに、
「OVRInput.GetUp」「OVRInput.GetDown」関数があり、それぞれ「今、ボタンを押した」「今、ボタンを離した」などのボタンの状態が取得できます。

ボタンタッチの取得

中指トリガー以外のボタンはタッチセンサーがあり、ボタンをさわったかどうかも取得できます。
プログラムは以下のように記述します。

if (OVRInput.Get(OVRInput.RawTouch.A))
{
    //Aボタンをタッチしてるとき
}
if (OVRInput.Get(OVRInput.RawTouch.B))
{
    //Bボタンをタッチしてるとき
}
if (OVRInput.Get(OVRInput.RawTouch.X))
{
    //Xボタンをタッチしてるとき
}
if (OVRInput.Get(OVRInput.RawTouch.Y))
{
    //Yボタンをタッチしてるとき
}
if (OVRInput.Get(OVRInput.RawTouch.RIndexTrigger))
{
    //右人差し指トリガーをタッチしてるとき
}
if (OVRInput.Get(OVRInput.RawTouch.LIndexTrigger))
{
    //左人差し指トリガーをタッチしてるとき
}

アナログスティック値の取得

Oculus Touchコントローラのアナログスティックをどれくらい倒しているかを数値で取得することができます。
取得できる数値の範囲は-1~1で、何もさわっていない状態で0が取得できます。

プログラムは以下のように記述します。

Vector2 vectorR = OVRInput.Get(OVRInput.RawAxis2D.RThumbstick);
Vector2 vectorL = OVRInput.Get(OVRInput.RawAxis2D.LThumbstick);

サンプルアプリ

Oculus Touchの入力取得のサンプルに以下を作成しました。

ボタンタッチしたときは黄色
ボタンを押したときは赤色
一番下にはアナログスティックの値を表示しています。

ソースコード

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

public class ContollerEvent : MonoBehaviour
{
    // 確認用GameObject
    public SpriteRenderer A;
    public SpriteRenderer B;
    public SpriteRenderer IndexR;
    public SpriteRenderer MiddleR;
    public TextMesh StickR;

    public SpriteRenderer X;
    public SpriteRenderer Y;
    public SpriteRenderer IndexL;
    public SpriteRenderer MiddleL;
    public TextMesh StickL;


    // Start is called before the first frame update
    void Start()
    {
        
    }

    // Update is called once per frame
    void Update()
    {
        // ボタン状態取得
        CheckButton(OVRInput.RawButton.A, OVRInput.RawTouch.A, A);
        CheckButton(OVRInput.RawButton.B, OVRInput.RawTouch.B, B);
        CheckButton(OVRInput.RawButton.X, OVRInput.RawTouch.X, X);
        CheckButton(OVRInput.RawButton.Y, OVRInput.RawTouch.Y, Y);
        CheckButton(OVRInput.RawButton.RIndexTrigger, OVRInput.RawTouch.RIndexTrigger, IndexR);
        CheckButton(OVRInput.RawButton.LIndexTrigger, OVRInput.RawTouch.LIndexTrigger, IndexL);
        CheckButton(OVRInput.RawButton.RHandTrigger, MiddleR);
        CheckButton(OVRInput.RawButton.LHandTrigger, MiddleL);

        // アナログスティック値取得
        Vector2 vectorR = OVRInput.Get(OVRInput.RawAxis2D.RThumbstick);
        Vector2 vectorL = OVRInput.Get(OVRInput.RawAxis2D.LThumbstick);
        StickR.text = string.Format("({0:0.00},{1:0.00})", vectorR.x, vectorR.y);
        StickL.text = string.Format("({0:0.00},{1:0.00})", vectorL.x, vectorL.y);
    }

    private void CheckButton(OVRInput.RawButton button, OVRInput.RawTouch touch, SpriteRenderer spRender)
    {
        if (OVRInput.Get(button))
        {
            // ボタンを押しているとき
            spRender.color = Color.red;
        }
        else if (OVRInput.Get(touch))
        {
            // ボタンをタッチしているとき
            spRender.color = Color.yellow;
        }
        else
        {
            // ボタンを押してもタッチもしていないとき
            spRender.color = Color.white;
        }
    }

    private void CheckButton(OVRInput.RawButton button, SpriteRenderer spRender)
    {
        if (OVRInput.Get(button))
        {
            // ボタンを押しているとき
            spRender.color = Color.red;
        }
        else
        {
            // ボタンを押していないとき
            spRender.color = Color.white;
        }
    }
}


参考:
https://developer.oculus.com/documentation/unity/latest/concepts/unity-ovrinput/

コメント

  1. […] 【Oculus Quest】UnityでOculus Touchコントローラーを使用するUnityでOculus Quest(オ… […]

タイトルとURLをコピーしました