Edited at

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

More than 1 year has passed since last update.


はじめに

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


SteamVRInputObservables


導入方法

SteamVRInputObservables (github)からダウンロードし、インポートしてください

また、動作にはUniRxも別途必要となるためこちらもインポートしてください


使い方


  1. 管理用のPrefab SteamVRInputObservables/Resouces/SteamVREventTrigger をシーンに配置して下さい


  2. SteamVREventTriggerのInspectorViewより、Left ControllerRight Controllerを設定して下さい


  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です


最後に

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