LoginSignup
14
12

More than 5 years have passed since last update.

SteamVR PluginのInputEventをUniRxで扱えるようにするAsset作った

Last updated at Posted at 2017-01-16

はじめに

最近SteamVR Pluginを触り始めたのですが、コントローラ周りの入力イベントの取得方法が煩雑で使いにくくイライラしていました。なのでこの入力イベントを扱いやすくするためのAssetを作成しました。

SteamVRInputObservables

導入方法

SteamVRInputObservables (github)からダウンロードし、インポートしてください
また、動作にはUniRxも別途必要となるためこちらもインポートしてください

使い方

  1. 管理用のPrefab SteamVRInputObservables/Resouces/SteamVREventTrigger をシーンに配置して下さい
  2. SteamVREventTriggerのInspectorViewより、Left ControllerRight Controllerを設定して下さい inscpector.png
  3. イベントを取得したい場所でusing SteamVRInputObservables を追加してください
  4. ObservableSteamInput.XXXXX または this.XXXXAsObservable() の形式でストリームを取得できるようになります
イベントの取得方法
using SteamVRInputObservables;
using UniRx;
using UnityEngine;

namespace SteamVRInputObservablesSample
{
    public class InputTest : MonoBehaviour
    {
        void Start()
        {
            ObservableSteamInput.OnRightTouchPadTouchDown()
                .Subscribe(_ => Debug.Log("Right TouchPad Down"))
                .AddTo(this);

            ObservableSteamInput.OnLeftTouchPadTouchDown()
                .Subscribe(_ => Debug.Log("Left TouchPad Down"))
                .AddTo(this);

            this.OnRightTouchPadTouchDownAsObservable()
                .Subscribe(_ => Debug.Log("Right TouchPad Down"));

            this.OnLeftTouchPadTouchDownAsObservable()
                .Subscribe(_ => Debug.Log("Left TouchPad Down"));
        }
    }
}

ストリームの取得方法は ObservableSteamInput.XXXXXthis.XXXXAsObservable()の2種類がありますが、それぞれ挙動が違います

  • ObservableSteamInput.XXXXXの方 : ViveControllerのGameObjectが破棄されない限り動作し続けるストリームを提供する
  • this.XXXXAsObservable()の方 : thisが指すコンポーネントがDestroyされた時に自動的に停止するストリームを提供する

より安全に使いたい場合はthis.XXXXAsObservable()の方で、永続的なストリームやMonoBehaviour外からイベントを取得したい場合はObservableSteamInput.XXXXXを使って下さい

できること

入力イベントを取得する

入力イベントの取得

//Trigger Press
this.OnRightTriggerPressDownAsObservable()
    .Subscribe(_ => Debug.Log("Right Trigger PressDown"));
this.OnRightTriggerPressUpAsObservable()
    .Subscribe(_ => Debug.Log("Right Trigger PressUp"));

//Trigger Touch
this.OnRightTriggerTouchDownAsObservable()
        .Subscribe(_ => Debug.Log("Right Trigger TouchDown"));
this.OnRightTriggerTouchUpAsObservable()
    .Subscribe(_ => Debug.Log("Right Trigger TouchUp"));

//TouchPad Press
this.OnRightTouchPadPressDownAsObservable()
    .Subscribe(_ => Debug.Log("Right TouchPad PressDown"));
this.OnRightTouchPadPressUpAsObservable()
    .Subscribe(_ => Debug.Log("Right TouchPad PressUp"));
this.RightTouchPadPress()
    .Subscribe(x => Debug.Log("Right TouchPad Press:" + x));

//TouchPad Touch
this.OnRightTouchPadTouchDownAsObservable()
        .Subscribe(_ => Debug.Log("Right TouchPad TouchDown"));
this.OnRightTouchPadTouchUpAsObservable()
    .Subscribe(_ => Debug.Log("Right TouchPad TouchUp"));

//ApplicationMenu Press
this.OnRightApplicationMenuPressDownAsObservable()
    .Subscribe(_ => Debug.Log("Right Application PressDown"));
this.OnRightApplicationMenuPressUpAsObservable()
    .Subscribe(_ => Debug.Log("Right Application PressUp"));
this.RightApplicationMenuPress()
    .Subscribe(x => Debug.Log("RightApplicationMenu:" + x));

//Grip Press
this.OnRightGripPressDownAsObservable()
        .Subscribe(_ => Debug.Log("Right Application PressDown"));
this.OnRightGripPressUpAsObservable()
    .Subscribe(_ => Debug.Log("Right Application PressUp"));

入力イベントをReactivePropertyで扱う

ReactivePropertyのもの
this.RightTriggerPress()
    .Subscribe(x => Debug.Log("Right Trigger Press:" + x));

this.RightTouchPadPress()
    .Subscribe(x => Debug.Log("Right TouchPad Press:" + x));

this.RightApplicationMenuPress()
    .Subscribe(x => Debug.Log("RightApplicationMenu:" + x));

this.RightGripPress()
    .Subscribe(x => Debug.Log("RightGrip:" + x));

タッチパッドに触れている座標の取得

タッチパッドの触れている座標
//ReactiveProperty<Vector2>
this.RightTouchPosition()
    .Subscribe(x => Debug.Log("Right TouchPad Position:" + x));

トリガーの引き具合

トリガーの引き具合
//ReactiveProperty<float>
this.RightTriggerValue()
    .Subscribe(x => Debug.Log("Right Trigger Value:" + x));

ライセンス

MITです

最後に

とりあえず勢いで作ったものなので、自分で使ってみて様子をみて改良していきます

14
12
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
14
12