当前位置: 首页 > news >正文

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

```

using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.XR;public class InputEvent : MonoSingleton<InputEvent>
{//*************输入设别**************************InputDevice leftHandController;InputDevice rightHandController;InputDevice headController;//**************对外提供公开事件******************#region public eventpublic 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;//单例模式提供的初始化函数protected override void Init(){base.Init();leftHandController = InputDevices.GetDeviceAtXRNode(XRNode.LeftHand);rightHandController = InputDevices.GetDeviceAtXRNode(XRNode.RightHand);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.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;}}}/// <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(){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_EDITOREditorApplication.isPlaying = false;
#elseApplication.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;
*/
}
```
http://www.lryc.cn/news/213891.html

相关文章:

  • 【k8s】pod详解
  • 优思学院:质量管理7原则、8大要点
  • 自动化测试如何解析excel文件?
  • 职场好物:乐歌M9S升降办公电脑台,告别久坐办公,升职加薪就选它
  • springboot+vue基于Hadoop短视频流量数据分析与可视化系统的设计与实现【内含源码+文档+部署教程】
  • 审核 Microsoft SQL Server 日志
  • 【NLP】什么是语义搜索以及如何实现 [Python、BERT、Elasticsearch]
  • 【JavaScript】JS基础语法
  • 06-云计算概览及问题关注
  • 怎么监控钉钉聊天记录内容(监控钉钉聊天记录的3种形式)
  • 深入理解强化学习——强化学习的历史:时序差分学习
  • OpenCloudOS9操作系统搭建Confluence8.0.4企业WIKI
  • 03-Vue中的常用指令的使用,事件及其修饰符
  • ScrapeKit库中Swift爬虫程序写一段代码
  • 总感觉戴助听器耳朵又闷又堵怎么办?
  • 编程助手DevChat:让开发更轻松
  • 稳定扩散的高分辨率图像合成
  • 3 Tensorflow构建模型详解
  • 智慧农场牧场小程序源码 智慧农业认养系统源码
  • 3D数据过滤为2D数据集并渲染
  • 第十一章 ObjectScript 系统宏(二)
  • 跨境电商大作战:2023黑色星期五准备指南
  • 我的天!阿里云服务器居然比腾讯云优惠1元!
  • 鸡尾酒学习——未命名(芒果口味)
  • modbusTCP【C#】
  • 解决Linux Debian12系统中安装VirtualBox虚拟机无法使用USB设备的问题
  • Spring事务失效的几种情况及其解决方案
  • libgdx实现淡入淡出过渡
  • linux 出现Access-Your-Private-Data.desktop README.txt
  • 新生儿积食:原因、科普和注意事项