[Unity]SteamVR Plugin v2.2でviveのタッチパッドを使ってみる

steamVR Pluginを触り始めたとき何が何だか分からなかったので書きます。
拙い点もあると思いますがよろしくお願いします。
参考
[SteamVR Unity Plugin v2.2.0でのインプット](https://qiita.com/sakano/items/d87a9b11c23a9bbe166f)
##入力について##
steamVR Plugin 2.2では元から設定されている入力があったり、なかったりします。
例としては、
InteractUI : グリップの部分
Teleport : タッチパッドのボタン
GrabPinch : グリップの部分
GrabGrip : 側面のボタン
などがすでに設定されています。
![sgdhjgjdhdghjf.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/299484/e262ba04-35e5-c89c-8915-f0e84ffb7bff.png)
　
![sfgjsfgjsfjg.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/299484/106aba64-5e6b-8087-20fc-fd7e25ed2100.png)
(SteamVR_Input_Actions.csの中身)

##設定の追加##
タッチパッドの位置の入力は設定されていないので追加する必要があります。

追加するには2工程ほどあり、
①SteamVR Inputに追加
②入力バインドで追加
をしなければいけません。

###SteamVR Input###
UnityのWindow →　SteamVR Input で開けます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/299484/6a1cc9b2-96da-530d-1399-b71dbbb41fe6.png)
下の画像のように ActionsのInで+を押して新たな入力を追加します。
名前はTrackPadとしています。
この入力はｘ軸とｙ軸で与えられるためTypeをvector2にする必要があります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/299484/db2414a6-c1e8-8df9-1064-04145ddf805b.png)
追加出来たら左下のSave and generate を押します。

###入力バインド###
SteamVR Inputで作成できたので入力バインドで設定をします。
SteamVR Inputウィンドウの右下にあるOpen binding UI を押します。
下の画像のようなウィンドウが表示されるので 編集 を押します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/299484/11027759-e78d-1e20-101c-48ab1b7f5094.png)
下の画像のように表示されたらトラックパッドのところで＋を押します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/299484/89fb0084-67f3-119e-a441-5ff540934278.png)
以下のように設定していきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/299484/da3ad800-9b73-f744-f09b-bd61949c6652.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/299484/7c40794d-44a1-4bc9-7c00-80a5300bf252.png)
最後に 個人用バインドを保存 を押して追加完了です。

##入力テスト##
pad_test1.csというスクリプトを作成してテストしてみます。

```csharp
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Valve.VR;

public class pad_test1 : MonoBehaviour {
    private SteamVR_Action_Vector2 TrackPad = SteamVR_Actions.default_TrackPad;

    private Vector2 pos;
    // Use this for initialization
    void Start () {

	}
	
	// Update is called once per frame
	void Update () {
            pos = TrackPad.GetLastAxis(SteamVR_Input_Sources.RightHand);
            Debug.Log(pos.x +" " + pos.y);
	}
}
```
結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/299484/6cf32592-2c20-cef8-1d8b-8b0c870edb41.png)
ｘ座標とｙ座標が表示されました。

次に適当にキューブを動かしてみます。

```csharp
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Valve.VR;

public class pad_test1 : MonoBehaviour {
    private SteamVR_Action_Vector2 TrackPad = SteamVR_Actions.default_TrackPad;

    private Vector2 pos;
    // Use this for initialization
    void Start () {

	}
	
	// Update is called once per frame
	void Update () {
        pos = TrackPad.GetLastAxis(SteamVR_Input_Sources.RightHand);
        transform.localPosition = new Vector3( pos.x * 0.1f,0, pos.y * 0.1f);
    }
}
```
ヒエラルキーで右手にキューブを追加してスクリプトを付けます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/299484/1e2a4c13-71fb-13fa-7896-85764643ba19.png)
パッドをぐりぐり動かしてみるとキューブも動きました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/299484/081174c6-2a18-5d9c-7f63-8a239c64c3ef.png)

##極座標表示にする##
極座標についての簡単な図
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/299484/95955d8e-73d0-f08e-4319-a9e4a1d19e0b.png)
まず極座標にして何が嬉しいか を説明します。
今回の場合で言うと、
・パッドを３分割してそれぞれの処理をしたい場合、θを使えば簡単になる
　　if分の条件で0<θ<120°のようにすることができます。
　　x,yで表した場合は少し難しいことになります。
・ｒを使うことで中心からどれだけ離れているかがわかりやすい
　　x,yで表した場合は縦か横の場合にしかわかりませんね。
　　中心から0.7以上離れた場合などを考えたい場合などに便利です。

コードは以下のようになります。

```csharp
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Valve.VR;

public class pad_test1 : MonoBehaviour {
    private SteamVR_Action_Vector2 TrackPad = SteamVR_Actions.default_TrackPad;

    private Vector2 pos;
    float r,sita;
    // Use this for initialization
    void Start () {

	}
	
	// Update is called once per frame
	void Update () {
        pos = TrackPad.GetLastAxis(SteamVR_Input_Sources.RightHand);
        transform.localPosition = new Vector3( pos.x * 0.1f,0, pos.y * 0.1f);
        r = Mathf.Sqrt(pos.x* pos.x + pos.y* pos.y);
        sita = Mathf.Atan2(pos.y, pos.x) / Mathf.PI * 180;

        Debug.Log(r +" "+ sita );
	}
}
```
(クソダサ変数 sita (θ))
結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/299484/441dd21a-3ec7-161d-11b3-6dc0438be4f6.png)

ちゃんと表示されました。
トラックパッドの下側だと角度がマイナスになってしまいます。
気になる人は初期値として+180をしましょう。

式は以下の通りです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/299484/baeacad4-b7aa-5129-861f-2947a8a00c09.png)
プログラムではAtanが２種類あるので気をつけましょう。
角度は式のまんまだとRad表示になるのでDegに変換するために、3.14で割って180で掛けています。