LoginSignup
7
9

More than 3 years have passed since last update.

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

Last updated at Posted at 2018-07-17

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

前説

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

コード

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

7
9
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
9