SteamVR Plugin 2.0 Input取得・入力関連スクリプト読み解き

# はじめに
* この記事はSteamVR Plugin 2.0でのコントローラーの入力取得するためのHow toをまとめました。
* SteamVR Pluginでコントローラーの入力を取るところだけ取り扱っています。

# 開発環境
* Windouws 10 x64
* Unity v2018.2.11f1
* Visual Studio 2017 v15.8.6
* SteamVR Plugin v2.0.1

# セットアップ
* こちらからどうぞ
* SteamVR Plugin 2.0 セットアップ・サンプルシーンを動かすまでの備忘録
    * https://qiita.com/kyourikey/items/5967018e613b2fd49a1f
* この記事は上記の設定が終わっている所から始まっています。

# 本題
## 入力方法その1
* まず足がかりとして、こちら
* https://twitter.com/korinVR/status/1026088484195336193

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">SteamVR Unity Plugin 2.0 RC2のドキュメントがアグレッシブで笑ってる <a href="https://t.co/sxFhczoX9H">pic.twitter.com/sxFhczoX9H</a></p>&mdash; こりんVR＠デジゲー博N3-58 (@korinVR) <a href="https://twitter.com/korinVR/status/1026088484195336193?ref_src=twsrc%5Etfw">2018年8月5日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

* SteamVR Pluginのドキュメントpdfです。

### とりあえず動作確認
* GrabAction.GetStateを確認します。

```csharp
using UnityEngine;
using Valve.VR;

public class SteamVRInputTest : MonoBehaviour
{
    public SteamVR_Input_Sources HandType;
    public SteamVR_Action_Boolean GrabAction;

    void Update ()
	{
	    if (GrabAction.GetState(HandType))
	    {
	        Debug.Log(GrabAction.ToString());
	    }
	}
}
```

![image.png](https://qiita-image-store.s3.amazonaws.com/0/291107/ab529df6-69f0-0276-12c3-1a657b6261bc.png)

* SteamVR_Input_SourcesをAnyに設定(そのまま)

* SteamVR_Action_BooleanをGrabGripに設定。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/291107/d89a3dd5-9b09-6758-945a-2e18cacb0695.png)

* 実行してコントローラーのグリップを握ると・・・
* 取れました。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/291107/0d3c83ba-89ac-775e-812d-06d8405036e3.png)

### SteamVR_Input_Sources
* コントローラーのどちらかの手、もしくは両手とも判定を行うかどうかを指定するための物ですね。

```csharp
//======= Copyright (c) Valve Corporation, All rights reserved. ===============
public enum SteamVR_Input_Sources
{
    [Description("/unrestricted")] //todo: check to see if this gets exported: k_ulInvalidInputHandle 
    Any,

    [Description("/user/hand/left")]
    LeftHand,

    [Description("/user/hand/right")]
    RightHand,
}
```

### SteamVR_Action_Boolean
* SteamVR_Action_〇〇〇〇は、アクションの状態を取ってくるための物みたいですね

* ドキュメントから。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/291107/3ed6e026-6b2e-9789-7534-6e88171b5a29.png)

* SteamVR > Inputフォルダから確認できます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/291107/2d3fb90f-20ec-19f5-6200-a47e0d9780e0.png)

* とりあえず動かす事が出来ました。
* ドキュメントを読み進めて行くと、似たような形でもっと簡単に取れそうでした。

## 入力方法その2
* 入力方法その2と書きましたが、実際にはActionの取得方法が違うだけで入力の取得方法は共通です。
* ドキュメントから。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/291107/b4034ebd-7505-dba0-55b9-ceab90ec817e.png)

* スクリプトだけで取得できます。
* 今までのSteamVR_TrackedObjectとSteamVR_Controllerでデバイス取ってから実際の入力取るまでの、面倒な数行がきれいさっぱり1行になって良さそうですね。

### 実際に動かしてみる

```csharp
public class SteamVRInputTest : MonoBehaviour
{
    public SteamVR_Input_Sources HandType;

    void Update ()
    {
        if (SteamVR_Input._default.inActions.GrabGrip.GetStateUp(HandType))
        {
            Debug.Log("GrabGrip.GetStateUp");
        }
    }
}
```
* 簡単に取れました！

![image.png](https://qiita-image-store.s3.amazonaws.com/0/291107/517a2093-0c8a-22ab-2cbf-3844f7e3652f.png)

* Gripを握って、離した瞬間に出ました。
* 名前の付け方から見てInput.GetKeyUpと同じような使い方ですね。

* 以下のスクリプトで同じように取得できるのを確認しました。

```csharp
public class SteamVRInputTest : MonoBehaviour
{
    public SteamVR_Input_Sources HandType;

    void Update ()
    {
        if (SteamVR_Input._default.inActions.GrabGrip.GetStateUp(HandType))
        {
            Debug.Log("GrabGrip.GetStateUp");
        }
        if (SteamVR_Input._default.inActions.GrabGrip.GetStateDown(HandType))
        {
            Debug.Log("GrabGrip.GetStateDown");
        }

        if (SteamVR_Input._default.inActions.GrabGrip.GetState(HandType))
        {
            Debug.Log("GrabGrip.GetState = true");
        }
        else
        {
            Debug.Log("GrabGrip.GetState = false");
        }
    }
}
```

* GetStateUp
    * 操作ボタンを離したときだけtrueが帰る。それ以外はfalse。
    * trueが帰ってくるのは1フレームのみ。
* GetStateDown
    * 操作ボタンを押下した時だけtrueが帰る。それ以外はfalse。
    * trueが帰ってくるのは1フレームのみ。
* GetState
    * 押されてればtrue、押されてなければfalseが帰る。

* GrabGripの部分をTeleportやGrabPinchに変更すれば、その入力を取ることが出来ました。

```csharp
if (SteamVR_Input._default.inActions.Teleport.GetStateUp(HandType))
{
    Debug.Log("Teleport.GetStateUp");
}
```

![image.png](https://qiita-image-store.s3.amazonaws.com/0/291107/5b9378d8-4665-e00a-69d3-c7ec98be7dbd.png)

* デフォルトのキーバインドだとトラックパッドのクリックを離すタイミングでログが出ます。

# おわりに
* これで、最低限SteamVR Plugin 2.0の入力が取れるようになったと思います。
* 以前と比べるとシンプルで、良いですね。