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.

164 lines
6.4 KiB

3 years ago
//========= Copyright 2016-2018, HTC Corporation. All rights reserved. ===========
#if VIU_GOOGLEVR && UNITY_5_6_OR_NEWER
using UnityEngine;
using HTC.UnityPlugin.Utility;
using HTC.UnityPlugin.Vive;
#if UNITY_2017_2_OR_NEWER
using UnityEngine.XR;
#else
using XRSettings = UnityEngine.VR.VRSettings;
using XRDevice = UnityEngine.VR.VRDevice;
using XRNode = UnityEngine.VR.VRNode;
using InputTracking = UnityEngine.VR.InputTracking;
#endif
#endif
namespace HTC.UnityPlugin.VRModuleManagement
{
public sealed class GoogleVRModule : VRModule.ModuleBase
{
#if VIU_GOOGLEVR && UNITY_5_6_OR_NEWER
public const uint CONTROLLER_DEVICE_INDEX = 1u;
private GvrHeadset m_gvrHeadSetInstance;
private GvrControllerInput m_gvrCtrlInputInstance;
private GvrArmModel m_gvrArmModelInstance;
public override uint GetRightControllerDeviceIndex() { return CONTROLLER_DEVICE_INDEX; }
public override bool ShouldActiveModule()
{
return VIUSettings.activateGoogleVRModule && XRSettings.enabled && XRSettings.loadedDeviceName == "daydream";
}
public override void UpdateDeviceState(IVRModuleDeviceState[] prevState, IVRModuleDeviceStateRW[] currState)
{
if (m_gvrCtrlInputInstance == null)
{
m_gvrCtrlInputInstance = Object.FindObjectOfType<GvrControllerInput>();
if (m_gvrCtrlInputInstance == null)
{
m_gvrCtrlInputInstance = VRModule.Instance.gameObject.AddComponent<GvrControllerInput>();
}
}
if (GvrControllerInput.State == GvrConnectionState.Error)
{
Debug.LogError(GvrControllerInput.ErrorDetails);
return;
}
if (m_gvrArmModelInstance == null)
{
m_gvrArmModelInstance = VRModule.Instance.GetComponent<GvrArmModel>();
if (m_gvrArmModelInstance == null)
{
m_gvrArmModelInstance = VRModule.Instance.gameObject.AddComponent<GvrArmModel>();
}
}
if (m_gvrHeadSetInstance == null)
{
m_gvrHeadSetInstance = Object.FindObjectOfType<GvrHeadset>();
if (m_gvrHeadSetInstance == null)
{
m_gvrHeadSetInstance = VRModule.Instance.gameObject.AddComponent<GvrHeadset>();
}
}
var headPrevState = prevState[VRModule.HMD_DEVICE_INDEX];
var headCurrState = currState[VRModule.HMD_DEVICE_INDEX];
headCurrState.isConnected = XRDevice.isPresent;
if (headCurrState.isConnected)
{
if (!headPrevState.isConnected)
{
headCurrState.deviceClass = VRModuleDeviceClass.HMD;
headCurrState.serialNumber = XRDevice.model + " HMD";
headCurrState.modelNumber = XRDevice.model + " HMD";
headCurrState.deviceModel = VRModuleDeviceModel.DaydreamHMD;
headCurrState.renderModelName = string.Empty;
}
headCurrState.position = InputTracking.GetLocalPosition(XRNode.Head);
headCurrState.rotation = InputTracking.GetLocalRotation(XRNode.Head);
headCurrState.isPoseValid = headCurrState.pose != RigidPose.identity;
headCurrState.pose = headCurrState.pose;
}
else
{
if (headPrevState.isConnected)
{
headCurrState.Reset();
}
}
var ctrlPrevState = prevState[CONTROLLER_DEVICE_INDEX];
var ctrlCurrState = currState[CONTROLLER_DEVICE_INDEX];
ctrlCurrState.isConnected = GvrControllerInput.State == GvrConnectionState.Connected;
if (ctrlCurrState.isConnected)
{
if (!ctrlPrevState.isConnected)
{
ctrlCurrState.deviceClass = VRModuleDeviceClass.Controller;
ctrlCurrState.serialNumber = XRDevice.model + " Controller";
ctrlCurrState.modelNumber = XRDevice.model + " Controller";
ctrlCurrState.deviceModel = VRModuleDeviceModel.DaydreamController;
ctrlCurrState.renderModelName = string.Empty;
}
ctrlCurrState.pose = new RigidPose(m_gvrArmModelInstance.ControllerPositionFromHead, m_gvrArmModelInstance.ControllerRotationFromHead);
ctrlCurrState.isPoseValid = GvrControllerInput.Orientation != Quaternion.identity;
ctrlCurrState.velocity = GvrControllerInput.Accel;
ctrlCurrState.angularVelocity = GvrControllerInput.Gyro;
ctrlCurrState.SetButtonPress(VRModuleRawButton.Touchpad, GvrControllerInput.ClickButton);
ctrlCurrState.SetButtonPress(VRModuleRawButton.ApplicationMenu, GvrControllerInput.AppButton);
ctrlCurrState.SetButtonPress(VRModuleRawButton.System, GvrControllerInput.HomeButtonState);
ctrlCurrState.SetButtonTouch(VRModuleRawButton.Touchpad, GvrControllerInput.IsTouching);
if (GvrControllerInput.IsTouching)
{
var touchPadPosCentered = GvrControllerInput.TouchPosCentered;
ctrlCurrState.SetAxisValue(VRModuleRawAxis.TouchpadX, touchPadPosCentered.x);
ctrlCurrState.SetAxisValue(VRModuleRawAxis.TouchpadY, touchPadPosCentered.y);
}
else
{
ctrlCurrState.SetAxisValue(VRModuleRawAxis.TouchpadX, 0f);
ctrlCurrState.SetAxisValue(VRModuleRawAxis.TouchpadY, 0f);
}
if (VIUSettings.daydreamSyncPadPressToTrigger)
{
ctrlCurrState.SetButtonPress(VRModuleRawButton.Trigger, GvrControllerInput.ClickButton);
ctrlCurrState.SetButtonTouch(VRModuleRawButton.Trigger, GvrControllerInput.IsTouching);
ctrlCurrState.SetAxisValue(VRModuleRawAxis.Trigger, GvrControllerInput.ClickButton ? 1f : 0f);
}
}
else
{
if (ctrlPrevState.isConnected)
{
ctrlCurrState.Reset();
}
}
}
#endif
}
}