```
using System; using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.XR; public class InputEvent : 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; //单例模式提供的初始化函数 protected override void Init() { base.Init(); leftHandController = InputDevices.GetDeviceAtXRNode(XRNode.LeftHand); rightHandController = InputDevices.GetDeviceAtXRNode(XRNode.RightHand); headController = InputDevices.GetDeviceAtXRNode(XRNode.Head); stateDic = new Dictionary (); } //*******************事件源的触发************************** /// /// 按钮事件源触发模板 /// /// 设备 /// 功能特征 /// 开始按下按钮事件 /// 按下按钮事件 /// 抬起按钮事件 private void ButtonDispatchModel(InputDevice device,InputFeatureUsageusage,Action btnEnter,Action btnDown,Action btnUp) { // Debug.Log("usage:" + usage.name); //为首次执行的feature添加bool状态 -- 用以判断Enter和Up状态 string featureKey = device.name + usage.name; if(!stateDic.ContainsKey(featureKey)) { stateDic.Add(featureKey, false); } bool isDown; if(device.TryGetFeatureValue(usage,out isDown) && isDown) { if(!stateDic[featureKey]) { stateDic[featureKey] = true; if(btnEnter != null) btnEnter(); } if(btnDown!=null) btnDown(); } else { if(stateDic[featureKey]) { if(btnUp!=null) btnUp(); stateDic[featureKey] = false; } } } /// /// 摇杆事件源触发模板 /// /// 设备 /// 功能特征 /// 移动摇杆事件 private void JoyStickDispatchModel(InputDevice device,InputFeatureUsageusage,Action joyStickMove) { Vector2 axis; if (device.TryGetFeatureValue(usage, out axis) && !axis.Equals(Vector2.zero)) { if(joyStickMove!=null) joyStickMove(axis); } } //******************每帧轮询监听事件*********************** private void Update() { ButtonDispatchModel(leftHandController, CommonUsages.triggerButton, onLeftTriggerEnter, onLeftTriggerDown, onLeftTriggerUp); ButtonDispatchModel(rightHandController, CommonUsages.triggerButton, onRightTriggerEnter, onRightTriggerDown, onRightTriggerUp); ButtonDispatchModel(leftHandController, CommonUsages.gripButton, onLeftGripEnter, onLeftGripDown, onLeftGripUp); ButtonDispatchModel(rightHandController, CommonUsages.gripButton, onRightGripEnter, onRightGripDown, onRightGripUp); ButtonDispatchModel(leftHandController, CommonUsages.primaryButton, onLeftAXButtonEnter, onLeftAXButtonDown, onLeftAXButtonUp); ButtonDispatchModel(rightHandController, CommonUsages.primaryButton, onRightAXButtonEnter, onRightAXButtonDown, onRightAXButtonUp); ButtonDispatchModel(leftHandController, CommonUsages.secondaryButton, onLeftBYButtonEnter, onLeftBYButtonDown, onLeftBYButonUp); ButtonDispatchModel(rightHandController, CommonUsages.secondaryButton, onRightBYButtonEnter, onRightBYButtonDown, onRightBYButtonUp); ButtonDispatchModel(leftHandController, CommonUsages.primary2DAxisClick, onLeftJoyStickEnter, onLeftJoyStickDown, onLeftJoyStickUp); ButtonDispatchModel(rightHandController, CommonUsages.primary2DAxisClick, onRightJoyStickEnter, onRightJoyStickDown, onRightJoyStickUp); ButtonDispatchModel(leftHandController, CommonUsages.menuButton, onLeftAppButtonEnter, onLeftAppButtonDown, onLeftAppButtonUp); ButtonDispatchModel(rightHandController, CommonUsages.menuButton, onRightAppButtonEnter, onRightAppButtonDown,onRightAppButtonUp); ButtonDispatchModel(leftHandController, CommonUsages.menuButton, onLeftAppButtonEnter, onLeftAppButtonDown, onLeftAppButtonUp); ButtonDispatchModel(rightHandController, CommonUsages.menuButton, onRightAppButtonEnter, onRightAppButtonDown,onRightAppButtonUp); JoyStickDispatchModel(leftHandController, CommonUsages.primary2DAxis, onLeftJoyStickMove); JoyStickDispatchModel(rightHandController, CommonUsages.primary2DAxis, onRightJoyStickMove); } }
```
使用方式:
//注册事件 ``` private void OnEnable() { InputEvent.Instance.onLeftAppButtonUp+= App; InputEvent.Instance.onRightAppButtonUp += App; }
private void App() { Debug.Log("点击了一次App按键"); }
//电脑端模拟
public virtual void Update() { if( Input.GetKeyDown(KeyCode.End) || Input.GetKeyDown(KeyCode.Escape)) { App(); } }
/*Home默认的功能就是*/ private void Exit() { #if UNITY_EDITOR EditorApplication.isPlaying = false; #else Application.Quit(); #endif }
private void OnDestroy() {//注销事件 InputEvent.Instance.onLeftAppButtonUp -= App; InputEvent.Instance.onRightAppButtonUp -= App;
/* Some objects were not cleaned up when closing the scene. (Did you spawn new GameObjects from OnDestroy?) The following scene GameObjects were found: Singleton of InputEvent */ //出现这种原因一般是我们在OnDestroy里边访问了这个单例。结束运行的时候这个单例实例已经变成了“null”。你在调用它的时候又产生了一个新的实例才会报这个错误。TODO:请去修改单例脚本 /* InputEvent.Instance.onLeftTriggerEnter -= Test; InputEvent.Instance.onLeftAppButtonEnter -= App; InputEvent.Instance.onRightTriggerEnter -= Test; InputEvent.Instance.onRightAppButtonEnter -= App; */
}
```