#5「VIVEコントローラのボタン入力を取得する」【初心者】HTC VIVE Pro Eyeを使ってUnityでVRの開発を行ってみる．

[前回](https://qiita.com/RyoyaHase/items/0dab278b080f517032a0)までで開発環境の設定ができたので実際にプログラミングしていく．今回はボタンが押されているのかの入力を得る．


環境一覧
[SteamVR](https://store.steampowered.com/app/250820/SteamVR/?l=japanese) 1.16.10
[Unity](https://unity3d.com/jp/get-unity/download) 2019.4.27f1 or 2020.1.17f1（動作確認済み，非対応なSDKあり）

[SteamVR Plugin](https://assetstore.unity.com/packages/tools/integration/steamvr-plugin-32647) 2.7.3
[Vive SRanipalRuntime Plugin](https://hub.vive.com/en-US/download) 1.3.2.0


追加アクセサリー
[VIVEトラッカー2018](https://www.amazon.co.jp/dp/B0748ZY323/ref=cm_sw_r_tw_dp_QDZSM4A3844PSM33DB3R?_encoding=UTF8&psc=1)
[Ovrvision Pro（ステレオカメラ）](https://www.amazon.co.jp/dp/B01N7H8YUM/ref=cm_sw_em_r_mt_dp_6TGRDF5BWQPW2PJ1H4WN)
[Leap Motion](https://www.amazon.co.jp/Leap-Motion-Controller/dp/B075T4MH77/ref=asc_df_B075T4MH77/?tag=jpgo-22&linkCode=df0&hvadid=342463500927&hvpos=&hvnetw=g&hvrand=13721783060484696807&hvpone=&hvptwo=&hvqmt=&hvdev=c&hvdvcmdl=&hvlocint=&hvlocphy=1009320&hvtargid=pla-945077929421&psc=1)


使用PCスペック
インテル® Core™ i7-7700K
NVIDIA GeForce GTX 1070

- **環境作成編**

 #1 [Unityのセットアップをする](https://qiita.com/RyoyaHase/items/5a173b7acbdf9aa2cfff)　2021年 1月更新

 #2 [プロジェクトを作ってみる](https://qiita.com/RyoyaHase/items/7b2148e9034584db7420)　2021年 1月更新

 #3-α [Unity2019でVR開発のための環境を整える（SteamVR Plugin2.7.Xをインストールする）：推奨](https://qiita.com/RyoyaHase/items/36910ec8a0b3d8122f8c)　2021年 6月更新

 #3-β [Unity2020でVR開発のための環境を整える（SteamVR Plugin2.7.Xをインストールする）](https://qiita.com/RyoyaHase/items/b7b5f8a7110810c1c0f1)　2021年 5月更新

 #3-おまけ [UnityでVR開発のための環境を整える（SteamVR Pluginの最新版をインストールする）：非推奨](https://qiita.com/RyoyaHase/items/f8b4fb5b04d9f02aae49)　2021年 2月更新

 #4 [SteamVRのダウングレードと自動アップデートの停止（上級者向け）](https://qiita.com/RyoyaHase/items/0dab278b080f517032a0)　2021年 5月更新


- **コントローラの入力やトラッカー，HMDの位置座標，回転座標を得る＋α**

 #5 [__VIVEコントローラのボタン入力を取得する（この記事）__](https://qiita.com/RyoyaHase/items/89ffc9d134b784b8ae50)　2021年 2月更新

 #6 [トリガーの押し具合やトラックパッドの位置情報の入力を取得する](https://qiita.com/RyoyaHase/items/81fa026f68aee02fa5d4)　2021年 2月更新

 #6-おまけ [VIVEコントローラを使った開発をする時のおすすめ設定（独断と偏見）](https://qiita.com/RyoyaHase/items/d622e1bb0e345cf78f4f)　2021年 5月更新

 #7 [ヘッドマウントディスプレイとコントローラの位置座標と回転を取得する](https://qiita.com/RyoyaHase/items/325e7250c01f47e7e63b)　2021年 2月更新

 #8 [VIVEトラッカー2018を有効化してUnity上で位置座標と回転を取得](https://qiita.com/RyoyaHase/items/015bbb8671833ef8e740)　2021年 5月更新

 #9 [VIVEコントローラの振動機能を開発してみる](https://qiita.com/RyoyaHase/items/0690761fed2e71f6d517)　2021年 4月更新


- **VIVE Pro Eyeのアイトラッキングを使ってみる**

 #10 [VIVE Pro Eyeの視線トラッキングを有効化（セットアップ）する](https://qiita.com/RyoyaHase/items/024f3589547d1af84a92)　2021年 4月更新

 #11 [VIVE Pro Eyeのアイトラッキングを使ってUnity上で瞬きや視線のデータを取得する](https://qiita.com/RyoyaHase/items/5af948666a039d48a68d)　2021年 4月更新

 #11-おまけ [VIVE Pro Eyeのアイトラッキングで計測できるデータについて（適宜更新）](https://qiita.com/RyoyaHase/items/044826488e763f896a0f)　2021年 4月更新


- **VIVE Pro Eyeのカメラを使ってみる**

 #12 [VIVE Pro Eyeのフロントカメラの解像度（性能）とAR機能を有効化について](https://qiita.com/RyoyaHase/items/853938ec7c8745ec811c)　2021年 5月更新


- **小技**

 [プレイエリアの境界線（シャペロン境界）が表示されないように設定を変更する](https://qiita.com/RyoyaHase/items/57296d7753877afc6f34)　2021年 6月更新

 [Unity上でカメラを複数台追加してHMDやコントローラの動きを見る](https://qiita.com/RyoyaHase/items/4b4733503d53c8387db4)　2021年 6月更新


- **Ovrvision Pro（ステレオカメラ）を使ってAR開発してみる**

 ＄1-1 [Ovrvision Pro（ステレオカメラ）のセットアップをして実際に動かしてみる](https://qiita.com/RyoyaHase/items/262ad2133ee89d00b3cb)　2021年 6月更新

 ＄1-2 [Ovrvision Pro（ステレオカメラ）とHMDを使ってARアプリ開発する](https://qiita.com/RyoyaHase/items/4abcd90f0f2319c89114)　2021年 6月更新

- **Leap Motionを使ってハンドトラッキングしてみる**

 ＄2-1 [Leap Motion（ハンドトラッキング）のセットアップをして実際に動かしてみる](https://qiita.com/RyoyaHase/items/6891c21c8c21dcb08b2f)　2021年 6月更新

 ＄2-2 [Leap Motion（ハンドトラッキング）とHMDを使ったインタラクティブなアプリ開発する](https://qiita.com/RyoyaHase/items/b0f6cd1d7474286f99ed)　2021年 6月更新

- **アプリを作ってみる**

  [VR（仮想空間）上に曲面ディスプレイを作成して大画面で広角WEBカメラ映像を見る](https://qiita.com/RyoyaHase/items/cc57e67799c1b14ef15d)　2021年 5月更新


今回の記事では，

1．シーンを新規作成する．
2．コントローラとUnityの接続設定を行う．
3．スクリプトを新規作成してオブジェクトに追加する．
4．実際に入力を取得してみる．

という流れ．

#1．シーンとスクリプトを新規作成する．
Assets内のScenesフォルダを開く．
![01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/758746/011a21e5-9ba2-5997-2397-72924ab5b8ed.png)

①プロジェクトタブ上で右クリックし，②Sceneを新規作成する．
![02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/758746/fa02a37d-2191-87a1-ac5c-0f3420d654dd.png)

適当な名前をつける．（今回は1としている）
![03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/758746/83afa045-3bc6-dde6-4b2d-ae8cd02de6e9.png)

各シーンをダブルクリックして切り替えられる．左上のプロジェクト名の右側が開いてるシーン名になっている．
![04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/758746/09ac308a-b61f-461a-1539-ec0b4f3cef6c.png)

シーンを作成するとデフォルトでメインカメラが設置されているので右クリックして削除する．
![05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/758746/b620c862-7555-6d00-87e6-311a9ac3f426.png)

SteamVR/Prefabsフォルダ内にある[CameraRig]をオブジェクトを置くヒストリータブにドラック＆ドロップする．
![06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/758746/f7ec14ae-51bc-1289-4d4e-212236ad22cd.png)

無事追加されたら中身を確認すると元々左右のコントローラを制御する用のController(Left)とController(right)が入っている．
![07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/758746/a2b2897d-a41a-ed3e-bbb5-775a23da5a76.png)

実行してみてコントローラが見れれば作成は問題なく終わっている．
![08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/758746/073cf4a4-35b4-23d4-7f2c-660a29682d38.png)

＊注意
VRは動作が不安定になることが多いのでちょくちょく保存しておくように心がける．
![09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/758746/21b903da-8b63-9f7f-81b4-6b53c10ba03d.png)

#2．コントローラとUnityの接続設定を行う．

コントローラの値を取得する為に初期設定を行う．
WindowからSteamVR Inputを開く．
![16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/758746/2532e4d4-a3a6-bebc-32ca-70194c399231.png)

元々ボタン系のアクションは基本用意されている．
![17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/758746/a396c252-f9cb-ca63-fec1-1735d4c2b9ac.png)

アクションはとりあえず触らずにコントローラのバインド設定を開く．
![18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/758746/72c17561-1415-74ad-2254-77b3135ed3c7.png)

開いた際に「Steamを利用できません．一部の機能が無効な可能性があります．」と表示される場合がある．この場合設定を追加できないのでSteamを開いてログインしておく．ログインが終わったらSteamは閉じてしまって大丈夫．
![19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/758746/861da702-5769-186e-17ca-8ff4f9025fbd.png)
![20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/758746/26a83642-fb6d-d929-01d1-449235ad9e2e.png)

ログインされていれば特に警告は表示されないのでバインドの新規作成をする．
![21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/758746/bb36aa14-6b82-1045-2401-43d715edf405.png)

コントローラの設定画面が表示される，元々それぞれのボタンにアクションが割り振られている．もし新しいアクションを入れたい場合にはSteamVR Inputでアクションを追加してそれぞれのボタンに割り当てる．（次の記事で詳細記述）
![22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/758746/7add4fca-8e20-251a-f1ec-812488822bc7.png)
![23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/758746/af4554e9-9fc2-3b68-651e-a82a234081d6.png)

とりあえず今回はそのままで個人用バインドを保存する．もしログインされてないとこのボタンが灰色になっていて押せない．
![24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/758746/4e437ac3-3b78-31a5-d505-f3499a0fb212.png)

名前や説明を変更できるので適宜変更して保存する．
![25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/758746/38714324-463d-ecf6-215f-27914b65c631.png)

保存が完了したら左上の戻るボタンを押す．
![26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/758746/712ae20a-1584-4d12-3ed4-d502a9e84d1f.png)

自身のアイコンが表示された個人用バインドが作成されてれば大丈夫．
![27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/758746/f421531a-bdd0-d8aa-a99d-1fc5583e1ea3.png)

#3．スクリプトを新規作成してオブジェクトに追加する．

Assetsフォルダ上に戻ってフォルダーを新規作成する．
![10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/758746/41545576-0011-d889-3951-369624889301.png)

プログラムを書いたスクリプトを保存する用のScriptフォルダを作成する．
![11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/758746/2315881a-0571-711f-01c0-313d75a6d89a.png)

作成したScriptフォルダを開いて右クリックしてC# Scriptを新規作成する．
![12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/758746/e9c849b6-f4a5-cf6a-236c-dcabacfd0393.png)

今回はbooleanlefttestという名前のスクリプトを作成する．
![13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/758746/55015e37-c8a2-cd8e-6669-b3cd35cc01f6.png)


スクリプトをダブルクリックするとVisual Studioが開いて中身を編集できる．クラス名はファイル名と同じにする．
ファイル名を変更しても勝手に変わってくれないので変えるたびに確認する．
![14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/758746/c2c745cc-f4fc-d952-42b1-24c38dd34d04.png)

初期で作られるメソッドとしてStart()とUpdate()が作成されている．
Start()：開始と同時に動くプログラムを書く部分．
Update()：フレーム毎に動くプログラムを書く部分

他には
Awake()：Start()よりも先に呼び出される．
LateUpdate()：Update()と同様に１フレームに１回呼び出されるが，Update()がフレームの最初に実行されるのに対してLateUpdate()はフレームのすべての処理が終わった後に実行される．
FixedUpdate()：ゲーム内時間での一定間隔で呼ばれる，ゲーム内時間を使用する為，フレームレートに依存せずに制御が行える．
などが代表的なメゾット．いろいろ種類があるので適宜使い分ける．
![15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/758746/d46e38ea-b5f9-49c2-beff-138417deb364.png)

変更した後には保存すると反映されるので開きっぱなしでも大丈夫．
![29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/758746/70576d62-60ec-247a-3246-bb5189642a10.png)

作成したアセットをController(Left)に追加する．
追加されるとインスペクターの一番下に表示される．
![16.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/758746/10aa99c5-d5b0-b07a-f933-56e7ed9026f3.gif)

#4．実際に入力を取得してみる．

バインド設定を閉じて先ほど開いたC#スクリプトを開く．オブジェクトのインスペクターから右クリックしても開ける．
![28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/758746/f0ba33b4-8751-10dc-97e3-94da434be4f6.png)

中身を以下のように書き換える．今回は上のコントローラバインドでトリガーに設定されているInteractUIを取得する．
＊丸ごとコピペする時にはクラス名をC#スクリプトの名前に変える．

```C#:booleanlefttest.cs
using System;
using UnityEngine;
using Valve.VR;

//クラス名はファイル名（今回はbooleanlefttest）
public class booleanlefttest : MonoBehaviour
{

    //InteractUIボタンが押されてるのかを判定するためのIuiという関数にSteamVR_Actions.default_InteractUIを固定
    private SteamVR_Action_Boolean Iui = SteamVR_Actions.default_InteractUI;
    //結果の格納用Boolean型関数interacrtui
    private Boolean interacrtui;

    //1フレーム毎に呼び出されるUpdateメゾット
    void Update()
    {
        //結果をGetStateで取得してinteracrtuiに格納
        //SteamVR_Input_Sources.機器名（今回は左コントローラ）
        interacrtui = Iui.GetState(SteamVR_Input_Sources.LeftHand);
        //interacrtuiの中身を確認
        Debug.Log(interacrtui);
    }
}

```


保存を押して反映させる．
![29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/758746/70576d62-60ec-247a-3246-bb5189642a10.png)

コンソールタブを開いた状態で実行する．
![30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/758746/504c3a3e-0d7e-67b4-c067-15b094728572.png)

左コントローラのトリガーを押してない状態ではFalse押すとTrueと表示される．
![31.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/758746/da2ec5a5-b09f-d96d-a501-e7647e355b82.gif)

常に表示されていても重くなるので，トリガーのInteractUIと側面ボタンのGrabGripが押されたらコンソール表示されるようにする．

```C#:booleanlefttest.cs
using System;
using UnityEngine;
using Valve.VR;

//クラス名はファイル名（今回はbooleanlefttest）
public class booleanlefttest : MonoBehaviour
{

    //InteractUIボタン（初期設定はトリガー）が押されてるのかを判定するためのIuiという関数にSteamVR_Actions.default_InteractUIを固定
    private SteamVR_Action_Boolean Iui = SteamVR_Actions.default_InteractUI;
    //結果の格納用Boolean型関数interacrtui
    private Boolean interacrtui;

    //GrabGripボタン（初期設定は側面ボタン）が押されてるのかを判定するためのGrabという関数にSteamVR_Actions.default_GrabGripを固定
    private SteamVR_Action_Boolean GrabG = SteamVR_Actions.default_GrabGrip;
    //結果の格納用Boolean型関数grapgrip
    private Boolean grapgrip;

    //1フレーム毎に呼び出されるUpdateメゾット
    void Update()
    {
        //結果をGetStateで取得してinteracrtuiに格納
        //SteamVR_Input_Sources.機器名（今回は左コントローラ）
        interacrtui = Iui.GetState(SteamVR_Input_Sources.LeftHand);
        //InteractUIが押されているときにコンソールにInteractUIと表示
        if (interacrtui)
        {
            Debug.Log("InteractUI");
        }

        //結果をGetStateで取得してgrapgripに格納
        //SteamVR_Input_Sources.機器名（今回は左コントローラ）
        grapgrip = GrabG.GetState(SteamVR_Input_Sources.LeftHand);
        //GrabGripが押されているときにコンソールにGrabGripと表示
        if (grapgrip)
        {
            Debug.Log("GrabGrip");
        }

    }
}
```
![32.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/758746/2f048c06-566f-241b-b77d-b0ee8147957e.gif)

もし右コントローラの値も取りたければ同様に新しいスクリプトを作って右コントローラに割り当てる．
違いはSteamVR_Input_Sources.RightHandとSteamVR_Input_Sources.LeftHandで値を取る機器を変更できる．

```C#:booleanlefttest.cs
using System;
using UnityEngine;
using Valve.VR;

//クラス名はファイル名（今回はbooleanlefttest）
public class booleanrighttest: MonoBehaviour
{
using System;
using UnityEngine;
using Valve.VR;

//クラス名はファイル名（今回はbooleanrighttest）
public class booleanrighttest : MonoBehaviour
{

    //InteractUIボタン（初期設定はトリガー）が押されてるのかを判定するためのIuiという関数にSteamVR_Actions.default_InteractUIを固定
    private SteamVR_Action_Boolean Iui = SteamVR_Actions.default_InteractUI;
    //結果の格納用Boolean型関数interacrtui
    private Boolean interacrtui;

    //GrabGripボタン（初期設定は側面ボタン）が押されてるのかを判定するためのGrabという関数にSteamVR_Actions.default_GrabGripを固定
    private SteamVR_Action_Boolean GrabG = SteamVR_Actions.default_GrabGrip;
    //結果の格納用Boolean型関数grapgrip
    private Boolean grapgrip;

    //1フレーム毎に呼び出されるUpdateメゾット
    void Update()
    {
        //結果をGetStateで取得してinteracrtuiに格納
        //SteamVR_Input_Sources.機器名（今回は右コントローラ）
        interacrtui = Iui.GetState(SteamVR_Input_Sources.RightHand);
        //InteractUIが押されているときにコンソールにInteractUIと表示
        if (interacrtui)
        {
            Debug.Log("InteractUI");
        }

        //結果をGetStateで取得してgrapgripに格納
        //SteamVR_Input_Sources.機器名（今回は右コントローラ）
        grapgrip = GrabG.GetState(SteamVR_Input_Sources.RightHand);
        //GrabGripが押されているときにコンソールにGrabGripと表示
        if (grapgrip)
        {
            Debug.Log("GrabGrip");
        }

    }
}

```


こんな感じですべての入力について押されているのかどうかを得ることができました．
[次回](https://qiita.com/RyoyaHase/items/81fa026f68aee02fa5d4)はボタンだけでなく，トリガーやトラックパッドなどの数値データを取得する．