简体中文 | English

如果需要使用P1或P1 Pro的3dof手柄,可参照以下方法。

本教程适用于DPVRUnity0.7.2 - DPVRUnity0.7.4,最新DPVRUnity0.7.6或更新版本使用的是另一套机制(DpnEventSystem或者DpnStandaloneInputModule)。请参看《我的第一个VR应用(Unity)》《现有Unity3D游戏的VR移植教程》


1. 修改设置

a) Menu/DPVR/Setting


a) “Peripheral Support” “Filp”,并点击 ”apply”


2. 场景测试

选择场景:GazeCursor (Assets/DPN/Scenes/GazeCursor)


场景介绍:

Cube:点击会播放粒子效果

Canvas

--Panel

--Button : 点击会触发Cube播放粒子效果。

DpnCameraRig:替换场景默认的MainCamera。


3. 场景预览



4. 修改脚本

DpnManager.cs(Assets/DPN/Scripts/) 157

public static bool DPVRPointer = false;

改为

public static bool DPVRPointer = true;

当该值为true时,使用Deepoon提供的射线以及光标;

如想使用自己的射线及光标,将该值设置为false。


5. 编译运行

File/Build Setting/Android/Build and Run

带上头盔,使用手柄,可以看到场景中会有一根线指示方向。线的终端有一个圆点,当Cube或者button交互时,会变成一个圈。此时,按下按键Cube会有粒子效果。

注:当触摸头盔上的的touchpad时,会自动切换成头控模式。当使用手柄时,会切换成手柄操控模式。当没有手柄或休眠等处在手柄状态无法获取时,会启用头控;当手柄正常运行后,会自动切换回手柄操控模式。如果系统有指定的设备,则使用系统指定的设备,并且在运行时切换设备,会修改系统使用的设备。


6. 代码解析

初始化

a) 首先创建头控设备。并将内部对象(光标,射线等)设置为无效。

// DpnCameraRig.OnEnable()

if (DpnManager.DPVRPointer)

{

DpnPointerPhysicsRaycaster raycaster = _center_transform.gameObject.AddComponent<DpnPointerPhysicsRaycaster>();

raycaster.raycastMode = DpnBasePointerRaycaster.RaycastMode.Direct;

raycaster.enabled = true;

Transform Pointer = Instantiate(reticlePointer);

Pointer.SetParent(raycaster.transform);

Pointer.transform.localPosition = new Vector3(0.0f, 0.0f, 2.0f);

Pointer.gameObject.SetActive(true);

_nonePointer = Pointer.gameObject;

_noneRaycaster = raycaster;

}

_hmdPeripheral = this;

_hmdPeripheral.EnableInternalObjects(false);


b) 创建Setting选择的设备(Flip),并将其设置为默认设备,将内部对象设置为无效。

// DpnCameraRig.OnEnable()

switch (DpnManager.peripheral)

{

//case ……

case DPVRPeripheral.Flip:

{

Transform Peripheral = Instantiate(Flip);

Peripheral.parent = this.transform;

Transform controller_right = Peripheral.FindChild("controller(right)");

if (controller_right == null)

break;

_defaultPeripheral = controller_right.GetComponent<DpnDaydreamController>();

_defaultPeripheral.EnableInternalObjects(false);

break;

}

//case ……


c) 启用默认设备(配置中的选择项)。

// DpnCameraRig.OnEnable() 148

SetPeripheral(_defaultPeripheral);


d) 根据系统配置,选择设备(如果系统指定), interativeType等于0表示使用touchpad,等于 1表示使用手柄;等于 -1 表示无系统指定项。

// DpnCameraRig.Start()

void Start()

{

SetPeripheralFollowSystem();

}

private void SetPeripheralFollowSystem()

{

_interativeType = GetInteractiveType();

if (_interativeType == 0)

{

SetPeripheral(_hmdPeripheral);

}

else if (_interativeType == 1)

{

SetPeripheral(_defaultPeripheral);

}

}

如果系统有指定使用的设备,使用系统指定的设备(进入app时,系统使用的操控设备),如果没指定(interativeType == -1),则使用默认的设备。


e) 运行时切换

Start时检测,若此时设备断开,发送断开消息。

void Start()

{

CheckConnectState();

}

void CheckConnectState()

{

ReadState(controllerState, lastcontrollerState);

if (controllerState.connectionState != DpnConnectionState.Connected)

{

OnDisconnected();

}

}


每一帧检测正在使用的设备

// DpnCameraRig.DpnpUpdate() 294

public override void DpnpUpdate()

{

//……

UpdatePeripheral();

//……

}


首先判断是否需要跟随系统, InterctiveType等于0或1表示跟随系统;等于-1表示不需要(有手柄则使用手柄,否则使用头控)。

检测到手柄正在使用时,切换手柄操控。并修改系统使用的操控方式;

当检测到触摸了头盔的touchpad,切换头控操控;并修改系统使用的操控设备。

// DpnCameraRig.UpdatePeripheral()

void UpdatePeripheral()

{

if (!DpnCameraRig.followSystem)

return;

if (_defaultPeripheral && _defaultPeripheral.BeingUsed())

{

// peripheral

if (_defaultPeripheral != _currentPeripheral)

{

SetPeripheral(_defaultPeripheral);

SetInterctiveType(1);

}

}

else

{

// touch pad

int count = Input.touchCount;

if (count != 0)

{

if (_currentPeripheral != _hmdPeripheral)

{

SetPeripheral(_hmdPeripheral);

SetInterctiveType(0);

}

}

}

}


检测手柄连接状态,当检测到状态改变时,发送连接/断开连接消息,在DpnCameraRig中响应消息; 由CameraRig设置当前使用的设备,并修改系统使用的操控设备。

// DpnDaydreamController.DpnpUpdate()

// ……..

if(controllerState.connectionState != lastcontrollerState.connectionState)

{

switch(controllerState.connectionState)

{

case DpnConnectionState.Error:

break;

case DpnConnectionState.Disconnected:

SendMessageUpwards("OnPeripheralDisconnected", this);

break;

case DpnConnectionState.Connected:

SendMessageUpwards("OnPeripheralConnected", this);

break;

}

}

//………


处理设备连接:当跟随系统时,根据系统设置当前使用的设备;否则,使用连接的设备。

// DpnCameraRig.OnPeripheralConnected()

void OnPeripheralConnected(DpnBasePeripheral peripheral)

{

if (DpnCameraRig.followSystem)

SetPeripheralFollowSystem();

else

SetPeripheral(peripheral);

}


处理设备断开连接:当跟随系统时,根据系统设置当前使用的设备;否则,使用头控。

// DpnCameraRig.OnPeripheralDisconnected()

void OnPeripheralDisconnected(DpnBasePeripheral peripheral)

{

if (DpnCameraRig.followSystem)

SetPeripheralFollowSystem();

else

SetPeripheral(_hmdPeripheral);

}




Copyright © dpvr.cn, All Rights Reserved 沪ICP备15019466号-2 (Shanghai) Shanghai Lexiang Technology Co., Ltd