VR模拟枪支打靶,消灭鬼怪,换弹以及上弦等等硬核枪支操作。 使用HTCVive设备,开启SteamVR进行游玩。
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 

316 lines
15 KiB

//========= Copyright 2016-2018, HTC Corporation. All rights reserved. ===========
#if UNITY_5_5_OR_NEWER && !UNITY_2017_1_OR_NEWER
using HTC.UnityPlugin.Utility;
using System.Text.RegularExpressions;
using UnityEngine;
using UnityEngine.VR;
#endif
namespace HTC.UnityPlugin.VRModuleManagement
{
public sealed partial class UnityEngineVRModule : VRModule.ModuleBase
{
#if UNITY_5_5_OR_NEWER && !UNITY_2017_1_OR_NEWER
private static readonly Regex m_viveRgx = new Regex("^.*(htc|vive|openvr).*$", RegexOptions.IgnoreCase);
private static readonly Regex m_oculusRgx = new Regex("^.*(oculus).*$", RegexOptions.IgnoreCase);
private static readonly Regex m_leftRgx = new Regex("^.*left.*$", RegexOptions.IgnoreCase);
private static readonly Regex m_rightRgx = new Regex("^.*right.*$", RegexOptions.IgnoreCase);
private readonly uint m_headIndex = 0u;
private readonly uint m_leftIndex = 1u;
private readonly uint m_rightIndex = 2u;
private string m_leftJoystickName = string.Empty;
private string m_rightJoystickName = string.Empty;
private int m_leftJoystickNameIndex = -1;
private int m_rightJoystickNameIndex = -1;
#if UNITY_5_6_OR_NEWER
private TrackingSpaceType m_prevTrackingSpace;
public override void OnActivated()
{
m_prevTrackingSpace = VRDevice.GetTrackingSpaceType();
UpdateTrackingSpaceType();
}
public override void OnDeactivated()
{
VRDevice.SetTrackingSpaceType(m_prevTrackingSpace);
}
public override void UpdateTrackingSpaceType()
{
switch (VRModule.trackingSpaceType)
{
case VRModuleTrackingSpaceType.Stationary:
VRDevice.SetTrackingSpaceType(TrackingSpaceType.Stationary);
break;
case VRModuleTrackingSpaceType.RoomScale:
VRDevice.SetTrackingSpaceType(TrackingSpaceType.RoomScale);
break;
}
}
#endif
public override uint GetLeftControllerDeviceIndex() { return m_leftIndex; }
public override uint GetRightControllerDeviceIndex() { return m_rightIndex; }
public override void UpdateDeviceState(IVRModuleDeviceState[] prevState, IVRModuleDeviceStateRW[] currState)
{
var joystickNames = default(string[]);
// head
var headCurrState = currState[m_headIndex];
var headPrevState = prevState[m_headIndex];
headCurrState.isConnected = VRDevice.isPresent;
if (headCurrState.isConnected)
{
if (!headPrevState.isConnected)
{
headCurrState.deviceClass = VRModuleDeviceClass.HMD;
headCurrState.serialNumber = VRDevice.model + " HMD";
headCurrState.modelNumber = VRDevice.model + " HMD";
if (m_viveRgx.IsMatch(VRDevice.model))
{
headCurrState.deviceModel = VRModuleDeviceModel.ViveHMD;
}
else if (m_oculusRgx.IsMatch(VRDevice.model))
{
headCurrState.deviceModel = VRModuleDeviceModel.OculusHMD;
}
else
{
headCurrState.deviceModel = VRModuleDeviceModel.Unknown;
}
headCurrState.renderModelName = VRDevice.model + " " + headCurrState.deviceModel.ToString();
}
headCurrState.position = InputTracking.GetLocalPosition(VRNode.Head);
headCurrState.rotation = InputTracking.GetLocalRotation(VRNode.Head);
headCurrState.isPoseValid = headCurrState.pose != RigidPose.identity && headCurrState.pose != headPrevState.pose;
}
else
{
if (headPrevState.isConnected)
{
headCurrState.Reset();
}
}
// right
var rightCurrState = currState[m_rightIndex];
var rightPrevState = prevState[m_rightIndex];
rightCurrState.position = InputTracking.GetLocalPosition(VRNode.RightHand);
rightCurrState.rotation = InputTracking.GetLocalRotation(VRNode.RightHand);
rightCurrState.isPoseValid = rightCurrState.pose != RigidPose.identity && rightCurrState.pose != rightPrevState.pose;
// right connected state
if (rightCurrState.isPoseValid)
{
if (!rightPrevState.isConnected)
{
if (joystickNames == null) { joystickNames = Input.GetJoystickNames(); }
for (int i = joystickNames.Length - 1; i >= 0; --i)
{
if (!string.IsNullOrEmpty(joystickNames[i]) && m_rightRgx.IsMatch(joystickNames[i]))
{
rightCurrState.isConnected = true;
m_rightJoystickName = joystickNames[i];
m_rightJoystickNameIndex = i;
break;
}
}
}
}
else
{
if (rightPrevState.isConnected)
{
if (joystickNames == null) { joystickNames = Input.GetJoystickNames(); }
if (string.IsNullOrEmpty(joystickNames[m_rightJoystickNameIndex]))
{
rightCurrState.isConnected = false;
m_rightJoystickName = string.Empty;
m_rightJoystickNameIndex = -1;
}
}
}
// right input state
if (rightCurrState.isConnected)
{
if (!rightPrevState.isConnected)
{
rightCurrState.deviceClass = VRModuleDeviceClass.Controller;
rightCurrState.serialNumber = m_rightJoystickName;
rightCurrState.modelNumber = VRDevice.model + " Controller";
if (m_viveRgx.IsMatch(VRDevice.model))
{
rightCurrState.deviceModel = VRModuleDeviceModel.ViveController;
}
else if (m_oculusRgx.IsMatch(VRDevice.model))
{
rightCurrState.deviceModel = VRModuleDeviceModel.OculusTouchRight;
}
else
{
rightCurrState.deviceModel = VRModuleDeviceModel.Unknown;
}
rightCurrState.renderModelName = VRDevice.model + " " + rightCurrState.deviceModel.ToString();
}
var rightMenuPress = Input.GetKey(ButtonKeyCode.RMenuPress);
var rightAButtonPress = Input.GetKey(ButtonKeyCode.RAKeyPress);
var rightPadPress = Input.GetKey(ButtonKeyCode.RPadPress);
var rightMenuTouch = Input.GetKey(ButtonKeyCode.RMenuTouch);
var rightAButtonTouch = Input.GetKey(ButtonKeyCode.RAKeyTouch);
var rightPadTouch = Input.GetKey(ButtonKeyCode.RPadTouch);
var rightTriggerTouch = Input.GetKey(ButtonKeyCode.RTriggerTouch);
var rightTrackpadX = Input.GetAxisRaw(ButtonAxisName.RPadX);
var rightTrackpadY = Input.GetAxisRaw(ButtonAxisName.RPadY);
var rightTrigger = Input.GetAxisRaw(ButtonAxisName.RTrigger);
var rightGrip = Input.GetAxisRaw(ButtonAxisName.RGrip);
rightCurrState.SetButtonPress(VRModuleRawButton.ApplicationMenu, rightMenuPress);
rightCurrState.SetButtonPress(VRModuleRawButton.A, rightAButtonPress);
rightCurrState.SetButtonPress(VRModuleRawButton.Touchpad, rightPadPress);
rightCurrState.SetButtonPress(VRModuleRawButton.Trigger, AxisToPress(rightPrevState.GetButtonPress(VRModuleRawButton.Trigger), rightTrigger, 0.55f, 0.45f));
rightCurrState.SetButtonPress(VRModuleRawButton.Grip, AxisToPress(rightPrevState.GetButtonPress(VRModuleRawButton.Grip), rightGrip, 0.55f, 0.45f));
rightCurrState.SetButtonPress(VRModuleRawButton.CapSenseGrip, AxisToPress(rightPrevState.GetButtonPress(VRModuleRawButton.CapSenseGrip), rightGrip, 0.55f, 0.45f));
rightCurrState.SetButtonTouch(VRModuleRawButton.ApplicationMenu, rightMenuTouch);
rightCurrState.SetButtonTouch(VRModuleRawButton.A, rightAButtonTouch);
rightCurrState.SetButtonTouch(VRModuleRawButton.Touchpad, rightPadTouch);
rightCurrState.SetButtonTouch(VRModuleRawButton.Trigger, rightTriggerTouch);
rightCurrState.SetButtonTouch(VRModuleRawButton.CapSenseGrip, AxisToPress(rightPrevState.GetButtonTouch(VRModuleRawButton.CapSenseGrip), rightGrip, 0.25f, 0.20f));
rightCurrState.SetAxisValue(VRModuleRawAxis.TouchpadX, rightTrackpadX);
rightCurrState.SetAxisValue(VRModuleRawAxis.TouchpadY, rightTrackpadY);
rightCurrState.SetAxisValue(VRModuleRawAxis.Trigger, rightTrigger);
rightCurrState.SetAxisValue(VRModuleRawAxis.CapSenseGrip, rightGrip);
}
else
{
if (rightPrevState.isConnected)
{
rightCurrState.Reset();
}
}
// left
var leftCurrState = currState[m_leftIndex];
var leftPrevState = prevState[m_leftIndex];
leftCurrState.position = InputTracking.GetLocalPosition(VRNode.LeftHand);
leftCurrState.rotation = InputTracking.GetLocalRotation(VRNode.LeftHand);
leftCurrState.isPoseValid = leftCurrState.pose != RigidPose.identity && leftCurrState.pose != leftPrevState.pose;
// left connected state
if (leftCurrState.isPoseValid)
{
if (!leftPrevState.isConnected)
{
if (joystickNames == null) { joystickNames = Input.GetJoystickNames(); }
for (int i = joystickNames.Length - 1; i >= 0; --i)
{
if (!string.IsNullOrEmpty(joystickNames[i]) && m_leftRgx.IsMatch(joystickNames[i]))
{
leftCurrState.isConnected = true;
m_leftJoystickName = joystickNames[i];
m_leftJoystickNameIndex = i;
break;
}
}
}
}
else
{
if (leftPrevState.isConnected)
{
if (joystickNames == null) { joystickNames = Input.GetJoystickNames(); }
if (string.IsNullOrEmpty(joystickNames[m_leftJoystickNameIndex]))
{
leftCurrState.isConnected = false;
m_leftJoystickName = string.Empty;
m_leftJoystickNameIndex = -1;
}
}
}
// left input state
if (leftCurrState.isConnected)
{
if (!leftPrevState.isConnected)
{
leftCurrState.deviceClass = VRModuleDeviceClass.Controller;
leftCurrState.serialNumber = m_leftJoystickName;
leftCurrState.modelNumber = VRDevice.model + " Controller";
if (m_viveRgx.IsMatch(VRDevice.model))
{
leftCurrState.deviceModel = VRModuleDeviceModel.ViveController;
}
else if (m_oculusRgx.IsMatch(VRDevice.model))
{
leftCurrState.deviceModel = VRModuleDeviceModel.OculusTouchLeft;
}
else
{
leftCurrState.deviceModel = VRModuleDeviceModel.Unknown;
}
leftCurrState.renderModelName = VRDevice.model + " " + leftCurrState.deviceModel.ToString();
}
var leftMenuPress = Input.GetKey(ButtonKeyCode.LMenuPress);
var leftAButtonPress = Input.GetKey(ButtonKeyCode.LAKeyPress);
var leftPadPress = Input.GetKey(ButtonKeyCode.LPadPress);
var leftMenuTouch = Input.GetKey(ButtonKeyCode.LMenuTouch);
var leftAButtonTouch = Input.GetKey(ButtonKeyCode.LAKeyTouch);
var leftPadTouch = Input.GetKey(ButtonKeyCode.LPadTouch);
var leftTriggerTouch = Input.GetKey(ButtonKeyCode.LTriggerTouch);
var leftTrackpadX = Input.GetAxisRaw(ButtonAxisName.LPadX);
var leftTrackpadY = Input.GetAxisRaw(ButtonAxisName.LPadY);
var leftTrigger = Input.GetAxisRaw(ButtonAxisName.LTrigger);
var leftGrip = Input.GetAxisRaw(ButtonAxisName.LGrip);
leftCurrState.SetButtonPress(VRModuleRawButton.ApplicationMenu, leftMenuPress);
leftCurrState.SetButtonPress(VRModuleRawButton.A, leftAButtonPress);
leftCurrState.SetButtonPress(VRModuleRawButton.Touchpad, leftPadPress);
leftCurrState.SetButtonPress(VRModuleRawButton.Trigger, AxisToPress(leftPrevState.GetButtonPress(VRModuleRawButton.Trigger), leftTrigger, 0.55f, 0.45f));
leftCurrState.SetButtonPress(VRModuleRawButton.Grip, AxisToPress(leftPrevState.GetButtonPress(VRModuleRawButton.Grip), leftGrip, 0.55f, 0.45f));
leftCurrState.SetButtonPress(VRModuleRawButton.CapSenseGrip, AxisToPress(leftPrevState.GetButtonPress(VRModuleRawButton.CapSenseGrip), leftGrip, 0.55f, 0.45f));
leftCurrState.SetButtonTouch(VRModuleRawButton.ApplicationMenu, leftMenuTouch);
leftCurrState.SetButtonTouch(VRModuleRawButton.A, leftAButtonTouch);
leftCurrState.SetButtonTouch(VRModuleRawButton.Touchpad, leftPadTouch);
leftCurrState.SetButtonTouch(VRModuleRawButton.Trigger, leftTriggerTouch);
leftCurrState.SetButtonTouch(VRModuleRawButton.CapSenseGrip, AxisToPress(leftPrevState.GetButtonTouch(VRModuleRawButton.CapSenseGrip), leftGrip, 0.25f, 0.20f));
leftCurrState.SetAxisValue(VRModuleRawAxis.TouchpadX, leftTrackpadX);
leftCurrState.SetAxisValue(VRModuleRawAxis.TouchpadY, leftTrackpadY);
leftCurrState.SetAxisValue(VRModuleRawAxis.Trigger, leftTrigger);
leftCurrState.SetAxisValue(VRModuleRawAxis.CapSenseGrip, leftGrip);
}
else
{
if (leftPrevState.isConnected)
{
leftCurrState.Reset();
}
}
}
#endif
}
}