Unity之OpenXR+XR Interaction Toolkit实现 监听VR手柄按键

news2024/11/22 21:58:43

一.前言

当我们接入XR Interaction Toolkit之后,我们可以很方便的做不同VR设备的适配,这在很大程度上提升了我们的开发效率,我们除了通过射线和物体交互之外,偶尔我们也会希望监听手柄上的部分按键的点击事件,今天我们就来实现如何监听VR手柄的按钮事件。

二.准备工作

我们需要准备好Unity2021工程和环境配置
有了前文:Unity之OpenXR+XR Interaction Toolkit基本配置的介绍,我们就不在详细说明这些了,大家自行复习。

流程简述:
我们新建一个3D(URP)工程
然后通过PackageManager安装XR Interaction ToolKit插件。
配置好XR Interaction Toolkit的Preset
新建一个3D场景

准备工作完毕

三.新建XR-Origin

我们通过菜单创建XR-Origin (VR)
然后找到手柄节点LeftHandController或者RightHandController,如下图所示:
在这里插入图片描述
我们看到XR Controller(Action-based)组件,我们获取手柄按键点击就需要用到它。

四.监听Trigger键按下事件

我们新建一个脚本,如XRInputEvent.cs 。把它添加到RightHandControler的游戏对象上。
我们先来看一下VR手柄按钮监听的基本逻辑:

//获取ActionBasedController
m_ActionController = GetComponent<ActionBasedController>();
//判断Active是否触发
var pressed = m_ActionController.activateAction.action.IsPressed();
if(pressed)
{
	Debug.Log("用户按下了trigger键")
}

Active行为在InputSystem中配置的是Trigger键,如下图所示
在这里插入图片描述
其他按钮监听方法类似,如下所示:

//active事件:trigger按键
m_ActionController.activateAction.action.IsPressed();
//select事件:grab按键
m_ActionController.selectAction.action.IsPressed();
//ui点击事件:trigger按键
m_ActionController.uiPressAction.action.IsPressed();
//左右旋转事件:遥感的左右
m_ActionController.rotateAnchorAction.action.IsPressed();
//移动事件:遥感的前后
m_ActionController.translateAnchorAction.action.IsPressed();

五.监听Trigger键瞬时事件

我们注意到,ActionController对按钮的检测是通过按钮状态判断的,所以我们必须要在Update中检测按钮状态才行。
所以我们可以优化一下代码:

public class XRInputEvent : MonoBehaviour
{
    private ActionBasedController m_ActionController;

    public bool m_LastPressed;
    public bool m_CurrPressed;

    void Awake()
    {
    	m_ActionController = GetComponent<ActionBasedController>();
    }

    void Update()
    {
        if (m_ActionController == null)
            return;

        m_CurrPressed = m_ActionController.activateAction.action.IsPressed();
        if (m_CurrPressed == m_LastPressed)
            return;

        m_LastPressed = m_CurrPressed;
        if (m_CurrPressed)
            //按下
        else
            //抬起
    }
}

优化完代码后,我们通过LastPressed和CurrPressed来实现了按下和抬起的瞬间事件。
似乎OpenXR并没有给我们提供这种类似的瞬时事件,不过我们就需要自己实现。

六.自定义事件绑定

//独立一个XRInputEvent的组件,方便外部使用
public class XRInputEvent : MonoBehaviour
{
    private ActionBasedController m_ActionController;

    public bool m_LastPressed;
    public bool m_CurrPressed;
	//新建按下事件和抬起事件,方便外部监听
    public UnityEvent OnTriggerButtonDown = new UnityEvent();
    public UnityEvent OnTriggerButtonUp = new UnityEvent();

    void Awake()
    {
        m_ActionController = GetComponent<ActionBasedController>();
    }

    void Update()
    {
        if (m_ActionController == null)
        {
            return;
        }

        m_CurrPressed = m_ActionController.activateAction.action.IsPressed();
        if (m_CurrPressed == m_LastPressed)
        {
            return;
        }

        m_LastPressed = m_CurrPressed;
        if (m_CurrPressed)
        {
            OnTriggerButtonDown?.Invoke();
        }
        else
        {
            OnTriggerButtonUp?.Invoke();
        }
    }
}

七.使用事件绑定

有了XRInputEvent组件,我们就可以随时监听VR手柄的按键点击和抬起事件了。
如下所示:

public class VRHandItem : HandItem
{
    private XRInputEvent m_XrInputEvent;
    
    protected override void Start()
    {
        m_XrInputEvent = gameObject.GetOrAddComponent<XRInputEvent>();
        m_XrInputEvent.OnTriggerButtonDown.AddListener(OnTriggerButtonDown);
        m_XrInputEvent.OnTriggerButtonUp.AddListener(OnTriggerButtonUp);
    }

    protected void  OnTriggerButtonDown()
    {
        //按下Trigger键
    }

    protected void  OnTriggerButtonUp()
    {
        //抬起Trigger键
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/491168.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

网络安全大厂面试题合集

以下为网络安全各个方向涉及的面试题合集&#xff0c;星数越多代表问题出现的几率越大&#xff0c;祝各位都能找到满意的工作。 注&#xff1a;本套面试题&#xff0c;已整理成pdf文档&#xff0c;但内容还在持续更新中&#xff0c;因为无论如何都不可能覆盖所有的面试问题&…

国考省考结构化面试:情景模拟题的答题思路,人际关系题的变种,就题答题,灵活多变,关键在自己多思考,说话要有艺术

国考省考结构化面试&#xff1a;情景模拟题的答题思路&#xff0c;人际关系题的变种&#xff0c;就题答题&#xff0c;灵活多变&#xff0c;关键在自己多思考&#xff0c;说话要有艺术 2022找工作是学历、能力和运气的超强结合体! 公务员特招重点就是专业技能&#xff0c;附带…

ansible常用模块总结

目录 一、 assert模块 二、 authorized_key模块 三、at模块 四、blockinfile模块 五、command模块 六、copy模块 七、 cron模块 八、 firewalld模块 九、 fail模块 十、 file模块 十一、 fetch模块 十二、filesystem模块 十三、 get_url模块 十四、group模块 十…

基于pytorch+transformers的车牌识别

目录 程序流程设计熟悉训练数据集CCPD2019数据集CCPD数据集标注信息单例再现 加载本地车牌数据集 程序流程设计 1&#xff0c;熟悉训练数据集&#xff1b; 2&#xff0c;加载本地车牌数据集&#xff1b; 3&#xff0c;定义网络模型&#xff1b; 4&#xff0c;输入数据集训练模…

关于复杂事件处理和事件驱动架构的争论

复杂事件处理&#xff08;Complex Event Processing&#xff0c;CEP&#xff09;系统和事件驱动架构&#xff08;Event Driven Architecture&#xff0c;EDA&#xff09;都被认为会在目前和未来的精致繁杂的系统设计中扮演重要角色。但是它们的角色是什么&#xff1f;会对业界产…

初识vue-模板

目录 模板语法 模板插值 指令 条件渲染&#xff08;v-if &#xff1b;v-show&#xff09; 列表循环&#xff08;v-for&#xff09; ref JSX&#xff08;render渲染&#xff09; 条件渲染 列表渲染 八皇后框架-背景格&#xff08;循环&#xff09; 模板语法 Vue.js使用了…

Vue3+Element Plus环境搭建和一键切换明暗主题的配置

Vue (发音为 /vjuː/&#xff0c;类似 view) 是一款用于构建用户界面的 JavaScript 框架。而Element Plus是一款基于Vue3面向设计师和开发者的组件库。 最终效果&#xff1a; 环境搭建 已安装 16.0 或更高版本的 Node.js&#xff0c;终端&#xff1a; npm init vuelatest这一…

智慧校园系统平台实现校内导航资产管线一体化管理

构建智慧校园系统平台是国家和大专院校共同倡议的校园信息化建设方向&#xff0c;是运用物联网技术搭建的一体化综合平台&#xff0c;基于各种应用服务系统&#xff0c;把学校的教务、办公、教学、学习、管理、资产、校园安全、安防、消防等各个环节融为一体&#xff0c;提高学…

MATLAB算法实战应用案例精讲-【人工智能】对比学习(概念篇)(补充篇)

目录 前言 几个高频面试题目 基于对比学习(ContrastiveLearning)的文本表示模型【为什么】能学到文本【相似】度&#xff1f; 为什么对比学习能学到很好的语义相似度&#xff1f; 那么如何评价这个表示空间的质量呢&#xff1f; 知识储备 监督学习和非监督学习 算法原理…

Web开发人员的10个数据库优化最佳实践

数据库优化已经成为web开发人员提高web应用程序性能&#xff0c;从而改善用户体验的关键。对一些人来说&#xff0c;这可能听起来不太吸引人&#xff0c;但如果能正确地优化数据库&#xff0c;就可以提高性能、减少瓶颈并节省资源。 幸运的是&#xff0c;有些优化技术在sql查询…

sqlserver object_id()函数学习

在SQLServer数据库中&#xff0c;如果查询数据库中是否存在指定名称的索引或者外键约束等&#xff0c;经常会用到object_id(name,type)方法&#xff0c; 语法&#xff1a;object_id(objectname)或object(objectname,type) 作用&#xff1a;该函数会返回指定对象的ID值&#xf…

springboot 整合ehchace 缓存教程

ehcache介绍 Ehcache是一种高性能、开源的Java缓存框架&#xff0c;被广泛应用于许多大规模、高并发的分布式系统中。它提供了一种快速、可扩展、分布式的数据缓存方案&#xff0c;支持各种内存级别的缓存、磁盘级别的缓存、分布式缓存等。Ehcache设计目标主要是提供高性能和可…

【LeetCode】198.打家劫舍

198.打家劫舍&#xff08;中等&#xff09; 思路 定义数组 dp&#xff0c; dp[i] 表示抢劫到第 i 个房子的时候&#xff0c;可以抢劫的最大数量。dp[i] 有两种可能&#xff1a;一种是我们选择不抢劫这个房子&#xff0c;此时累积金额为 dp[i-1] &#xff1b;另一种是我们选择抢…

儿童用灯哪个品牌好?推荐专业的儿童护眼台灯

一款好的儿童台灯&#xff0c;主要是从5个方面决定&#xff0c;照度及均匀度&#xff0c;蓝光&#xff0c;色温&#xff0c;显指&#xff0c;频闪 ① 照度及均匀度最高是国AA级&#xff0c;其次就是国A级 ② 蓝光一定要选择RG0无危险级&#xff0c;蓝光能量最强&#xff0c;…

给你安利一款不需要魔法就能免费使用的idea插件Bito-ChatGPT

一款不需要魔法就能免费使用的idea插件Bito-ChatGPT 一 、写在前面二、Bito是什么&#xff1f; &#x1f511;&#x1f511; **What does Bito AI do?**三 、安装Bito四、使用Bito4.1 创建个人工作空间4.2 使用Bito4.2.1 问任何技术问题&#xff08;Ask any technical questio…

端口聚合与Hash算法

目录 前言 一、Hash算法简介 二、负载分担 1.逐流负载分担 2.逐包负载分担 三、Hash算法与负载分担 1.转发原理 四、堆叠情况下的负载分担 五、配置流程 前言 提示&#xff1a;关于Hash与负载分担方式 提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面案例可供…

Win11电脑桌面的图标变成白色了怎么解决?

Win11电脑桌面的图标变成白色了怎么解决&#xff1f;有用户将自己的电脑开机之后&#xff0c;出现了桌面图标变成白色的情况&#xff0c;虽然软件还是可以正常的打开&#xff0c;但是图标消失了看起来非常的不习惯&#xff0c;那么这个问题要怎么去解决呢&#xff1f;来看看以下…

PP825A 3BSE042240R3转换为后备控制系统和控制系统中的报警系统

​ ​ PP825A 3BSE042240R3转换为后备控制系统和控制系统中的报警系统 步进系统&#xff08;Stepper motor&#xff09;的优缺点是什么 步进电机-直流电流产生磁场。它是恒流系统。由于转子极数&#xff0c;扭矩随速度下降。 步进电机的优点 设计简单 控制简单 出色的低速扭矩…

德国 DocuWare 文档管理软件平台

DocuWare 是一个先进的平台&#xff0c;可让您集中、快速、有效地管理、处理和利用业务信息。 我们的文档管理和工作流程解决方案的各项功能可以集成到任何 IT 系统中&#xff0c;可以数字化任何部门的手动或纸质业务流程。提高您公司的生产力&#xff0c;让您的团队更轻松地完…

Matlab与ROS---TF坐标系(七)

0. 简介 我们上面讲了最基础的通信机制以及在Matlab中如何使用这些通信&#xff0c;下面我们这一讲来主要介绍ROS当中最常用的TF坐标系在Matlab中的使用。tf是分布式的&#xff0c;因此所有的坐标帧信息对ROS网络中的每个节点都是可用的。所以这一节就是带领读者熟悉该怎么在M…