SteamVRコントローラの入力関係がめちゃくちゃ面倒くさかったのでサボる話

<font color="Red">(2018/10/24)SteamVR2.0に対応していません。
2.0で動かす場合は、1.0があるプロジェクトからSteamVR_Controller.csを導入してください</font>

#前説
VIVEをUnityで触る方法は[ここ](https://framesynthesis.jp/tech/unity/htcvive/)を良く参照すると思いますが、毎回TrackedObjectやらDeviceを取得するのが面倒くさい。ButtonMaskを呼び出すのすら面倒くさい。なのでコントローラ関係のクラスを1個作って、それを継承する形でコーディングを楽にしよう。


#コード
```cs:ControllerEvent.cs
using UnityEngine;

namespace VIVEHelper
{
    public class ControllerEvent : MonoBehaviour
    {
        public SteamVR_TrackedObject Controller;
        private SteamVR_Controller.Device device;

        protected Vector2 TouchPadValue => device.GetAxis();
        protected float TriggerValue => device.GetAxis(Valve.VR.EVRButtonId.k_EButton_SteamVR_Trigger).x;

        // Use this for initialization
        private void Start()
        {
            if (Controller)
                device = SteamVR_Controller.Input((int)Controller.index);

        }

        // Update is called once per frame
        protected void Update()
        {
            if (device != null)
                ControllerFunction(device);
            else if (Controller)
                device = SteamVR_Controller.Input((int)Controller.index);
        }

        protected void Pulse(ushort pulse)
        {
            device.TriggerHapticPulse(pulse);
        }

        private void ControllerFunction(SteamVR_Controller.Device device)
        {
            if (device.GetTouchDown(SteamVR_Controller.ButtonMask.Trigger))
            {
                TriggerTouchDown();
                //Debug.Log("トリガーを浅く引いた");
            }
            if (device.GetPressDown(SteamVR_Controller.ButtonMask.Trigger))
            {
                TriggerPressDown();
                //Debug.Log("トリガーを深く引いた");
            }
            if (device.GetTouchUp(SteamVR_Controller.ButtonMask.Trigger))
            {
                TriggeTouchUp();
                //Debug.Log("トリガーを離した");
            }
            if (device.GetPressDown(SteamVR_Controller.ButtonMask.Touchpad))
            {
                TouchpadPressDown();
                //Debug.Log("タッチパッドをクリックした");
            }
            if (device.GetPress(SteamVR_Controller.ButtonMask.Touchpad))
            {
                TouchpadPress();
                //Debug.Log("タッチパッドをクリックしている");
            }
            if (device.GetPressUp(SteamVR_Controller.ButtonMask.Touchpad))
            {
                TouchpadPressUp();

                //Debug.Log("タッチパッドをクリックして離した");
            }
            if (device.GetTouchDown(SteamVR_Controller.ButtonMask.Touchpad))
            {
                TouchpadTouchDown();

                //Debug.Log("タッチパッドに触った");
            }
            if (device.GetTouchUp(SteamVR_Controller.ButtonMask.Touchpad))
            {
                TouchpadTouchUp();

                //Debug.Log("タッチパッドを離した");
            }
            if (device.GetPressDown(SteamVR_Controller.ButtonMask.ApplicationMenu))
            {
                ApplicationMenuPressDown();
                //Debug.Log("メニューボタンをクリックした");
            }
            if (device.GetPressDown(SteamVR_Controller.ButtonMask.Grip))
            {
                GripPressDown();
                //Debug.Log("グリップボタンをクリックした");
            }

            if (device.GetTouch(SteamVR_Controller.ButtonMask.Trigger))
            {
                TriggerTouch();
                //Debug.Log("トリガーを浅く引いている");
            }
            if (device.GetPress(SteamVR_Controller.ButtonMask.Trigger))
            {
                TriggerPress();
                //Debug.Log("トリガーを深く引いている");
            }
            if (device.GetTouch(SteamVR_Controller.ButtonMask.Touchpad))
            {
                TouchPadTouch();
                //Debug.Log("タッチパッドに触っている");
            }
        }


        protected virtual void TouchPadTouch()
        {
            return;
        }

        protected virtual void TouchpadPressDown()
        {
            return;

        }
        protected virtual void TriggerPress()
        {
            return;
        }


        protected virtual void TriggerTouch()
        {
            return;
        }

        protected virtual void GripPressDown()
        {
            return;
        }

        protected virtual void ApplicationMenuPressDown()
        {
            return;
        }


        protected virtual void TouchpadTouchUp()
        {
            return;
        }


        protected virtual void TouchpadPressUp()
        {
            return;
        }


        protected virtual void TouchpadPress()
        {
            return;
        }


        protected virtual void TouchpadTouchDown()
        {
            return;
        }


        protected virtual void TriggeTouchUp()
        {
            return;
        }


        protected virtual void TriggerPressDown()
        {
            return;
        }


        protected virtual void TriggerTouchDown()
        {
            return;
        }
    }
}
```

#説明
作ったあとに、「Actionで制御した方がよかったのでは?」みたいなことも考えたけど、まあ作っちゃったので気にしない。デバッグ表示をそれぞれに書くべきだしそのためのvirtualだけど、ただ面倒くさいだけなので放置。

Editor上で入力を受け付けたいコントローラをアタッチして、各メソッドを必要に応じてオーバーライドすれば完了。
今度からのコーディングをサボることが出来る