Help us understand the problem. What is going on with this article?

【Unity】OpenVRで取得できるOculusコントローラー(Touch)のボタン入力

はじめに

公式のマニュアルが分かりづらかったので、備忘録を書いてみました。

OpenVR コントローラーの入力 - Unity マニュアル
https://docs.unity3d.com/ja/2018.4/Manual/OpenVRControllers.html

環境

  • Windows 10 Home
  • Untiy 2019.3.13f1
  • Oculus Desktop 2.38.4
    • Virtual Reality SDKsでOculusを追加すると自動的にインポートしてくれる
  • OpenVR Desktop 2.0.5
    • Virtual Reality SDKsでOpenVRを追加すると自動的にインポートしてくれる
  • Oculus Rift CV1
    • Rift S / QuestのTouchコンも互換あるはずなのでキーマッピングは同じ気がする

調べ方

適当なプロジェクトで下記コードを動かして対応関係を調べた

test.cs
using UnityEngine;

public class test : MonoBehaviour
{
    private void Update()
    {
        // コントローラーのキーマッピングを調べるためのコード
        for (var keyCode = KeyCode.JoystickButton0; keyCode <= KeyCode.JoystickButton19; ++keyCode)
        {
            if (Input.GetKeyDown(keyCode))
            {
                Debug.Log($"{keyCode}が反応しました。");
            }
        }
    }
}

Player Settings -> XR SettingsのVirtual Reality SDKsの設定で、どちらが有効か(上が優先される)で挙動が違いました。

xr.PNG

nkjzm/OpenVR-Oculus-test
https://github.com/nkjzm/OpenVR-Oculus-test

キーマッピング

左がPrimaryで、右がSecondaryです。

oculus_touch.jpg
出典: https://developer.oculus.com/documentation/unity/unity-ovrinput/

Oculusが有効な時

ボタン 説明 インタラクションタイプ KeyCode
Button.One Aボタン 押す JoystickButton0
Button.Two Bボタン 押す JoystickButton1
Button.Three Xボタン 押す JoystickButton2
Button.Four Yボタン 押す JoystickButton3
Axis1D.PrimaryIndexTrigger 左トリガー 押す なし
Axis1D.SecondaryIndexTrigger 右トリガー 押す なし
Axis1D.PrimaryHandTrigger 左グリップ 押す JoystickButton4
Axis1D.SecondaryHandTrigger 右グリップ 押す JoystickButton5
Button.PrimaryThumbstick 左ジョイスティック 押す JoystickButton8
Button.SecondaryThumbstick 右ジョイスティック 押す JoystickButton9
Button.One Aボタン 接触 JoystickButton10
Button.Two Bボタン 接触 JoystickButton11
Button.Three Xボタン 接触 JoystickButton12
Button.Four Yボタン 接触 JoystickButton13
Axis1D.PrimaryIndexTrigger 左トリガー 接触 JoystickButton14
Axis1D.SecondaryIndexTrigger 右トリガー 接触 JoystickButton15
Axis1D.PrimaryHandTrigger 左グリップ 接触 なし
Axis1D.SecondaryHandTrigger 右グリップ 接触 なし
Button.PrimaryThumbstick 左ジョイスティック 接触 JoystickButton16
Button.SecondaryThumbstick 右ジョイスティック 接触 JoystickButton17
Touch.PrimaryThumbRest 左の指置き場 接触 JoystickButton18
Touch.SecondaryThumbRest 右の指置き場 接触 JoystickButton19

トリガーを押した時の入力が取れないのしんどいですね

OpenVRが有効な時

ボタン 説明 インタラクションタイプ KeyCode
Button.One Aボタン 押す JoystickButton1
Button.Two Bボタン 押す JoystickButton0
Button.Three Xボタン 押す JoystickButton3
Button.Four Yボタン 押す JoystickButton2
Axis1D.PrimaryIndexTrigger 左トリガー 押す JoystickButton14
Axis1D.SecondaryIndexTrigger 右トリガー 押す JoystickButton15
Axis1D.PrimaryHandTrigger 左グリップ 押す JoystickButton4
Axis1D.SecondaryHandTrigger 右グリップ 押す JoystickButton5
Button.PrimaryThumbstick 左ジョイスティック 押す JoystickButton8
Button.SecondaryThumbstick 右ジョイスティック 押す JoystickButton9
Button.One Aボタン 接触 なし
Button.Two Bボタン 接触 なし
Button.Three Xボタン 接触 なし
Button.Four Yボタン 接触 なし
Axis1D.PrimaryIndexTrigger 左トリガー 接触 なし
Axis1D.SecondaryIndexTrigger 右トリガー 接触 なし
Axis1D.PrimaryHandTrigger 左グリップ 接触 なし
Axis1D.SecondaryHandTrigger 右グリップ 接触 なし
Button.PrimaryThumbstick 左ジョイスティック 接触 JoystickButton16
Button.SecondaryThumbstick 右ジョイスティック 接触 JoystickButton17
Touch.PrimaryThumbRest 左の指置き場 接触 なし
Touch.SecondaryThumbRest 右の指置き場 接触 なし

対応していない入力が増えます。AB, XYの対応関係が逆になる点に注意です。

使い方

// OpenVRが有効な状態でAボタンを押す場合
if (Input.GetKeyDown(KeyCode.JoystickButton1))
{
    // do something
}

シンプルな方法でアクセスできるのは、やはり便利そうですね。

最後に

間違ってたり漏れがあったら教えてください。

nkjzm
特に明示されていない場合、記事中のソースコードはパブリックドメインです。 月額制のメンターサービスで初心者向けの開発サポートをしているので、分からないことがあれば是非こちらで質問してください! → https://menta.work/plan/1115
https://nkjzm.github.io/
unity-game-dev-guild
趣味・仕事問わずUnityでゲームを作っている開発者のみで構成されるオンラインコミュニティです。Unityでゲームを開発・運用するにあたって必要なあらゆる知見を共有することを目的とします。
https://unity-game-dev-guild.github.io/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした