Files
Zombie/Assets/_Zombie/Scripts/MRInput.cs

194 lines
5.8 KiB
C#

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<System.Action> _clickLeftTriggerhandlers = new List<System.Action>();
#if UNITY_EDITOR
[UnityEngine.DisplayOnly]
#endif
public bool holdPressLeftTrigger = false;
private List<System.Action> _holdPressLeftTriggerhandlers = new List<System.Action>();
#if UNITY_EDITOR
[UnityEngine.DisplayOnly]
#endif
public bool pressRightTrigger = false;
private bool _lastPressRightTrigger = false;
private List<System.Action> _clickRightTriggerhandlers = new List<System.Action>();
#if UNITY_EDITOR
[UnityEngine.DisplayOnly]
#endif
public bool holdPressRightTrigger = false;
private List<System.Action> _holdPressRightTriggerhandlers = new List<System.Action>();
void Start()
{
Ins = this;
#if !UNITY_EDITOR && UNITY_ANDROID && PICO
_leftHandDevice = InputDevices.GetDeviceAtXRNode(XRNode.LeftHand);
_rightHandDevice = InputDevices.GetDeviceAtXRNode(XRNode.RightHand);
#endif
}
/// <summary>
/// 注册点击左trigger事件
/// </summary>
public void RegisterClickLeftTrigger(System.Action handler)
{
_clickLeftTriggerhandlers.Add(handler);
}
/// <summary>
/// 注册点击左trigger持续点击事件
/// </summary>
public void RegisterHoldPressLeftTrigger(System.Action handler)
{
_holdPressLeftTriggerhandlers.Add(handler);
}
/// <summary>
/// 注册点击右trigger事件
/// </summary>
public void RegisterClickRrightTrigger(System.Action handler)
{
_clickRightTriggerhandlers.Add(handler);
}
/// <summary>
/// 注册点击右trigger持续点击事件
/// </summary>
public void RegisterHoldPressRightTrigger(System.Action handler)
{
_holdPressRightTriggerhandlers.Add(handler);
}
/// <summary>
/// 震动左手控制器
/// </summary>
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
}
/// <summary>
/// 震动右手控制器
/// </summary>
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
}
}