#9「VIVEコントローラの振動（バイブレーション）機能を開発してみる」【初心者】HTC VIVE Pro Eyeを使ってUnityでVRの開発を行ってみる．

#はじめに
[前回](https://qiita.com/RyoyaHase/items/015bbb8671833ef8e740)までで基本的な入力をすべて抜き取ったので，今回は出力機能であるバイブレーションを触っていきます．バイブレーションの制御には「[#6-おまけVIVEコントローラを使った開発をする時のおすすめ設定（独断と偏見）](https://qiita.com/RyoyaHase/items/d622e1bb0e345cf78f4f)」のトリガー入力をそのまま使います．


環境一覧
[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．実際にコントローラーの入力から出力してみる．

という流れ．

#1．振動（バイブレーション）を出力するための設定を確認する．

SteamVRを入れてあるUnityプロジェクトを開いてSteamVR Inputを開きます．
![18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/758746/28ccc3d1-943e-08d6-8db2-f96b4bf611a8.png)

デフォルトでActionsのOutにあるHapticを使用して振動機能を実装していきます．
![01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/758746/1ec301d5-c4c6-b314-ecad-fb0d1915088c.png)

コントローラのバインドを開きます．
![19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/758746/6d75db18-deb7-5043-a761-b385228649ac.png)

バインドの中身を編集で確認します．
![05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/758746/16ac63b0-13fd-f682-01d3-334a0b88d34e.png)

ハプティクスの編集を押します．
![02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/758746/5c3f3987-af59-2f8c-3c6d-c7c6d478e6c8.png)

こちらもデフォルトでHapticが割り当てられています．
![03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/758746/5ddc5f93-6795-d26e-ecb4-bed6c1beece2.png)

どちらも問題なく割り当てられていれば実際にプログラムしていきます．

#2．実際にコントローラーの入力から出力してみる．

いつもどおりスクリプトの作成を行います．
今回は"SampleControllerVibration"というスクリプトを作成します．
コントローラからの入力は前回の記事で作成したものをそのまま流用していますので詳細はそちらを確認してください．

.Executeは4つの引数をパラメータとして持ち，
float secondsFromNow：現在の時刻からアクションを実行するまでの時間，0から設定可能．
float durationSeconds：どのぐらい振動が続くか（秒単位）．
float frequency：どのぐらいの頻度で振動のピークが発生するか（0 - 320hz）0がお勧めらしい．
float amplitude：振動の強さ（0 - 1）) ．
の4つをそれぞれ渡します．

値をそのまま入れるとdouble型になってしまうので，数値のあとにflootの宣言であるfが入っています．

```C#:SampleControllerVibration.cs
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Valve.VR;


public class SampleControllerVibration : MonoBehaviour
{
    //**③Grabトリガーの入力**//
    //③-2 トリガーがどれだけ押されているのか---------------
    //トリガーがどれだけ押されているのかを取得するためのsqueezeという関数にSteamVR_Actions.default_Squeezeを固定
    private SteamVR_Action_Single squeeze = SteamVR_Actions.default_Squeeze;
    //結果の格納用floot型関数pullleft, pullright
    public static float pullleft, pullright;
    //---------------------------------------------------
    //**------------------**//


    //振動の入力のためにvibrationという関数にSteamVR_Actions.default_Hapticを固定
    private SteamVR_Action_Vibration vibration= SteamVR_Actions.default_Haptic;

    // Update is called once per frame
    void Update()
    {
        //**③Grabトリガーの入力**//
        //③-2トリガーがどれだけ押されているのか---------------
        //結果をGetLastAxisで取得してpullleftに格納
        //SteamVR_Input_Sources.機器名（ここは左コントローラ）
        pullleft = squeeze.GetLastAxis(SteamVR_Input_Sources.LeftHand);
        //結果をGetLastAxisで取得してpullrightに格納
        //SteamVR_Input_Sources.機器名（ここは右コントローラ）
        pullright = squeeze.GetLastAxis(SteamVR_Input_Sources.RightHand);
        //---------------------------------------------------
        //**------------------**//


        //左手のコントローラに左コントローラのトリガーの押され具合が0以上の時，値を振動の大きさとして入力
        if (pullleft != 0) {
            /*Execute(float secondsFromNow：現在の時刻からアクションを実行するまでの時間0から設定可, float durationSeconds：どのぐらい振動が続くか（秒単位）, 
            　float frequency：どのぐらいの頻度で振動が発生するか（0 - 320hz）0がお勧めらしい, float amplitude：振動の強さ（0 - 1）) 各数値のあとのfはflootの宣言*/
            vibration.Execute(0, 0.2f, 100, pullleft, SteamVR_Input_Sources.LeftHand);
        }

        //右手のコントローラに右コントローラのトリガーの押され具合が0以上の時，値を振動の大きさとして入力
        if (pullright!= 0)
        {
            /*Execute(float secondsFromNow：現在の時刻からアクションを実行するまでの時間0から設定可, float durationSeconds：どのぐらい振動が続くか（秒単位）, 
            　float frequency：どのぐらいの頻度で振動が発生するか（0 - 320hz）0がお勧めらしい, float amplitude：振動の強さ（0 - 1）) 各数値のあとのfはflootの宣言*/
            vibration.Execute(0, 0.2f, 100, pullright, SteamVR_Input_Sources.RightHand);
        }

    }
}

```

適当なオブジェクトにスクリプトを追加します（今回は[CameraRig]）．
![04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/758746/8af062a6-3da5-b342-85be-6fea7d1253d6.png)

これでトリガーの押し具合に合わせてコントローラを振動させることができました．
 [次回](https://qiita.com/RyoyaHase/items/024f3589547d1af84a92)からはVIVE Pro Eyeのアイトラッカー機能をUnity上で開発していきます．