🥽

VIVE Flow のInput周りを調べた

2021/11/28に公開

基本のセットアップ方法は前回のVIVE FlowのUnity環境構築してCubeを表示するまでを読んでください。

ボタン周りの取得方法を一つずつ調べたので軽くまとめておきます。

基本はこのページを参考にしてます。
WaveVR Button Usage

UnityEngine.XRを利用してます。

シーンの作成

ボタン入力を表示するためにTextを3つ配置しました。

InputTest.cs というC#スクリプトを作成して適当なGameObjectにアタッチしました。

スクリプト

ボタン入力を取得してテキストにそのステータスを表示するスクリプトを作成しました。

using UnityEngine;
using UnityEngine.XR;
using UnityEngine.UI;

public class InputTest : MonoBehaviour
{
    [SerializeField]
    private Text _text = null;

    [SerializeField]
    private Text _text_1 = null;

    [SerializeField]
    private Text _text_2 = null;

    private void Update()
    {
        InputDevice inputDevice = InputDevices.GetDeviceAtXRNode(XRNode.RightHand);

        if (inputDevice.isValid)
        {
            bool isPrimary2DAxisClicked;
            if (inputDevice.TryGetFeatureValue(CommonUsages.primary2DAxisClick, out isPrimary2DAxisClicked) && isPrimary2DAxisClicked)
            {
                _text.text = "p2d clicked!";
            }
            else
            {
                _text.text = "p2d not clicked!";
            }

            bool isTrigger;
            if (inputDevice.TryGetFeatureValue(CommonUsages.triggerButton, out isTrigger) && isTrigger)
            {
                _text_1.text = "trigger clicked!";
            }
            else
            {
                _text_1.text = "trigger not clicked!";
            }

            bool isMenu;
            if (inputDevice.TryGetFeatureValue(CommonUsages.menuButton, out isMenu) && isMenu)
            {
                _text_2.text = "menu clicked!";
            }
            else
            {
                _text_2.text = "menu not clicked!";
            }
        }
    }
}

動作確認

小さくて見にくいですがコントローラとして入力に使用しているスマホをタップした瞬間のみテキストが更新されています。
https://youtu.be/k0BffWZ5hWM

スマホは上下左右に4分割されておりUnityのXR入力との対応関係が以下の画像のように設定されているようでした。

ちなみにコードから分かるようにコントローラの取得は XRNode.RightHand として取得出来ました。

こちらの記事WaveVR Button Usageでも記載されているように

primaryButton
primaryTouch
secondaryButton
secondaryTouch
...

などはボタンとして存在しないため取得も出来ないようです

追記

InputHandler作成してタップとスワイプを取得、delegateで取得できるようにしました。
GitHubでそのプロジェクト公開しました。
https://youtu.be/rIKnftGUCaU

Discussion