UnityでVRコントローラを使ったUIについて(ボタン入力編)

UIといっても色々ありますが、今回はボタン入力について記載します。
なお、前提としてSteamVR Pluginをスクリプトから操作することを目的としています。
ノンコーディングで手軽にやりたい方はVRTK等で調べられるのが良いかと思います。

ボタン入力イベントのフック

以下動画冒頭のように、ボタンを押したらメニューを表示、回転を行えるようボタンイベントをフックします。
www.nicovideo.jp

SteamVR_TrackedController.csではボタン入力イベントが以下のようにデリゲートとして用意されています。(抜粋)

public delegate void ClickedEventHandler(object sender, ClickedEventArgs e);

public event ClickedEventHandler MenuButtonClicked;
public event ClickedEventHandler MenuButtonClicked;
public event ClickedEventHandler MenuButtonUnclicked;
public event ClickedEventHandler TriggerClicked;
public event ClickedEventHandler TriggerUnclicked;
public event ClickedEventHandler SteamClicked;
public event ClickedEventHandler PadClicked;
public event ClickedEventHandler PadUnclicked;
public event ClickedEventHandler PadTouched;
public event ClickedEventHandler PadUntouched;
public event ClickedEventHandler Gripped;
public event ClickedEventHandler Ungripped;

 
なので、以下のように押されたときに呼び出したいメソッドをイベント登録しておきます。
以下はメニューボタンが押されたときのイベントを登録しています。

    private SteamVR_TrackedController _TrackedController;

    private void Awake()
    {
        _TrackedController = GetComponent<SteamVR_TrackedController>();
    }

    void Start()
    {
        _TrackedController.MenuButtonClicked += new ClickedEventHandler(_CheckMenuHoldOnclick);
        _TrackedController.MenuButtonUnclicked += new ClickedEventHandler(_CheckMenuHoldOnunclick);
    }

     void _CheckMenuHoldOnclick(object sender, ClickedEventArgs e)
     {
         // XXX
     }

 

また、円状のタッチパッド については以下のように上下左右どの箇所が押されたか判定できます。

    public static FORWORD CheckPadForword(ClickedEventArgs e)
    {
        if (e.padY / e.padX > 1 || e.padY / e.padX < -1)
        {
            if (e.padY > 0)
            {
                return FORWORD.UP;
            }
            else
            {
                return FORWORD.DOWN;
            }
        }
        else
        {
            if (e.padX > 0)
            {
                return FORWORD.RIGHT;
            }
            else
            {
                return FORWORD.LEFT;
            }
        }
    }

VRでの移動方法やメニュー(uGUI)との連動方法については次回以降に記事にしたいと思います。