はじめに
今回はVIVEコントローラを使った開発を行う際に自分好みの設定をメモ書きしておきます.ちなみにVIVE限定の設定なので配布用とかではあまりお勧めしません.
環境一覧
SteamVR 1.16.10
Unity 2019.4.27f1 or 2020.1.17f1(動作確認済み,非対応なSDKあり)
SteamVR Plugin 2.7.3
Vive SRanipalRuntime Plugin 1.3.2.0
追加アクセサリー
VIVEトラッカー2018
Ovrvision Pro(ステレオカメラ)
Leap Motion
使用PCスペック
インテル® Core™ i7-7700K
NVIDIA GeForce GTX 1070
- 環境作成編
#1 Unityのセットアップをする 2021年 1月更新
#2 プロジェクトを作ってみる 2021年 1月更新
#3-α Unity2019でVR開発のための環境を整える(SteamVR Plugin2.7.Xをインストールする):推奨 2021年 6月更新
#3-β Unity2020でVR開発のための環境を整える(SteamVR Plugin2.7.Xをインストールする) 2021年 5月更新
#3-おまけ UnityでVR開発のための環境を整える(SteamVR Pluginの最新版をインストールする):非推奨 2021年 2月更新
#4 SteamVRのダウングレードと自動アップデートの停止(上級者向け) 2021年 5月更新
- コントローラの入力やトラッカー,HMDの位置座標,回転座標を得る+α
#5 VIVEコントローラのボタン入力を取得する 2021年 2月更新
#6 トリガーの押し具合やトラックパッドの位置情報の入力を取得する 2021年 2月更新
#6-おまけ VIVEコントローラを使った開発をする時のおすすめ設定(独断と偏見)(この記事)
 2021年 5月更新
#7 ヘッドマウントディスプレイとコントローラの位置座標と回転を取得する 2021年 2月更新
#8 VIVEトラッカー2018を有効化してUnity上で位置座標と回転を取得 2021年 5月更新
#9 VIVEコントローラの振動機能を開発してみる 2021年 4月更新
- VIVE Pro Eyeのアイトラッキングを使ってみる
#10 VIVE Pro Eyeの視線トラッキングを有効化(セットアップ)する 2021年 4月更新
#11 VIVE Pro Eyeのアイトラッキングを使ってUnity上で瞬きや視線のデータを取得する 2021年 4月更新
#11-おまけ VIVE Pro Eyeのアイトラッキングで計測できるデータについて(適宜更新) 2021年 4月更新
- VIVE Pro Eyeのカメラを使ってみる
#12 VIVE Pro Eyeのフロントカメラの解像度(性能)とAR機能を有効化について 2021年 5月更新
- 小技
プレイエリアの境界線(シャペロン境界)が表示されないように設定を変更する 2021年 6月更新
Unity上でカメラを複数台追加してHMDやコントローラの動きを見る 2021年 6月更新
- Ovrvision Pro(ステレオカメラ)を使ってAR開発してみる
$1-1 Ovrvision Pro(ステレオカメラ)のセットアップをして実際に動かしてみる 2021年 6月更新
$1-2 Ovrvision Pro(ステレオカメラ)とHMDを使ってARアプリ開発する 2021年 6月更新
- Leap Motionを使ってハンドトラッキングしてみる
$2-1 Leap Motion(ハンドトラッキング)のセットアップをして実際に動かしてみる 2021年 6月更新
$2-2 Leap Motion(ハンドトラッキング)とHMDを使ったインタラクティブなアプリ開発する 2021年 6月更新
- 
アプリを作ってみる VR(仮想空間)上に曲面ディスプレイを作成して大画面で広角WEBカメラ映像を見る 2021年 5月更新 
今回の記事では,
1.SteamVR Inputのアクションを整理する.
2.コントローラバインドのボタン設定.
3.実際に各種ボタンからデータを抜き出すプログラムについて.
という流れ.
1.SteamVR Inputのアクションを整理する.
コントローラのバインドを設定する時に警告が出てしまうのでまずはいらないアクションを消しちゃいます.別に優先度を下げるのでもいいですが見やすいように今回は消します.
とりあえずいらないアクションは
"SnapTurnLeft"
"SnapTurnRight"
の2つです.

次に必要なアクションを作成していきます.
名前とボタンの入力正式は完全に同じものにしないと最後のプログラムがコピペで動かないので注意してください.
まず
Name:MenuButton
Type:boolean
を作成します.

同様に
Name:TrackPadTouch
Type:boolean
さらに
Name:TrackPad
Type:Vector2
を作成します.
2.コントローラバインドのボタン設定.
アクションを作り終わったらコントローラのバインドを開きます.

まずはメニューボタンになにも設定されてないので先ほど作ったMenuButtonを割り当てます.小文字表記ですが大丈夫です.

トラックパッドは元々割り当てられているので消して新しく作成し,3つのアクションを割り当てます.

3.実際に各種ボタンからデータを抜き出すプログラムについて.
抜き出し方は前回までの記事と同じです.
それぞれのボタンごとにスクリプトを作ります.基本的に一個にまとめて書けばいいですけど今回は見やすいように分けて書きます.
コントローラの側面グリップ用のスクリプトGP.csを作ります.
using System;
using UnityEngine;
using Valve.VR;
//クラス名はファイル名(今回はTrigerPull)
public class GP : MonoBehaviour
{
    //①トリガーが押されてるのか-------------------------
    //トリガーが押されてるのかを判定するためのIuiという関数にSteamVR_Actions.default_InteractUIを固定
    private SteamVR_Action_Boolean Iui = SteamVR_Actions.default_InteractUI;
    //結果の格納用Boolean型関数interacrtui
    private Boolean interacrtuileft, interacrtuiright;
    //---------------------------------------------------
    //②トリガーがどれだけ押されているのか---------------
    //トリガーがどれだけ押されているのかを取得するためのsqueezeという関数にSteamVR_Actions.default_Squeezeを固定
    private SteamVR_Action_Single squeeze = SteamVR_Actions.default_Squeeze;
    //結果の格納用floot型関数pullleft, pullright
    private float pullleft, pullright;
    //---------------------------------------------------
    //1フレーム毎に呼び出されるUpdateメゾット
    void Update()
    {
        //①トリガーが押されてるのか-------------------------
        //結果をGetStateで取得してinteracrtuiに格納
        //SteamVR_Input_Sources.機器名(今回は左コントローラ)
        interacrtuileft = Iui.GetState(SteamVR_Input_Sources.LeftHand);
        //interacrtuileftの中身を確認
        Debug.Log(interacrtuileft);
        //SteamVR_Input_Sources.機器名(今回は右コントローラ)
        interacrtuiright = Iui.GetState(SteamVR_Input_Sources.RightHand);
        //interacrtuirightの中身を確認
        Debug.Log(interacrtuiright);
        //---------------------------------------------------
        //②トリガーがどれだけ押されているのか---------------
        //結果をGetLastAxisで取得してpullleftに格納
        //SteamVR_Input_Sources.機器名(ここは左コントローラ)
        pullleft = squeeze.GetLastAxis(SteamVR_Input_Sources.LeftHand);
        //pullleftの中身を確認
        Debug.Log("Left:" + pullleft);
        //結果をGetLastAxisで取得してpullrightに格納
        //SteamVR_Input_Sources.機器名(ここは右コントローラ)
        pullright = squeeze.GetLastAxis(SteamVR_Input_Sources.RightHand);
        //pullrightの中身を確認
        Debug.Log("Right:" + pullright);
        //---------------------------------------------------
    }
}
次にメニューボタン用のMB.csを作ります.
using System;
using UnityEngine;
using Valve.VR;
//クラス名はファイル名(今回はbooleanlefttest)
public class MB : MonoBehaviour
{
    //MenuButtonが押されてるのかを判定するためのmenubuttanという関数にSteamVR_Actions.default_MenuButtonを固定
    private SteamVR_Action_Boolean menubuttan = SteamVR_Actions.default_MenuButton;
    //結果の格納用Boolean型関数
    private Boolean menubuttanleft, menubuttanright;
    //1フレーム毎に呼び出されるUpdateメゾット
    void Update()
    {
        //結果をGetStateで取得してinteracrtuiに格納
        //SteamVR_Input_Sources.機器名(今回は左コントローラ)
        menubuttanleft = menubuttan.GetState(SteamVR_Input_Sources.LeftHand);
        //menubuttanleftの中身を確認
        Debug.Log(menubuttanleft);
        //SteamVR_Input_Sources.機器名(今回は右コントローラ)
        menubuttanright = menubuttan.GetState(SteamVR_Input_Sources.RightHand);
        //menubuttanrightの中身を確認
        Debug.Log(menubuttanright);
    }
}
次にトリガー(グラブピッチ)用のGP.csです.
using System;
using UnityEngine;
using Valve.VR;
//クラス名はファイル名(今回はTrigerPull)
public class GP : MonoBehaviour
{
    //①トリガーが押されてるのか-------------------------
    //トリガーが押されてるのかを判定するためのIuiという関数にSteamVR_Actions.default_InteractUIを固定
    private SteamVR_Action_Boolean Iui = SteamVR_Actions.default_InteractUI;
    //結果の格納用Boolean型関数interacrtui
    private Boolean interacrtuileft, interacrtuiright;
    //---------------------------------------------------
    //②トリガーがどれだけ押されているのか---------------
    //トリガーがどれだけ押されているのかを取得するためのsqueezeという関数にSteamVR_Actions.default_Squeezeを固定
    private SteamVR_Action_Single squeeze = SteamVR_Actions.default_Squeeze;
    //結果の格納用floot型関数pullleft, pullright
    private float pullleft, pullright;
    //---------------------------------------------------
    //1フレーム毎に呼び出されるUpdateメゾット
    void Update()
    {
        //①トリガーが押されてるのか-------------------------
        //結果をGetStateで取得してinteracrtuiに格納
        //SteamVR_Input_Sources.機器名(今回は左コントローラ)
        interacrtuileft = Iui.GetState(SteamVR_Input_Sources.LeftHand);
        //interacrtuileftの中身を確認
        Debug.Log(interacrtuileft);
        //SteamVR_Input_Sources.機器名(今回は右コントローラ)
        interacrtuiright = Iui.GetState(SteamVR_Input_Sources.RightHand);
        //interacrtuirightの中身を確認
        Debug.Log(interacrtuiright);
        //---------------------------------------------------
        //②トリガーがどれだけ押されているのか---------------
        //結果をGetLastAxisで取得してpullleftに格納
        //SteamVR_Input_Sources.機器名(ここは左コントローラ)
        pullleft = squeeze.GetLastAxis(SteamVR_Input_Sources.LeftHand);
        //pullleftの中身を確認
        Debug.Log("Left:" + pullleft);
        //結果をGetLastAxisで取得してpullrightに格納
        //SteamVR_Input_Sources.機器名(ここは右コントローラ)
        pullright = squeeze.GetLastAxis(SteamVR_Input_Sources.RightHand);
        //pullrightの中身を確認
        Debug.Log("Right:" + pullright);
        //---------------------------------------------------
    }
}
最後にトラックパッドの各種データを取得するTP.csを作ります.
using System;
using UnityEngine;
using Valve.VR;
//クラス名はファイル名(今回はTrackpad)
public class TP : MonoBehaviour
{
    //①TrackPadが押されてるのか-------------------------
    //TrackPadが押されてるのかを判定するためのteleportという関数にSteamVR_Actions.default_Teleportを固定
    private SteamVR_Action_Boolean teleport = SteamVR_Actions.default_Teleport;
    //結果の格納用Boolean型関数
    private Boolean teleportleft, teleportright;
    //---------------------------------------------------
    //②TrackPadが触れられているのか---------------------
    //TrackPadが押されてるのかを判定するためのteleportという関数にSteamVR_Actions.default_Teleportを固定
    private SteamVR_Action_Boolean trackpadtouch = SteamVR_Actions.default_TrackPadTouch;
    //結果の格納用Boolean型関数
    private Boolean trackpadtouchleft, trackpadtouchright;
    //---------------------------------------------------
    //③TrackPadの触られているている位置-----------------
    //パッドのどこを触っているのかを取得するためのTrackPadという関数にSteamVR_Actions.default_TrackPadを固定
    private SteamVR_Action_Vector2 trackpad = SteamVR_Actions.default_TrackPad;
    //結果の格納用Vector2型関数
    private Vector2 trackpadposleft, trackpadposright;
    //---------------------------------------------------
    //1フレーム毎に呼び出されるUpdateメゾット
    void Update()
    {
        //①TrackPadが押されてるのか-------------------------
        //結果をGetStateで取得してinteracrtuiに格納
        //SteamVR_Input_Sources.機器名(今回は左コントローラ)
        teleportleft = teleport.GetState(SteamVR_Input_Sources.LeftHand);
        //teleportleftの中身を確認
        Debug.Log(teleportleft);
        //SteamVR_Input_Sources.機器名(今回は右コントローラ)
        teleportright = teleport.GetState(SteamVR_Input_Sources.RightHand);
        //teleportrightの中身を確認
        Debug.Log(teleportright);
        //---------------------------------------------------
        //②TrackPadが触れられているのか---------------------
        //結果をGetStateで取得してinteracrtuiに格納
        //SteamVR_Input_Sources.機器名(今回は左コントローラ)
        trackpadtouchleft = trackpadtouch.GetState(SteamVR_Input_Sources.LeftHand);
        //trackpadtouchleftの中身を確認
        Debug.Log(trackpadtouchleft);
        //SteamVR_Input_Sources.機器名(今回は右コントローラ)
        trackpadtouchright = trackpadtouch.GetState(SteamVR_Input_Sources.RightHand);
        //trackpadtouchrightの中身を確認
        Debug.Log(trackpadtouchright);
        //---------------------------------------------------
        //③TrackPadの触られているている位置-----------------
        //結果をGetLastAxisで取得してposleftに格納
        //SteamVR_Input_Sources.機器名(ここは左コントローラ)
        trackpadposleft = trackpad.GetLastAxis(SteamVR_Input_Sources.LeftHand);
        //trackpadposleftの中身を確認
        Debug.Log(trackpadposleft.x + " " + trackpadposleft.y);
        //結果をGetLastAxisで取得してposrightに格納
        //SteamVR_Input_Sources.機器名(ここは右コントローラ)
        trackpadposright = trackpad.GetLastAxis(SteamVR_Input_Sources.RightHand);
        //trackpadposrightの中身を確認
        Debug.Log(trackpadposright.x + " " + trackpadposright.y);
        //---------------------------------------------------
    }
}
こんな感じでデータを抜くことが出来ます.それぞれ欲しいものだけ組み合わせて使いましょう.他のコントローラでも同様に設定できるので適当にスクリプトは書き換えてください.
とりあえず今のバージョンはこれで行こうと思いますがSDKの関係で変更を強いられることもあると思います...
次回からは色々な機器の座標データを抜き出していきたいと思います.

