using System; using System.Collections.Generic; using UnityEngine; using UnityEngine.XR; using QFramework; /// <summary> /// 提供各种输入事件 /// </summary> public class InputEvent : MonoSingleton<InputEvent> { //*************输入设别************************** InputDevice leftHandController; InputDevice rightHandController; InputDevice headController; //**************对外提供公开事件****************** #region public event public Action onLeftTriggerEnter; public Action onLeftTriggerDown; public Action onLeftTriggerUp; public Action onRightTriggerEnter; public Action onRightTriggerDown; public Action onRightTriggerUp; public Action onLeftGripEnter; public Action onLeftGripDown; public Action onLeftGripUp; public Action onRightGripEnter; public Action onRightGripDown; public Action onRightGripUp; public Action onLeftAppButtonEnter; public Action onLeftAppButtonDown; public Action onLeftAppButtonUp; public Action onRightAppButtonEnter; public Action onRightAppButtonDown; public Action onRightAppButtonUp; public Action onLeftJoyStickEnter; public Action onLeftJoyStickDown; public Action onLeftJoyStickUp; public Action onRightJoyStickEnter; public Action onRightJoyStickDown; public Action onRightJoyStickUp; public Action<Vector2> onLeftJoyStickMove; public Action<Vector2> onRightJoyStickMove; public Action onLeftAXButtonEnter; public Action onLeftAXButtonDown; public Action onLeftAXButtonUp; public Action onLeftBYButtonEnter; public Action onLeftBYButtonDown; public Action onLeftBYButonUp; public Action onRightAXButtonEnter; public Action onRightAXButtonDown; public Action onRightAXButtonUp; public Action onRightBYButtonEnter; public Action onRightBYButtonDown; public Action onRightBYButtonUp; #endregion //提供状态字典独立记录各个feature的状态 Dictionary<string, bool> stateDic; private void Init() { if (!leftHandController.isValid) { leftHandController = InputDevices.GetDeviceAtXRNode(XRNode.LeftHand); } if (!rightHandController.isValid) { rightHandController = InputDevices.GetDeviceAtXRNode(XRNode.RightHand); } if (!headController.isValid) { headController = InputDevices.GetDeviceAtXRNode(XRNode.Head); } stateDic = new Dictionary<string, bool>(); } //*******************事件源的触发************************** /// <summary> /// 按钮事件源触发模板 /// </summary> /// <param name="device">设备</param> /// <param name="usage">功能特征</param> /// <param name="btnEnter">开始按下按钮事件</param> /// <param name="btnDown">按下按钮事件</param> /// <param name="btnUp">抬起按钮事件</param> private void ButtonDispatchModel(InputDevice device, InputFeatureUsage<bool> usage, Action btnEnter, Action btnDown, Action btnUp) { //Debug.Log("usage:" + usage.name); //为首次执行的feature添加bool状态 -- 用以判断Enter和Up状态 string featureKey = device.characteristics + usage.name; if (!stateDic.ContainsKey(featureKey)) { stateDic.Add(featureKey, false); } bool isDown; if (device.TryGetFeatureValue(usage, out isDown) && isDown) { //Debug.Log("device:" + device.characteristics + "usage:" + usage.name); if (!stateDic[featureKey]) { stateDic[featureKey] = true; btnEnter?.Invoke(); } btnDown?.Invoke(); } else { if (stateDic[featureKey]) { btnUp?.Invoke(); stateDic[featureKey] = false; } } } /// <summary> /// 摇杆事件源触发模板 /// </summary> /// <param name="device">设备</param> /// <param name="usage">功能特征</param> /// <param name="joyStickMove">移动摇杆事件</param> private void JoyStickDispatchModel(InputDevice device, InputFeatureUsage<Vector2> usage, Action<Vector2> joyStickMove) { Vector2 axis; if (device.TryGetFeatureValue(usage, out axis) && !axis.Equals(Vector2.zero)) { if (joyStickMove != null) joyStickMove(axis); } } //******************每帧轮询监听事件*********************** private void Update() { if (leftHandController.isValid) { ButtonDispatchModel(leftHandController, CommonUsages.triggerButton, onLeftTriggerEnter, onLeftTriggerDown, onLeftTriggerUp); ButtonDispatchModel(leftHandController, CommonUsages.gripButton, onLeftGripEnter, onLeftGripDown, onLeftGripUp); ButtonDispatchModel(leftHandController, CommonUsages.primaryButton, onLeftAXButtonEnter, onLeftAXButtonDown, onLeftAXButtonUp); ButtonDispatchModel(leftHandController, CommonUsages.secondaryButton, onLeftBYButtonEnter, onLeftBYButtonDown, onLeftBYButonUp); ButtonDispatchModel(leftHandController, CommonUsages.primary2DAxisClick, onLeftJoyStickEnter, onLeftJoyStickDown, onLeftJoyStickUp); ButtonDispatchModel(leftHandController, CommonUsages.menuButton, onLeftAppButtonEnter, onLeftAppButtonDown, onLeftAppButtonUp); //JoyStickDispatchModel(leftHandController, CommonUsages.primary2DAxis, onLeftJoyStickMove); } else { Init(); } if (rightHandController.isValid) { ButtonDispatchModel(rightHandController, CommonUsages.triggerButton, onRightTriggerEnter, onRightTriggerDown, onRightTriggerUp); ButtonDispatchModel(rightHandController, CommonUsages.gripButton, onRightGripEnter, onRightGripDown, onRightGripUp); ButtonDispatchModel(rightHandController, CommonUsages.primaryButton, onRightAXButtonEnter, onRightAXButtonDown, onRightAXButtonUp); ButtonDispatchModel(rightHandController, CommonUsages.secondaryButton, onRightBYButtonEnter, onRightBYButtonDown, onRightBYButtonUp); ButtonDispatchModel(rightHandController, CommonUsages.primary2DAxisClick, onRightJoyStickEnter, onRightJoyStickDown, onRightJoyStickUp); ButtonDispatchModel(rightHandController, CommonUsages.menuButton, onRightAppButtonEnter, onRightAppButtonDown, onRightAppButtonUp); //JoyStickDispatchModel(rightHandController, CommonUsages.primary2DAxis, onRightJoyStickMove); } else { Init(); } } }
使用
void Awake() { InputEvent.Instance.onRightBYButtonUp += RightBYButtonDown; } void RightBYButtonDown() { Debug.Log("右手柄B键按下中......"); Time.timeScale = 0; IsPaused = true; AudioManager.Instance.PauseAll(); //PopUpManager.Instance.ShowPauseMenu(); }
方法二:按下B键
private void Update() { if (InputDevices.GetDeviceAtXRNode(XRNode.RightHand).TryGetFeatureValue(UnityEngine.XR.CommonUsages.secondaryButton, out triggerValue) && triggerValue) { RightBYButtonDown(); } }
标签:ButtonDispatchModel,rightHandController,Unity,按下,Pico,leftHandController,Action, From: https://www.cnblogs.com/WalkingSnail/p/18340763