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