using System; using System.Collections.Generic; using UnityEngine; using UnityEngine.XR; /// /// 提供各种输入事件 /// public class InputEvent : Common.MonoSingleton { //*************输入设别************************** 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 onLeftJoyStickMove; public Action 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 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(); } //*******************事件源的触发************************** /// /// 按钮事件源触发模板 /// /// 设备 /// 功能特征 /// 开始按下按钮事件 /// 按下按钮事件 /// 抬起按钮事件 private void ButtonDispatchModel(InputDevice device, InputFeatureUsage 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; } } } /// /// 摇杆事件源触发模板 /// /// 设备 /// 功能特征 /// 移动摇杆事件 private void JoyStickDispatchModel(InputDevice device, InputFeatureUsage usage, Action 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(); } } }