using System.Collections; using System.Collections.Generic; using Unity.XR.PXR; using UnityEngine; using UnityEngine.XR; using static Unity.XR.PXR.PXR_Input; public class MRInput : MonoBehaviour { public static MRInput Ins { get; private set; } private InputDevice _leftHandDevice; private InputDevice _rightHandDevice; #if UNITY_EDITOR [UnityEngine.DisplayOnly] #endif public bool pressLeftTrigger = false; private bool _lastPressLeftTrigger = false; private List _clickLeftTriggerhandlers = new List(); #if UNITY_EDITOR [UnityEngine.DisplayOnly] #endif public bool holdPressLeftTrigger = false; private List _holdPressLeftTriggerhandlers = new List(); #if UNITY_EDITOR [UnityEngine.DisplayOnly] #endif public bool pressRightTrigger = false; private bool _lastPressRightTrigger = false; private List _clickRightTriggerhandlers = new List(); #if UNITY_EDITOR [UnityEngine.DisplayOnly] #endif public bool holdPressRightTrigger = false; private List _holdPressRightTriggerhandlers = new List(); void Start() { Ins = this; #if !UNITY_EDITOR && UNITY_ANDROID && PICO _leftHandDevice = InputDevices.GetDeviceAtXRNode(XRNode.LeftHand); _rightHandDevice = InputDevices.GetDeviceAtXRNode(XRNode.RightHand); #endif } /// /// 注册点击左trigger事件 /// public void RegisterClickLeftTrigger(System.Action handler) { _clickLeftTriggerhandlers.Add(handler); } /// /// 注册点击左trigger持续点击事件 /// public void RegisterHoldPressLeftTrigger(System.Action handler) { _holdPressLeftTriggerhandlers.Add(handler); } /// /// 注册点击右trigger事件 /// public void RegisterClickRrightTrigger(System.Action handler) { _clickRightTriggerhandlers.Add(handler); } /// /// 注册点击右trigger持续点击事件 /// public void RegisterHoldPressRightTrigger(System.Action handler) { _holdPressRightTriggerhandlers.Add(handler); } /// /// 注销持续点击右trigger事件 /// public void UnregisterHoldPressRightTrigger(System.Action handler) { if (_holdPressRightTriggerhandlers.Contains(handler)) _holdPressRightTriggerhandlers.Remove(handler); } /// /// 震动左手控制器 /// public void VibrateLeftController(float amplitude, int duration, int frequency = 150) { #if !UNITY_EDITOR && UNITY_ANDROID && PICO PXR_Input.SendHapticImpulse(VibrateType.LeftController, amplitude, duration, frequency); #endif } /// /// 震动右手控制器 /// public void VibrateRightController(float amplitude, int duration, int frequency = 150) { #if !UNITY_EDITOR && UNITY_ANDROID && PICO PXR_Input.SendHapticImpulse(VibrateType.RightController, amplitude, duration, frequency); #endif } void Update() { if (GameLocal.Ins.self == null || GameLocal.Ins.self.isDie) return; if (GameManager.Ins == null || !GameManager.Ins.isStart) return; #if !UNITY_EDITOR && UNITY_ANDROID && PICO if (_leftHandDevice != null) { bool isTrigger = false; _leftHandDevice.TryGetFeatureValue(CommonUsages.triggerButton, out isTrigger); pressLeftTrigger = isTrigger; if (!_lastPressLeftTrigger && pressLeftTrigger) { for (int i = 0; i < _clickLeftTriggerhandlers.Count; i++) { _clickLeftTriggerhandlers[i].Invoke(); } } _lastPressLeftTrigger = isTrigger; holdPressLeftTrigger = isTrigger; if (holdPressLeftTrigger) { for (int i = 0; i < _holdPressLeftTriggerhandlers.Count; i++) { _holdPressLeftTriggerhandlers[i].Invoke(); } } } if (_rightHandDevice != null) { bool isTrigger = false; _rightHandDevice.TryGetFeatureValue(CommonUsages.triggerButton, out isTrigger); pressRightTrigger = isTrigger; if (!_lastPressRightTrigger && pressRightTrigger) { for (int i = 0; i < _clickRightTriggerhandlers.Count; i++) { _clickRightTriggerhandlers[i].Invoke(); } } _lastPressRightTrigger = isTrigger; holdPressRightTrigger = isTrigger; if (holdPressRightTrigger) { for (int i = 0; i < _holdPressRightTriggerhandlers.Count; i++) { _holdPressRightTriggerhandlers[i].Invoke(); } } } #elif UNITY_EDITOR pressLeftTrigger = Input.GetKey(KeyCode.Alpha1) ? true : false; if (Input.GetKeyDown(KeyCode.Alpha1)) { for (int i = 0; i < _clickLeftTriggerhandlers.Count; i++) { _clickLeftTriggerhandlers[i].Invoke(); } } else if (Input.GetKey(KeyCode.Alpha1)) { for (int i = 0; i < _holdPressLeftTriggerhandlers.Count; i++) { _holdPressLeftTriggerhandlers[i].Invoke(); } } pressRightTrigger = Input.GetKey(KeyCode.Alpha2) ? true : false; if (Input.GetKeyDown(KeyCode.Alpha2)) { for (int i = 0; i < _clickRightTriggerhandlers.Count; i++) { _clickRightTriggerhandlers[i].Invoke(); } } else if (Input.GetKey(KeyCode.Alpha2)) { for (int i = 0; i < _holdPressRightTriggerhandlers.Count; i++) { _holdPressRightTriggerhandlers[i].Invoke(); } } #endif } }