Unity の SteamVR Plugin 2.0 を使って コントローラーの入力をスクリプトで受け取る

## 前提

 - SteamVRのプラグインを入れている。
 - VRのヘッドセットが接続されている。

## SteamVRのコントローラーの入力をスクリプトで取得するための手順

VRコントローラーから入力を得るには、以下の工程を踏む。

1. Action Set を作成する
2. Binding を設定する
3. スクリプトを作成
4. スクリプトに合わせ、Inspectorを調整する


### 1. Action Setを作成する

まず、取得するコントローラー操作の一覧を作成する。

#### 1.1 SteamVR Inputのページを開く 

Window > SteamVR Input で開くことができる。

#### 1.2 新しい Action Set を作成する

Action Setsの右にある [+] を押し、
適当な名前を作成する。

#### 1.3 Action を設定する

Actions の In の欄にある [+] を押し、
取得したい Input を入れる。

Type は、boolean・vector2 が多い。
`boolean` は、menuボタンやtriggerなどで、
`vector2` は、アナログスティックなどで利用する。

![キャプチャ](https://user-images.githubusercontent.com/16476314/90266652-45258d80-de8f-11ea-8ab5-a02e13551831.PNG)
図１：設定が終わったAction Setの例

#### 1.4 設定を保存する

`Save and generate` を押して、設定を保存する。

### 2. Binding を設定する

#### 2.1 Binding の設定画面を開く

SteamVR Input の画面の右下にある `Open binding UI` を押す。
新しいWidowが開くので、[現在のバインド] の [編集] を押す。

![tempsnip](https://user-images.githubusercontent.com/16476314/90273647-414b3880-de9a-11ea-8811-c13d07b1c57c.png)
図２：Open binding UIを押した際に開くBindingの画面

#### 2.2 設定する Action Set のタブに切り替える

コントローラーの画面が出てくる。
上のタブに 1.2 で設定した名前のタブを開く。

#### 2.3 ボタンに割り当てを行う

この画面で、各ボタンやスティックから入力を受け取るときの名前を割り当てる。
[+] で割り当てを追加できる。

ボタンやトリガーの場合は、クリックを選び、
スティックなど、二次元の値を取得するような場合は、位置を選ぶ。
ここで、1.3 で作成したActionを割り当てる。

![キャプチャ1](https://user-images.githubusercontent.com/16476314/90276158-6fcb1280-de9e-11ea-9288-e32aa19feb0a.PNG)
図３：割り当てた後の例

#### 2.4 設定を保存する

割り当てが終わったら、 [個人用バインドを保存] を押し、設定を保存する。

## 3. スクリプトを作成

スクリプトをアタッチするオブジェクトは
コントローラーの入力を取得するためのスクリプトの例は、以下のようになる。

```Csharp
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Valve.VR;
using UnityEngine.UI;

public class ControllerScript : MonoBehaviour
{
    // action set
    public SteamVR_ActionSet playerOperationActionSet;
    // 取得する手（右手か左手か任意の手）
    public SteamVR_Input_Sources handTypeL;
    public SteamVR_Action_Vector2 AnalogStickLeft;
    public SteamVR_Action_Boolean LeftTrigger;

    public GameObject player;
    public float speed;

    void Start()
    {
        playerOperationActionSet.Activate();
    }

    void Update()
    {
        Vector2 stickVector = AnalogStickLeft.GetAxis(handTypeL);
        player.transform.position += speed * new Vector3(stickVector.x, 0, stickVector.y);
        Debug.Log("stickVector: "+ stickVector.x+": "+stickVector.y);
        Debug.Log("tringger: " + LeftTrigger.GetState(handTypeL));
    }

}
```

必要な要素は以下。

 - ActionSetを1.2で作成したものに設定し、有効化する
 - SteamVR_Input_Sources を設定
 - 1.3 で設定した Action を宣言
 - 取得する

### 3.1 ActionSetを1.2で作成したものに設定し、有効化する

`SteamVR_ActionSet.Activate();` で有効にできる。
これを有効化することで、値を取得することができる。

### 3.2 SteamVR_Input_Sources を設定

SteamVR_Input_Sources を設定する。
どちらの手のコントローラーかを表す。

### 3.3 1.3 で設定した Action を宣言

1.3 で、booleanを設定したものは、`SteamVR_Action_Boolean`
vector2にしたものは、`SteamVR_Action_Vector2` で定義できる。

### 3.4 取得する

booleanは、`SteamVR_Action_Boolean.GetState(SteamVR_Input_Sources)`
vector2は、`SteamVR_Action_Vector2.GetAxis(SteamVR_Input_Sources)`
で取得することができる。

## 4. スクリプトに合わせ、Inspectorを調整する

3. に書いたスクリプトの変数を Inspector で設定する。

### 4.1 SteamVR_Input_Sources
左のコントローラーを使いたいので、 LeftHand を設定。

### 4.2 SteamVR_ActionSet 
1.2 で設定した Action Set を選ぶ。

### 4.3 SteamVR_Action_hoge
1.3 で設定した割り当てをここに当てはめる。


![キャプチャ3](https://user-images.githubusercontent.com/16476314/90281205-2e8b3080-dea7-11ea-89f1-e3f82297656e.PNG)