VRTK_ControllerEvents

VRTK_ControllerEventsはViveコントローラの各種ボタン押下をトリガーとしたイベントを発行するクラスです。
作成したイベントハンドラをこのクラスのイベント変数に登録するだけで、コントローラからの入力に応じて独自の動作を行うよう実装することができます。
このクラスにはボタンだけでなく、ポインタの発出や、物を掴むといったアクションについてのイベントも定義されており、その動作を行うボタン、すなわち動作のトリガーとなるボタンをインスペクタから設定することができます。
また、このクラスのフィールドには、各ボタンの押下状態が保持されており、外部からも参照することが可能です。

使用方法

SteamVR Pluginの[CameraRig]プレファブ配下のコントローラオブジェクトに本スクリプトをアタッチして使用します。
イベント変数(「イベント」の項を参照)に、void Method(object sender, ControllerInteractionEventArgs e)タイプのメソッドを追加すれば、イベントハンドリングを実現することができます。

インスペクタにて設定できるパラメータ

VRTKではポインタを出す、物を掴む、物を使用する、といったアクションの概念が内部でイベント変数として定義されています。VRTK_ControllerEventsでは、そのような動作をコントローラのどのボタンに結び付けるかをインスペクタ上で設定することができます。
設定する際には、以下の各種アクションにButtonAlias列挙体(「publicフィールド」の項を参照)のメンバを指定します。

  • Pointer Toggle Button – ポインタ(レーザーポインタ等)の発出ON/OFFを切り替えるアクションに結び付けるボタン
  • Pointer Set Button – ポインタを使って決定するアクション(テレポートによる移動先の決定等)に結び付けるボタン
  • Grab Toggle Button – 物を掴むアクションに結び付けるボタン
  • Use Toggle Button – 物を使用するアクション(銃から弾を撃つ、扇風機のスイッチを入れる等)に結び付けるボタン
  • Ui Click Button – UIオブジェクトをクリックするアクションに結び付けるボタン

また、VRTK_ControllerEventsのインスペクタでは一部の動作の検出感度を設定することができます。

  • Axis Fidelity – (調査中)
  • Trigger Click Threshold – トリガーをどの程度引けば、”クリック”とみなすかを0.0f~1.0fの範囲で指定する。1.0fに近いほど深く引く必要がある

publicフィールド

  • enum ButtonAlias – ボタンの種類や状態を表す列挙体
    • Trigger_Hairline – トリガーを引いている状態
    • Trigger_Touch – トリガーを浅く引いた状態
    • Trigger_Press – トリガーを深く引いた状態
    • Trigger_Click – トリガーを閾値以上に引いた状態
    • Grip – コントローラ側面にあるグリップボタン
    • Touchpad_Touch – タッチパッドを触っている状態
    • Touchpad_Press – タッチパッドを押し込んでいる状態
    • Application_Menu – アプリケーションメニューボタン
    • Undefined – 不定値
  • bool triggerPressed – トリガーを深く引いているかどうか
  • bool triggerTouched – トリガーを浅く引いているかどうか
  • bool triggerHairlinePressed – 前回チェック時よりもトリガーを深く引いているかどうか
  • bool triggerClicked – 設定した閾値以上にトリガーを引いているかどうか
  • bool triggerAxisChanged – 前フレームと比べてトリガーの引き具合が変化しているかどうか
  • bool applicationMenuPressed – アプリケーションメニューボタンを押しているかどうか
  • bool touchpadPressed – タッチパッドを押しているかどうか
  • bool touchpadTouched – タッチパッドに触れているどうか
  • bool touchpadAxisChanged – 前フレームと比べてタッチパッドの接触箇所が変化したかどうか
  • bool gripePressed – グリップボタンを押しているかどうか
  • bool pointerPressed – ポインタ発出に割り当てたボタンを押しているかどうか
  • bool grabPressed – 掴みアクションに割り当てられたボタンを押しているかどうか
  • bool usePressed – 物を使用するアクションに割り当てられたボタンを押しているかどうか
  • bool uiClickPressed – UIオブジェクトのクリックに割り当てられたボタンを押しているかどうか
  • bool menuPressed – メニュー操作に割り当てられたボタンを押しているかどうか

イベント

VRTK_ControllerEventsはボタンの押下状態に応じて様々なイベントを発行します。

  • TriggerPressed – トリガーを深く引いたときに発行される
  • TriggerReleased – 深く引いたトリガーを離したときに発行される
  • TriggerTouchStart – トリガーを浅く引いたときに発行される
  • TriggerTouchEnd – 浅く引いたトリガーを離したときに発行される
  • TriggerHairlineStart – トリガーを少しでも引いたときに発行される
  • TriggerHairlineEnd – トリガーを少しでも離したときに発行される
  • TriggerClicked – トリガーを閾値(Trigger Click Threshold)以上に引いたときに発行される
  • TriggerUnClicked – 閾値以上に引いたトリガーを離したときに発行される
  • TriggerAxisChanged – トリガーの引き具合が変化したときに発行される
  • ApplicationMenuPressed – アプリケーションメニューボタンを押したときに発行される
  • ApplicationMenuReleased – アプリケーションメニューボタンを離したときに発行される
  • GripPressed – グリップボタンを押したときに発行される
  • GripReleased – グリップボタンを離したときに発行される
  • TouchpadPressed – タッチパッドを押し込んだときに発行される
  • TouchpadReleased – 押し込んだタッチパッドを離したときに発行される
  • TouchpadTouchStart – タッチパッドに触れ始めたときに発行される
  • TouchpadTouchEnd – タッチパッドを離したときに発行される
  • TouchpadAxisChanged – タッチパッドの接触箇所が変化したときに発行される

また、インスペクタで設定した各種アクションに紐づいたボタンを操作したときには下記イベントも発行されます。

  • AliasPointerOn – ポインタの発出に割り当てたボタンを押したときに発行される
  • AliasPointerOff – ポインタの発出に割り当てたボタンを離したときに発行される
  • AliasPointerSet – ポインタを使った決定アクションに割り当てたボタンを離したときに発行される
  • AliasGrabOn – 物を掴むアクションに割り当てたボタンを押したときに発行される
  • AliasGrabOff – 物を掴むアクションに割り当てたボタンを離したときに発行される
  • AliasUseOn – 物を使うアクションに割り当てたボタンを押したときに発行される
  • AliasUseOff – 物を使うアクションに割り当てたボタンを離したときに発行される
  • AliasMenuOn – メニュー操作に割り当てたボタンを押したときに発行される
  • AliasMenuOff – メニュー操作に割り当てたボタンを離したときに発行される
  • AliasUIClickOn – UIクリックアクションに割り当てたボタンを押したときに発行される
  • AliasUIClickOff – UIクリックアクションに割り当てたボタンを離したときに発行される

なお、コントローラがベースステーションに認識されたとき、および認識から外れた場合に発行されるイベントもあります。

  • ControllerEnabled – コントローラがベースステーションに認識されたときに発行される
  • ControllerDisabled – コントローラがベースステーションの認識から外れたときに発行される

さらに、VRTK_ControllerEventsにはヘルパークラスとしてVRTK_ControllerEvents_UnityEventsが用意されており、これをコントローラオブジェクトにアタッチするとインスペクタ上でイベントハンドラの登録ができるようになります(ButtonのOnClickにメソッドを割り当てるような感じで設定できます)。

イベントデータ

VRTK_ControllerEventsはイベント発行時にイベントデータとしてControllerInteractionEventArgsオブジェクトを送信します。このオブジェクトからは以下のデータを取り出すことができます。

  • uint controllerIndex – イベントを発行したコントローラ(Steam VR_Tracked ObjectのIndex)のインデックス
  • Afloat buttonPressure – トリガーの押し具合が0.0f~1.0fの範囲で表した値。ボタンの場合は0(離されている)か1(押されている)が設定される
  • Vector2 touchpadAxis – タッチパッドを単位円とみなしたときの接触箇所を2次元座標で表した値。たとえば左付近だと(-1,0)、右上付近だと(0.7,0.7)が設定される
  • float touchpadAngle – 接触箇所と原点を結んだ直線とy軸のなす角(deg)を表す値。値域は0.0f~360.0f

publicメソッド

■GetVelocity

Viveコントローラの実世界上での移動速度を取得します。
public Vector3 GetVelocity()

  • 引数
    • なし
  • 戻り値
    • Vector3 – コントローラの移動速度を3次元ベクトルで返す

■GetAngularVelocity

Viveコントローラの実世界上での回転速度を取得します。
public Vector3 GetAngularVelocity()

  • 引数
    • なし
  • 戻り値
    • Vector3 – コントローラの回転速度を3次元ベクトルで返す

■GetTouchpadAxis

タッチパッドを単位円とみなしたときの、接触箇所を取得します。
public Vector2 GetTouchpadAxis()

  • 引数
    • なし
  • 戻り値
    • Vector2 – タッチパッドを単位円とみなしたときの、接触箇所を2次元座標として返す。

■GetTouchpadAxisAngle

タッチパッドを単位円とみなしたときの、接触箇所と原点を結んだ直線とy軸のなす角を取得します。
public float GetTouchpadAxisAngle()

  • 引数
    • なし
  • 戻り値
    • float – 接触箇所と原点を結んだ直線とy軸のなす角(deg)を返す。値域は0.0f~360.0fであり、接触していない場合は0.0fを返す

■GetTriggerAxis

メソッド呼び出し時におけるトリガーの引き具合を取得します。
public float GetTriggerAxis()

  • 引数
    • なし
  • 戻り値
    • float – トリガーの引き具合を0.0f~1.0fの範囲で返す。深く引くほど1.0fに近づく

■GetHairTriggerDelta

前フレームと比べた、トリガーの引き具合の変化量を取得します。
public float GetHairTriggerDelta()

  • 引数
    • なし
  • 戻り値
    • float – トリガーの引き具合の変化量を[]の範囲で返す

■AnyButtonPressed

何かしらのボタン、もしくはトリガーが引かれているかどうかを判断します。
public bool AnyButtonPressed()

  • 引数
    • なし
  • 戻り値
    • bool – Viveコントローラ上のいずれかのボタンを押している、もしくはトリガーが引かれているときにtrueを返す

■IsButtonPressed

引数で指定したボタンが押している状態かどうかを判断します
public bool IsButtonPressed(ButtonAlias button)

  • 引数
    • ButtonAlias – 状態を確認したいボタン、もしくはトリガー
  • 戻り値
    • bool – 引数に指定されたボタンが押されている、もしくはトリガーが引かれているときにtrueを返す

参考記事

  • VRTKを使ってViveコントローラの入力を取り扱う