アウトドアとかゲーム開発とか

ロードバイクやキャンプなどアウトドアとUnityでの開発とか

【Vive】コントローラのボタン入力の取得【Unity】

HTC Vive Preのコントローラのボタン入力について

コントローラのプレハブがシーンに追加した後の設定となります。
その辺りはやのせんさんが作られた以下資料を参照。

http://www.slideshare.net/KojiroYano/vive-59807782

トリガー入力のサンプル

下記サンプルをコントローラのプレハブにアタッチします。

SteamVR_TrackedObject trackedObj;

void Awake()
{
    trackedObj = GetComponent<SteamVR_TrackedObject>();
}

void Update () {
		
    var device = SteamVR_Controller.Input((int)trackedObj.index);
		
    if (device.GetPressDown(SteamVR_Controller.ButtonMask.Trigger))
    {
        Debug.Log("GetPressDown Trigger");		
    }
	
}

たったこれだけです。
SteamVR-Extras フォルダ内の SteamVR_TestThrow のスクリプトを参考にしています。

また、コントローラ周りは SteamVR_Controller スクリプトを見れば大体記載してあります。

上記スクリプトではトリガーを押した瞬間のみ反応します。
「GetPressDown」を書き換えればトリガーのタイミングを変更できます。

GetPress ボタンを押してる間
GetPressDown ボタンを押したとき
GetPressUp ボタンを離したとき

また、ButtonMask.Triggerの「Trigger」部分を書き換えると別のボタン状態を取得できます。

Touchpad 中央の大きな円形ボタン。タッチパッドとして座標も取得可能
ApplicationMenu タッチパッドの上のボタン
Grip グリップボタン
Trigger トリガーボタン

※System、Axisは現時点ではまだよくわかっていないので割愛

タッチパッドについては、「GetTouch」「GetTouchDown」「GetTouchUp」を使うようです。
ただしタッチパッドに触れただけで反応してしまうので、用途によって使い分けます。

タッチパッドの座標の取得

上記スクリプトに書きコードを追加します。

if (device.GetTouch(SteamVR_Controller.ButtonMask.Touchpad))
{
    Debug.Log( device.GetAxis() );
}

タッチパッドに触れている間、座標をデバッグログに表示します。
タッチパッドの中央が (0.0) となり、左と下がマイナス、右と上がプラスになります。

Vector2型なので、X座標だけ取得したい場合は「device.GetAxis().x」のように記述します。

バイブレーション

Viveのコントローラは振動させることができます。

if (device.GetPressDown(SteamVR_Controller.ButtonMask.Trigger))
{
    device.TriggerHapticPulse(2000);
}

「TriggerHapticPulse」で振動させます。
振動の強さは渡す値が大きいほど強くなります。
ただし100~2000内の数値となります。

www.leadwerks.com

ひとまずコントローラに関してはここまで。