#はじめに
最近SteamVR Pluginを触り始めたのですが、コントローラ周りの入力イベントの取得方法が煩雑で使いにくくイライラしていました。なのでこの入力イベントを扱いやすくするためのAssetを作成しました。
#SteamVRInputObservables
導入方法
SteamVRInputObservables (github)からダウンロードし、インポートしてください
また、動作にはUniRxも別途必要となるためこちらもインポートしてください
使い方
- 管理用のPrefab
SteamVRInputObservables/Resouces/SteamVREventTrigger
をシーンに配置して下さい -
SteamVREventTrigger
のInspectorViewより、Left Controller
とRight Controller
を設定して下さい
- イベントを取得したい場所で
using SteamVRInputObservables
を追加してください -
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.XXXXX
と this.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です
#最後に
とりあえず勢いで作ったものなので、自分で使ってみて様子をみて改良していきます