当前位置: 首页 > 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;
*/
}
```

相关文章:

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

using System; using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.XR;public class InputEvent : MonoSingleton<InputEvent> {//*************输入设别**************************InputDevice leftHandController;Inp…...

【k8s】pod详解

一、Pod介绍 1、Pod的基础概念 Pod是kubernetes中最小的资源管理组件&#xff0c;Pod也是最小化运行容器化应用的资源对象&#xff0c;一个pod代表着集群中运行的一个进程。kubernetes中其它大多数组件都是围绕着pod来进行支持和扩展pod功能的。 例如&#xff0c;用于管理po…...

优思学院:质量管理7原则、8大要点

在质量管理的道路上&#xff0c;没有捷径可循。质量管理是一项需要不断积累经验和智慧的长期过程&#xff0c;其中涵盖了七大关键原则&#xff0c;这些原则是组织在质量管理方面取得持续成功的基石。 1. 以顾客为关注焦点 释义&#xff1a; 质量管理的核心在于满足顾客需求&am…...

自动化测试如何解析excel文件?

前言 自动化测试中我们存放数据无非是使用文件或者数据库&#xff0c;那么文件可以是csv&#xff0c;xlsx&#xff0c;xml&#xff0c;甚至是txt文件&#xff0c;通常excel文件往往是我们的首选&#xff0c;无论是编写测试用例还是存放测试数据&#xff0c;excel都是很方便的。…...

职场好物:乐歌M9S升降办公电脑台,告别久坐办公,升职加薪就选它

办公是现代生活不可避免的组成部分&#xff0c;科技的快速发展&#xff0c;给了我们更多新的生活方式&#xff0c;促使我们更加关注自己的身体状况&#xff0c;我们挨过了饭都吃不饱的年代&#xff0c;随着办公人群的不断扩张&#xff0c;不知道你有没有发现身边人或多或少都有…...

springboot+vue基于Hadoop短视频流量数据分析与可视化系统的设计与实现【内含源码+文档+部署教程】

博主介绍&#xff1a;✌全网粉丝10W,前互联网大厂软件研发、集结硕博英豪成立工作室。专注于计算机相关专业毕业设计项目实战6年之久&#xff0c;选择我们就是选择放心、选择安心毕业✌ &#x1f345;由于篇幅限制&#xff0c;想要获取完整文章或者源码&#xff0c;或者代做&am…...

审核 Microsoft SQL Server 日志

手动审核数据库活动是一项艰巨的任务&#xff0c;有效完成审计的最佳方法是使用简化和自动化数据库监控的综合解决方案&#xff0c;该解决方案还应使数据库管理员能够监控、跟踪和即时识别任何操作问题的根本原因&#xff0c;并实时检测对机密数据的未经授权的访问。 什么是 S…...

【NLP】什么是语义搜索以及如何实现 [Python、BERT、Elasticsearch]

语义搜索是一种先进的信息检索技术&#xff0c;旨在通过理解搜索查询和搜索内容的上下文和含义来提高搜索结果的准确性和相关性。与依赖于匹配特定单词或短语的传统基于关键字的搜索不同&#xff0c;语义搜索会考虑查询的意图、上下文和语义。 语义搜索在搜索结果的精度和相关…...

【JavaScript】JS基础语法

1 JavaScript 的书写形式 1.1 行内式 直接嵌入到 html 元素内部 <input type"button" value"按钮" onclick"alert(hello JavaScript)" >1.2 内嵌式 写在script标签内 <script>alert("haha")</script>1.3 外部式…...

06-云计算概览及问题关注

容器生态系统 容器生态系统包含核心技术、平台技术和支持技术。 1-1 容器核心技术 其中容器核心技术指的是能让容器在主机服务器上运行的技术&#xff0c;包含容器规范、容器 runtime、容器管理工具、容器生态工具、registries、容器 OS。 容器规范&#xff1a; 容器除了常…...

怎么监控钉钉聊天记录内容(监控钉钉聊天记录的3种形式)

企业沟通工具的普及&#xff0c;越来越多的企业开始使用钉钉作为内部沟通工具。然而&#xff0c;对于企业管理者来说&#xff0c;如何监控钉钉聊天记录内容成为了一个重要的问题。本文将介绍几种方法&#xff0c;帮助企业管理者实现监控钉钉聊天记录内容的目的。 一、钉钉自带功…...

深入理解强化学习——强化学习的历史:时序差分学习

分类目录&#xff1a;《深入理解强化学习》总目录 相关文章&#xff1a; 强化学习的历史&#xff1a;最优控制 强化学习的历史&#xff1a;试错学习 强化学习的历史&#xff1a;试错学习的发展 强化学习的历史&#xff1a;K臂赌博机、统计学习理论和自适应系统 强化学习的…...

OpenCloudOS9操作系统搭建Confluence8.0.4企业WIKI

OpenCloudOS9操作系统搭建Confluence8.0.4企业WIKI 1. 概要2. 系统基础环境配置3. 安装并配置MySQL3.1. 安装MySQL3.2. MySQL基本配置3.3. 创建Confluence数据库4. 安装并配置Confluence5. 破解Confluence6. 优化配置Confluence7. confluence对接Windows AD域环境1. 概要 Atlas…...

03-Vue中的常用指令的使用,事件及其修饰符

常用指令 指令语法和插值语法 Vue框架中的所有指令的名字都以v-开始,完整语法格式<HTML标签 v-指令名:参数"javascript表达式(表达式的结果是一个值)"></HTML标签>: 指令的职责是当表达式的值改变时,将其产生的连带影响,响应式地作用于DOM元素不是所有…...

ScrapeKit库中Swift爬虫程序写一段代码

以下是一个使用ScrapeKit库的Swift爬虫程序&#xff0c;用于爬取网页视频的代码&#xff1a; import ScrapeKit// 创建一个配置对象&#xff0c;用于指定爬虫ip服务器信息 let config Configuration(proxyHost: "duoip", proxyPort: 8000)// 创建一个爬虫对象 let s…...

总感觉戴助听器耳朵又闷又堵怎么办?

随着助听器技术的进步发展&#xff0c;这些问题都有了一定程度的改善。例如&#xff0c;现在的助听器变得越来越小巧&#xff0c;外形更加美观和隐蔽&#xff1b;各种降噪技术和验配技巧也提升了助听器的音质和清晰度。 但是&#xff0c;还有一个问题困扰着很多助听器用户&…...

编程助手DevChat:让开发更轻松

#AI编程助手哪家好&#xff1f;DevChat“真”好用 # 目录 前言一、安装Vscode1、下载链接2、安装 二、注册DevChat1、打开注册页2、验证成功完成邮箱绑定3、绑定微信可获得8元 三、安装插件四、配置Access Key1、获取Access Key2、设置Access Key①、点击左下角管理&#xff08…...

稳定扩散的高分辨率图像合成

推荐稳定扩散AI自动纹理工具&#xff1a;DreamTexture.js自动纹理化开发包 1、稳定扩散介绍 通过将图像形成过程分解为去噪自动编码器的顺序应用&#xff0c;扩散模型 &#xff08;DM&#xff09; 在图像数据及其他数据上实现了最先进的合成结果。此外&#xff0c;它们的配方…...

3 Tensorflow构建模型详解

上一篇&#xff1a;2 用TensorFlow构建一个简单的神经网络-CSDN博客 本篇目标是介绍如何构建一个简单的线性回归模型&#xff0c;要点如下&#xff1a; 了解神经网络原理构建模型的一般步骤模型重要参数介绍 1、神经网络概念 接上一篇&#xff0c;用tensorflow写了一个猜测西…...

智慧农场牧场小程序源码 智慧农业认养系统源码

智慧农场牧场小程序源码 智慧农业认养系统源码 要了解源码的&#xff0c;看文末。 随着科技的进步和人们对绿色食品的需求增加&#xff0c;智慧农场正成为未来农业发展的方向。智慧农场是指运用先进的技术手段&#xff0c;如物联网、云计算、智能控制技术、大数据分析等&…...

Java多线程实现之Callable接口深度解析

Java多线程实现之Callable接口深度解析 一、Callable接口概述1.1 接口定义1.2 与Runnable接口的对比1.3 Future接口与FutureTask类 二、Callable接口的基本使用方法2.1 传统方式实现Callable接口2.2 使用Lambda表达式简化Callable实现2.3 使用FutureTask类执行Callable任务 三、…...

屋顶变身“发电站” ,中天合创屋面分布式光伏发电项目顺利并网!

5月28日&#xff0c;中天合创屋面分布式光伏发电项目顺利并网发电&#xff0c;该项目位于内蒙古自治区鄂尔多斯市乌审旗&#xff0c;项目利用中天合创聚乙烯、聚丙烯仓库屋面作为场地建设光伏电站&#xff0c;总装机容量为9.96MWp。 项目投运后&#xff0c;每年可节约标煤3670…...

VM虚拟机网络配置(ubuntu24桥接模式):配置静态IP

编辑-虚拟网络编辑器-更改设置 选择桥接模式&#xff0c;然后找到相应的网卡&#xff08;可以查看自己本机的网络连接&#xff09; windows连接的网络点击查看属性 编辑虚拟机设置更改网络配置&#xff0c;选择刚才配置的桥接模式 静态ip设置&#xff1a; 我用的ubuntu24桌…...

springboot整合VUE之在线教育管理系统简介

可以学习到的技能 学会常用技术栈的使用 独立开发项目 学会前端的开发流程 学会后端的开发流程 学会数据库的设计 学会前后端接口调用方式 学会多模块之间的关联 学会数据的处理 适用人群 在校学生&#xff0c;小白用户&#xff0c;想学习知识的 有点基础&#xff0c;想要通过项…...

在鸿蒙HarmonyOS 5中使用DevEco Studio实现企业微信功能

1. 开发环境准备 ​​安装DevEco Studio 3.1​​&#xff1a; 从华为开发者官网下载最新版DevEco Studio安装HarmonyOS 5.0 SDK ​​项目配置​​&#xff1a; // module.json5 {"module": {"requestPermissions": [{"name": "ohos.permis…...

MinIO Docker 部署:仅开放一个端口

MinIO Docker 部署:仅开放一个端口 在实际的服务器部署中,出于安全和管理的考虑,我们可能只能开放一个端口。MinIO 是一个高性能的对象存储服务,支持 Docker 部署,但默认情况下它需要两个端口:一个是 API 端口(用于存储和访问数据),另一个是控制台端口(用于管理界面…...

GraphQL 实战篇:Apollo Client 配置与缓存

GraphQL 实战篇&#xff1a;Apollo Client 配置与缓存 上一篇&#xff1a;GraphQL 入门篇&#xff1a;基础查询语法 依旧和上一篇的笔记一样&#xff0c;主实操&#xff0c;没啥过多的细节讲解&#xff0c;代码具体在&#xff1a; https://github.com/GoldenaArcher/graphql…...

WEB3全栈开发——面试专业技能点P7前端与链上集成

一、Next.js技术栈 ✅ 概念介绍 Next.js 是一个基于 React 的 服务端渲染&#xff08;SSR&#xff09;与静态网站生成&#xff08;SSG&#xff09; 框架&#xff0c;由 Vercel 开发。它简化了构建生产级 React 应用的过程&#xff0c;并内置了很多特性&#xff1a; ✅ 文件系…...

PH热榜 | 2025-06-08

1. Thiings 标语&#xff1a;一套超过1900个免费AI生成的3D图标集合 介绍&#xff1a;Thiings是一个不断扩展的免费AI生成3D图标库&#xff0c;目前已有超过1900个图标。你可以按照主题浏览&#xff0c;生成自己的图标&#xff0c;或者下载整个图标集。所有图标都可以在个人或…...

HTTPS证书一年多少钱?

HTTPS证书作为保障网站数据传输安全的重要工具&#xff0c;成为众多网站运营者的必备选择。然而&#xff0c;面对市场上种类繁多的HTTPS证书&#xff0c;其一年费用究竟是多少&#xff0c;又受哪些因素影响呢&#xff1f; 首先&#xff0c;HTTPS证书通常在PinTrust这样的专业平…...