Meta XR SDKでハンドデバイスからの入力を取得する方法

こんにちは、くのへ@MasazaneKunoheです。

VRゲームと言えばガンシューティングゲームのようなものが面白そうですね。
ハンドデバイスのトリガーをONした時に、弾が出ればガンシューティングの出来上がりです。
今日はハンドデバイスのボタン・十字キー入力の取得方法を解説します。
なお、この記事はUnityの基礎知識(PrefabとかInstantiateとか)は知っている前提の記事です。

サンプルコード

Meta XR SDKでハンドデバイスのボタン入力の取得方法を解説します。

結論から言えば、次のサンプルコードにより、右手のトリガー(人差し指のボタン)を引くと、アタッチしたオブジェクトの位置(:例えば右手)から「prefab」に設定したオブジェクトがinstantiateで複製されて発射されます。

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

public class BallSpawner : MonoBehaviour
{
    public GameObject prefab;
    public float spawnSpeed = 5;
    
    // Update is called once per frame
    void Update()
    {
        if(OVRInput.GetDown(OVRInput.Button.SecondaryIndexTrigger))
        {
            GameObject spawnBall = Instantiate(prefab, transform.position, Quaternion.identity);
            Rigidbody spawnBallRB = spawnBall.GetComponent<Rigidbody>();
            spawnBallRB.velocity = transform.forward*spawnSpeed;
        }
    }
}

コードのポイントは黄色ハイライト部であり、ここで右手のハンドデバイスのトリガーを引く入力を取得しています。
特に太字アンダースコアが重要で、ここが右手のハンドデバイスのトリガーを指しています。

このように「OVRInput」を使ってハンドデバイスの入力を取得できます。

ハンドデバイスのマッピングについて

前述の通り「OVRInput」の後にハンドデバイスの所定のボタンを指定すれば、そのボタンのON/OFFを取得できます。

このボタンがどのような名称になっているのか、図に表したもの(マッピング)がMeta社の公式ページにあります。こちらです。

この中の次の3つの図(マッピング)が重要であり、これと後述の入力を取得するコード例を見れば、ハンドデバイスの入力を使えるようになります。

図① 基本的なボタンのマッピング

例えば右手のトリガーは「Axis1D.SecondaryIndexTrigger」になっていますね。
アナログ値を取得したい場合は「OVRInput.Axis1D.SecondaryIndexTrigger」で取得でき、ON/OFFを取得したい場合は「OVRInput.Button.SecondaryIndexTrigger」で取得できます。

図② こちらもOKのマッピング

こちらでも取得できます。
例えば右手のトリガーは「RawAxis1D.RIndexTrigger」になっていますね。
アナログ値を取得したい場合は「OVRInput.RawAxis1D.RIndexTrigger」で取得でき、ON/OFFを取得したい場合は「OVRInput.Button.RIndexTrigger」で取得できます。

図③ 左右のハンドデバイスが未設定の場合のマッピング

左右のハンドデバイスが未設定の場合(:例えば片方のハンドデバイスが電池が無いなど)の名称がこちらです。
基本的には、この図の名前で指定しない方が良いかなと思います。
例えば、A,Xボタンが「Button.One」、B,Yボタンが「Button.Two」という共通名称になっていますね。
なので、「OVRInput.Button.One」と書けば、AボタンもXボタンもどちらも抽出できます。ただし、片方のハンドデバイスが使えない時限定です
図①を見ると、右手のA,Bボタンが「Button.One」「Button.Two」になっているため、左右のハンドデバイスが生きた時には、左手のX,Yボタンは「Button.Three」「Button.Four」に代わります(つまりButton.One、Button.Twoと書いているとX,Yボタンを押しても反応しません)。
そのため、左手のX,Yボタンを使うことを決めている時は、図③を参照して「Button.One」「Button.Two」と書くのではなく、図①を参照して「Button.Three」「Button.Four」と書いた方が良いと思います。

ただし、図③の名称で確実に左右のハンドデバイスを指定する方法があります。
次のサンプルコードのように、OVRInput.GetDownの第2引数を使い、LTouch(左コントローラ)、RTouch(右コントローラ)を指定する方法です。

if(OVRInput.GetDown(OVRInput.Button.One, OVRInput.Controller.LTouch))

上記のコードは第2引数で左コントローラを指定しているので、Xボタンが押された時に動作します。

入力を取得するコード例

各種ボタン操作は図①と図③がかぶっているものがあるので、図②をベースに書いた方が良いかもです。(でも、まあ、結局は好みの問題だと思います。この記事の文頭のサンプルも図①パターンで書いてるしね。ガハハ。)

各種ボタンのON/OFF

if (OVRInput.GetDown(OVRInput.RawButton.A))
{
  //Aボタン
}
if (OVRInput.GetDown(OVRInput.RawButton.B))
{
  //Aボタン
}
if (OVRInput.GetDown(OVRInput.RawButton.X))
{
  //Xボタン
}
if (OVRInput.GetDown(OVRInput.RawButton.Y))
{
  //Yボタン
}
if (OVRInput.GetDown(OVRInput.RawButton.Start))
{
  //左手メニュボタン
}

if (OVRInput.GetDown(OVRInput.RawButton.RIndexTrigger))
{
  //右手トリガー
}
if (OVRInput.GetDown(OVRInput.RawButton.RHandTrigger))
{
  //右手中指グリップ
}
if (OVRInput.GetDown(OVRInput.RawButton.LIndexTrigger))
{
  //左手トリガー
}
if (OVRInput.GetDown(OVRInput.RawButton.LHandTrigger))
{
  //左手中指グリップ
}

トリガーのアナログ値を取得する

// 右手トリガー
float rTrigger1 = OVRInput.Get(OVRInput.RawAxis1D.RIndexTrigger);
// 右手中指グリップ
float rTrigger2 = OVRInput.Get(OVRInput.RawAxis1D.RHandTrigger);
// 左手トリガー
float lTrigger1 = OVRInput.Get(OVRInput.RawAxis1D.LIndexTrigger);
// 左手中指グリップ
float lTrigger2 = OVRInput.Get(OVRInput.RawAxis1D.LHandTrigger);

十字キーのON/OFF

if (OVRInput.GetDown(OVRInput.RawButton.LThumbstickUp))
{
  //左手の十字キー「上」
}
if (OVRInput.GetDown(OVRInput.RawButton.LThumbstickDown))
{
  //左手の十字キー「下」
}
if (OVRInput.GetDown(OVRInput.RawButton.LThumbstickLeft))
{
  //左手の十字キー「左」
}
if (OVRInput.GetDown(OVRInput.RawButton.LThumbstickRight))
{
  //左手の十字キー「右」
}

if (OVRInput.GetDown(OVRInput.RawButton.RThumbstickUp))
{
  //右手の十字キー「上」
}
if (OVRInput.GetDown(OVRInput.RawButton.RThumbstickDown))
{
  //右手の十字キー「下」
}
if (OVRInput.GetDown(OVRInput.RawButton.RThumbstickLeft))
{
  //右手の十字キー「左」
}
if (OVRInput.GetDown(OVRInput.RawButton.RThumbstickRight))
{
  //右手の十字キー「右」
}

十字キーのアナログ値を取得する

// 左手の十字キーのアナログ値
Vector2 stickL = OVRInput.Get(OVRInput.RawAxis2D.LThumbstick);
// 右手の十字キーのアナログ値
Vector2 stickR = OVRInput.Get(OVRInput.RawAxis2D.RThumbstick);


今日はMeta XR SDKでハンドデバイスからの入力を取得する方法を解説しました。

Unity標準のXR Interaction Toolkitのハンドデバイス設定は、この記事でも解説した通り、Input Actionsという設定を行うのですが、Meta XR SDKはすでにOVRInputというクラスがあり、簡単に設定出来て便利ですね~。

ではまた別の記事で会いましょう。
ではでは~

🦅バサバサ~