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

#はじめに

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


#SteamVRInputObservables

## 導入方法

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

## 使い方

1. 管理用のPrefab `SteamVRInputObservables/Resouces/SteamVREventTrigger` をシーンに配置して下さい
2. `SteamVREventTrigger`のInspectorViewより、`Left Controller`と`Right Controller`を設定して下さい
![inscpector.png](https://qiita-image-store.s3.amazonaws.com/0/47146/43b9d163-af0c-aaca-e78a-7554d3a23af3.png)
3. イベントを取得したい場所で`using SteamVRInputObservables` を追加してください
4. `ObservableSteamInput.XXXXX` または `this.XXXXAsObservable()` の形式でストリームを取得できるようになります

```csharp:イベントの取得方法
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`を使って下さい

## できること

### 入力イベントを取得する

```csharp:入力イベントの取得

//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で扱う

```csharp: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));
```

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

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

## トリガーの引き具合

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

#ライセンス

MITです

#最後に

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