• Pico Neo4、Neo3开发手柄的使用交互监听


    ```

    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,InputFeatureUsage usage,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,InputFeatureUsage usage,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;
    */
    }
    ```
  • 相关阅读:
    联合特征增强和网络参数优化的人脸识别方法
    Python零基础入门-9类
    一体式馆员工作站专为图书管理员设计
    网页图标工具
    2. redis常见数据类型
    ES6 解构赋值--一般用法
    SpringBoot集成WebSocket--------Spring方式集成(一)
    荐书丨《哥德尔、艾舍尔、巴赫书:集异璧之大成》:机器人与音乐的次元壁破了
    Mapbox 与 Babylon.js 可视化 创建喷泉底部
    LeetCode知识点总结 - 114
  • 原文地址:https://blog.csdn.net/CSDN_qiange/article/details/134071318