WaveVR_Controller

介绍

请参照 UnrealAPIUsageLevel 以了解 API 兼容性。

WaveVR_Controller.cs 提供开发者一个取用控制器的界面。

透过使用 WaveVR_Controller,开发者能够很容易的取得装置上按钮的状态/轴向,以及装置本身的姿势。

_images/controller_test.png

使用方法

装置类型 (Device Type)

WaveVR API 接口提供装置类型如下:

public enum WVR_DeviceType
{
        WVR_DeviceType_Invalid = 0,
        WVR_DeviceType_HMD = 1,
        WVR_DeviceType_Controller_Right = 2,
        WVR_DeviceType_Controller_Left = 3,
};

WaveVR Unity SDK 提供装置类型如下:

public enum EDeviceType
{
        Head = 1,
        Dominant = 2,
        NonDominant = 3
};

两者皆可使用在 WaveVR_Controller,范例代码如下:

WaveVR_Controller.Input( <device type> )

// e.g.
WaveVR_Controller.Device _dev = WaveVR_Controller.Input(WVR_DeviceType.WVR_DeviceType_Controller_Right);
// or
WaveVR_Controller.Device _dev = WaveVR_Controller.Input(WaveVR_Controller.EDeviceType.Dominant);

Right / Left 指左右手,但容易造成混淆。

因为在 Unity 场景,对象本身具有左手或右手的类型,在现实中,实体装置也具有左手或右手的类型。 在右撇子模式,右手装置对应到右手 Unity 对象。 在左撇子模式,左手装置对应到右手 Unity 对象。

在 WaveVR_Controller 中,会替开发者处理左右撇子模式中的类别对应。 所以开发者无需关注实体装置的类型,只要指定 Unity 对象的类别以取得 WaveVR_Controller.Device 即可。

细节请参考 左撇子模式

Dominant / NonDominant 指惯用手或非惯用手,用来避左右手类别造成的混淆。介绍在 Dominant Hand (惯用手)

按键 (Button ID)

WaveVR API 介绍提供下列按键:

public enum WVR_InputId
{
        WVR_InputId_Alias1_System               = WVR_InputId_0,
        WVR_InputId_Alias1_Menu                 = WVR_InputId_1,
        WVR_InputId_Alias1_Grip                 = WVR_InputId_2,
        WVR_InputId_Alias1_DPad_Left    = WVR_InputId_3,
        WVR_InputId_Alias1_DPad_Up              = WVR_InputId_4,
        WVR_InputId_Alias1_DPad_Right   = WVR_InputId_5,
        WVR_InputId_Alias1_DPad_Down    = WVR_InputId_6,
        WVR_InputId_Alias1_Volume_Up    = WVR_InputId_7,
        WVR_InputId_Alias1_Volume_Down  = WVR_InputId_8,
        WVR_InputId_Alias1_Digital_Trigger = WVR_InputId_9,
        WVR_InputId_Alias1_Back                 = WVR_InputId_14,   // HMD Back Button
        WVR_InputId_Alias1_Enter                = WVR_InputId_15,   // HMD Enter Button
        WVR_InputId_Alias1_Touchpad             = WVR_InputId_16,
        WVR_InputId_Alias1_Trigger              = WVR_InputId_17,
        WVR_InputId_Alias1_Thumbstick   = WVR_InputId_18,
}

WaveVR Unity SDK 提供下列按键:

public enum EButtons
{
        Unavailable = WVR_InputId.WVR_InputId_Alias1_System,
        Menu = WVR_InputId.WVR_InputId_Alias1_Menu,
        Grip = WVR_InputId.WVR_InputId_Alias1_Grip,
        DPadUp = WVR_InputId.WVR_InputId_Alias1_DPad_Up,
        DPadRight = WVR_InputId.WVR_InputId_Alias1_DPad_Right,
        DPadDown = WVR_InputId.WVR_InputId_Alias1_DPad_Down,
        DPadLeft = WVR_InputId.WVR_InputId_Alias1_DPad_Left,
        VolumeUp = WVR_InputId.WVR_InputId_Alias1_Volume_Up,
        VolumeDown = WVR_InputId.WVR_InputId_Alias1_Volume_Down,
        HMDBack = WVR_InputId.WVR_InputId_Alias1_Back,
        HMDEnter = WVR_InputId.WVR_InputId_Alias1_Enter,
        Touchpad = WVR_InputId.WVR_InputId_Alias1_Touchpad,
        Trigger = WVR_InputId.WVR_InputId_Alias1_Trigger,
        Thumbstick = WVR_InputId.WVR_InputId_Alias1_Thumbstick
}

目前 WaveVR_Controller 只支持 WVR_InputId,而 EButtons 将会在之后版本支持。范例代码如下:

WaveVR_Controller.Input( <device type> ).GetPress( <Button ID> );               // whether button is pressed.
WaveVR_Controller.Input( <device type> ).GetPressDown( <Button ID> );   // whether button is pressed from unpressed, only 1 frame.
WaveVR_Controller.Input( <device type> ).GetPressUp( <Button ID> );             // whether button is released from pressed, only 1 frame.

WaveVR_Controller.Input( <device type> ).GetTouch( <Button ID> );               // whether button is touched.
WaveVR_Controller.Input( <device type> ).GetTouchDown( <Button ID> );   // whether button is touched from untouched, only 1 frame.
WaveVR_Controller.Input( <device type> ).GetTouchUp( <Button ID> );             // whether button is untouched from touched, only 1 frame.

// e.g.
WaveVR_Controller.Device _dev = WaveVR_Controller.Input(WaveVR_Controller.EDeviceType.Dominant);
bool _press = _dev.GetPress (WVR_InputId.WVR_InputId_Alias1_Touchpad);  // whether touchpad of dominant hand is pressed.

姿势 (Pose)

开发者可以存取装置姿势如下列代码:

WaveVR_Controller.Input( <device type> ).transform;

// e.g.
WaveVR_Controller.Device _dev = WaveVR_Controller.Input(WaveVR_Controller.EDeviceType.Dominant);
WaveVR_Utils.RigidTransform _pose = _dev.transform;             // pose of dominant hand.
Vector3 _position = _pose.pos;
Quaternion _rotation = _pose.rot;

其它信息

联机状态: WaveVR_Controller.Device.connected

速度 (公尺): WaveVR_Controller.Device.velocity

轴位移 (Axis, -1~1): WaveVR_Controller.Device.GetAxis( <Button ID> )

使装置振动: WaveVR_Controller.Device.TriggerHapticPulse();

左撇子模式

WaveVR 提供左撇子模式给用户。

在一般状况下,开发者不需要在 AP 开发中考虑左撇子模式。

例: 开发者使用

WaveVR_Controller.Input(WVR_DeviceType.WVR_DeviceType_Controller_Right).connected

来检查是否右手控制器联机。

在左撇子模式下,这段程序代码一样可用,无需改变。

但如果开发者想要在某个 GameObject 上设计左/右撇子模式下的不同效果,就得知道现在是什么模式。

检查是否左撇子模式:

WaveVR_Controller.IsLeftHanded

取得左撇子模式下的类型:

WaveVR_Controller.Input ( <original type> ).DeviceType

例: 考虑上述检查联机的程序代码

if (WaveVR_Controller.Input(WVR_DeviceType.WVR_DeviceType_Controller_Right).connected)
{
    if (WaveVR_Controller.IsLeftHanded)
    {   // 事实上是左手硬件控制器联机
        // ...
    } else
    {   // 事实上是右手硬件控制器联机
        // ...
    }
}

Dominant Hand (惯用手)

开发者可能会对左撇子模式有点困惑。

不用担心,WaveVR_Controller 提供另一种控制器的定义 – Dominant hand (惯用手)。

惯用手指的是玩家惯用的装置。

例如:在右撇子模式下,惯用手会是右手;左撇子模式下则是左手。

所以开发者可以使用下列范例代码来取得按钮状态、装置联机状态以及姿势。

// e.g. whether trigger button is pressed down.
bool _pressed = WaveVR_Controller.Input (WaveVR_Controller.EDeviceType.Dominant).GetPressDown (WVR_InputId.WVR_InputId_Alias1_Trigger);
// e.g connection status
bool _conn = WaveVR_Controller.Input (WaveVR_Controller.EDeviceType.Dominant).connected;
// e.g. device pose
WaveVR_Utils.RigidTransform _rpose = WaveVR_Controller.Input (WaveVR_Controller.EDeviceType.Dominant).transform;

以及开发者如果想知道惯用手目前指的是哪一个装置的话:

// get the device corresponding to dominant hand
WVR_DeviceType _dev = WaveVR_Controller.Input (WaveVR_Controller.EDeviceType.Dominant).DeviceType;