【Unity VR开发】结合VRTK4.0:创建物理按钮

news2025/7/19 12:39:15

语录:

如今我努力奔跑,不过是为了追上那个曾经被寄予厚望的自己


前言:

使用线性关节驱动器和碰撞体从动器可以轻松创建基于物理的按钮,以使交互者能够在物理上按下按钮控件,然后挂钩到驱动器事件中以了解按钮何时被按下或释放。


学习时间:

步骤一:

       如果我们需要实现物理按钮的效果,那我们首先需要有一个碰撞器,并跟随我们的游戏对象,而且还能与物理进行交互。一个有用的例子是能够用交互器推动可交互的对象,而不必抓住它。这时我们就用到了模块:Trackers.ColliderFollower

Tilia -> Prefabs -> Trackers -> Trackers.ColliderFollower

 步骤二:

        我们让我们的碰撞器跟随我们右边的手柄,我们就需要将手柄拖放到碰撞器的组件参数上:

 步骤三:

      我们需要修改碰撞 体跟随者的碰撞体与交互器的形状相匹配。将自身带的球形碰撞器隐藏,然后添加盒子碰撞器,然后修改他的属性:

 这里我们已经完成了碰撞体跟随器的添加,接下来我们就要进行物理按钮的创建。

步骤四:

       首先我们需要创建一个空物体,并将其重命名:

步骤五:

      接下来在我们的空物体下创建我们的Interactions.LinearJointDrive模块 :

Tilia -> Prefabs -> Interactions -> Controllables -> PhysicsJoint -> Interactions.LinearJointDrive

我们会发现,他自带的Cube非常大,不利于我们使用,我们需要找到它下面的Cube然后修改他的基本参数,以供我们使用:

 接着我们就要修改Interactions.LinearJointDrive自带组件的属性:

 步骤六:

       创建一个新的空物体,使它成为游戏对象空物体的子物体,然后重新命名,并添加一个触发器,修改它的属性:

步骤七:

       再在ActivationArea添加组件“Collision Tracker”。然后将游戏对象“Trackers.ColliderFollower”拖放到组件中的开始和结束事件侦听器中,并设置对应的事件:

步骤八:

      同样,将游戏对象拖放到事件侦听器框中, 选择要在发出事件时执行的函数:

 步骤九:

        创建一个新的空物体,使其成为ButtonContainer的子物体,并重新命名然后在其身上添加组件“Any Component Type Rule”:

 步骤十:

        在ValidCollisions下创建一个新的空物体,重新命名再添加组件“Serializable Type Component Observable List”:

 选择游戏对象,然后在组件上增加属性。

 设置属性为:InteractorFacade

 然后将ValidList拖放到ValidCollisions的组件上:

 接着,我们将ValidCollisions拖放到ActivationArea的组件属性上:

       运行场景,您会注意到,当您按下按钮上的右控制器时,它会将其向下移动到最大点,然后松开它会将其移回原始位置。但是,我们的左控制器似乎根本不与按钮交互。

步骤十一:

       我们先将Trackers.ColliderFollower重新命名为:Right.ColliderFollower,然后再讲Right.ColliderFollower复制一个,命名为:Left.ColliderFollower:

接着我们更改 Left.ColliderFollower的属性值:

这样我们的左右手柄都能检测到碰撞。 现在,让我们根据实际接触激活区域的控制器别名正确启用和禁用正确的碰撞体从属。为此,我们将使用一些检测,这些检测使我们能够知道哪个控制器别名正在接触激活区域,并能够为每个控制器触发一些特定的逻辑。

步骤十二:

在ButtonContainer创建新的游戏对象,并重命名InteractorRules,然后再新建的有的对象下面创建一个新的游戏对性作为他的子物体,然后命名为IsLeftInteractor,最后在IsLeftInteractor上面添加组件List Contains Rule:

 接着我们继续在IsLeftInteractor下面创建一个新的空物体作为它自身的子物体,并添加组件Unity Object Observable List:

 将CameraRigs.TrackedAlias -> Aliases -> LeftControllerAlias -> Interactions.Interactor拖放到组件属性中新创建的属性值中:

 接着我们将ObjectList拖放到IsLeftInteractor上面的Objects属性中:

 这样,就可以帮助我们确定给定的游戏对象是否为左控制器交互者。同理我们也要对右控制器做同样的事情,将IsLeftInteractor复制一个,重命名为IsRightInteractor:

 将CameraRigs.TrackedAlias -> Aliases -> LeftControllerAlias -> Interactions.Interactor拖放替换到组件属性值中:

 步骤十三:

         现在我们需要添加一些逻辑来弄清楚我们想要如何处理特定的交互器冲突。

         在InteractorRules下面创建一个新的空物体,对其进行重命名(CollisionStopped),然后我们在它身上添加组件Notifier Container ExtractorRules Matcher

         接着我们在CollisionStopped下面创建一个新的空物体,作为它的子物体,将其重新命名并添加对应的组件Rules Matcher Element Observable List:

 我们将IsRightInteractor和IsLeftInteractor拖放到组件的属性中:

 接着我们将RuleMatcherList拖放至他的父物体的属性中:

      我们现在需要连接我们的碰撞交互器以传递给我们,以确定根据正在碰撞的控制器运行什么逻辑。事件数据包含此信息,但我们需要提取我们感兴趣的碰撞信息。这就是组件将为我们做的事情。

步骤十四:

        首先我们要把前面ActivationArea上面设置的Collision Stopped监听事件删除:

        然后将 CollisionStopped拖放到ActivationArea上面设置的Collision Stopped监听事件中,并选择要在发出事件时执行的函数:

我们现在只需要告诉我们将提取的冲突游戏对象传递给我们的组件。将 CollisionStopped拖放到自身属性上,并选择要在发出事件时执行的函数:

同样的,我们需要设置开始触发时的时间监控,这是,我们只需要将 CollisionStopped复制一份,然后更名为CollisionStarted:

 然后我们要把前面ActivationArea上面设置的Collision Started监听事件删除,将CollisionStarted拖放到Collision Started监听事件上,并设置对应的属性:

 步骤十五:

         接下来我们需要设置CollisionStarted和CollisionStopped上面的Rules Matcher属性,该属性是为我们的控制器交互器设置的,因此我们希望将游戏对象拖放到事件侦听器框中,该框显示在显示 的组件上的事件参数上。游戏对象上的组件现在应按如下方式设置:

 步骤十六:

最后呢,我们要在事件执行前对游戏对象上的组件进行设置:

到这里,我们的设置就完成,接下来我们运行,您会注意到,当您使用任一控制器按下按钮时,按钮会向下移动到其最大点,然后松开按钮将其移回原始位置。您还会注意到,根据触摸控制器的不同,正确的碰撞体从动器已启用。

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

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

相关文章

追梦之旅【数据结构篇】——详解C语言实现顺序队列

详解C语言实现顺序队列~😎前言🙌预备小知识🙌队列的概念及结构😊1.顺序队列头文件编写🙌2.Queue.c文件的编写🙌1)队列的初始化函数实现😊2)队列的销毁函数实现&#x1f6…

Leetcode DAY 44: 完全背包 and 零钱兑换 II and 组合总和 Ⅳ

完全背包518. 零钱兑换 II&#xff01;&#xff01;&#xff01;程序未通过原因&#xff1a; 1、dp数组的初始化没考虑清楚 2、组合问题 dp数组的更新没考虑清楚 修改后&#xff1a; class Solution { public:int change(int amount, vector<int>& coins) {// dp[j…

python保留小数函数总结

python保留小数——‘%f’‘%.nf’% x&#xff08;定义的变量&#xff09; 例子&#xff1a;a 82.16332 print(%.1f% a) print(%.2f% a) print(%.3f% a) print(%.4f% a) print(%.10f% a)输出结果python保留小数——format&#xff08;&#xff09;函数Python2.6 开始&#xff…

【Zotero】文献阅读神器Zotero打造个人移动图书馆

1、 将zotero portable版装入移动硬盘 zotero portable下载链接 2、 安装zotfile管理附件 官网&#xff1a;http://zotfile.com/ 下载好之后&#xff0c;打开Zotero&#xff0c;依次点击菜单栏工具&#xff08;tools&#xff09;-插件&#xff08;Add-ons&#xff09;&#…

Vue3 中组件的使用(上)

目录前言&#xff1a;一、什么是组件二、注册组件1. 全局注册2. 局部注册二、传递数据【父 -> 子】1. 字符串数组的形式2. 对象的形式三、组件事件【子 -> 父】1. 字符串数组式声明自定义事件2. 【子组件】触发组件事件3. 【父组件】监听子组件自定义事件4. 组件事件例子…

【大数据】记一次hadoop集群missing block问题排查和数据恢复

问题描述 集群环境总共有2个NN节点&#xff0c;3个JN节点&#xff0c;40个DN节点&#xff0c;基于hadoop-3.3.1的版本。集群采用的双副本&#xff0c;未使用ec纠删码。 问题如下&#xff1a; bin/hdfs fsck -list-corruptfileblocks / The list of corrupt files under path…

AI算法创新赛-人车目标检测竞赛总结04

队伍&#xff1a;AI000038 小组成员&#xff1a;杨志强&#xff0c;林松 1. 算法介绍 1.1 相关工作 当前流行的目标检测算法主要分为三种&#xff0c;一阶段算法&#xff1a;SSD&#xff0c;FCOS&#xff0c;Scaled&#xff0c;YOLO系列等&#xff1b;二阶段算法&#xff1a…

宝塔搭建实战php悟空CRM前后端分离源码-后端server篇(一)

大家好啊&#xff0c;我是测评君&#xff0c;欢迎来到web测评。 有个朋友发消息跟我说&#xff0c;能不能让我录制一期一套开源的悟空CRM系统&#xff0c;然后网上搜了下&#xff0c;搭建起来测试后&#xff0c;感觉还不错&#xff0c;是一套前后端分离的CRM系统&#xff0c;前…

Java浅析电信数据采集

技术&#xff1a;Java等摘要&#xff1a;电信运营系统中&#xff0c;电信计费系统是主要的支撑系统&#xff0c;占有重要地位。对于电信计费系统是电信运营商的核心竞争力之一这一观点愈来愈被业界认同。电信计费系统中的数据蕴含着企业经营态势、客户群分布特征及消费习惯、各…

什么是隔离式数字输入?

隔离式数字输入与数字隔离器虽然它们听起来很相似&#xff0c;但隔离式数字输入和数字隔离器之间实际上存在一些值得注意的差异。看完这篇文章&#xff0c;希望大家能轻松分辨出两种隔离功能的区别。 内部结构 数字隔离器具有提供电流隔离数字信号路径的基本&#xff08;或经…

网易的“草长莺飞二月天”:增长稳健,加码研发,逐浪AI

2月23日&#xff0c;网易发布了2022年第四季度财报。 这是网易与暴雪分道扬镳后的首份财报&#xff0c;加上近期AIGC热度扩散至游戏、教育等各个领域&#xff0c;网易第四季度业绩及其对于GPT等热门技术的探索受到市场关注。 根据财报&#xff0c;第四季度&#xff0c;网易营…

从单管单色到单管RGB,这项MicroLED工艺不可忽视

微显示技术商Porotech&#xff0c;在CES 2023期间展示了最新的MicroLED显示模组。近期&#xff0c;AR/VR光学领域的知名博主Karl Guttag深度分析了该公司的微显示技术&#xff0c;并指出Porotech带来了他见过最有趣的MicroLED技术。Guttag表示&#xff1a;Porotech是本届CES上给…

Airbyte的同步复制模式

ELT 哲学的核心原则&#xff0c;即数据在提取和加载阶段移动时应保持不变&#xff0c;以便始终可以在目标中访问原始数据。由于目标中存在数据的未修改版本&#xff0c;因此将来可以重新转换该版本&#xff0c;而无需从源系统重新同步数据。 基于此哲学&#xff0c;我们看看Air…

已经准备上千道软件测试面试题了,建议大家收藏!!!还有视频详解!

2023华为软件测试笔试面试真题&#xff0c;抓紧收藏不然就看不到了_测试小鬼的博客-CSDN博客_华为软件测试工程师面试题1、对计算机软件和硬件资源进行管理和控制的软件是&#xff08;D&#xff09;A.文件管理程序B.输入输出管理程序C.命令出来程序D.操作系统2、在没有需求文档…

C++类和对象:类的定义、类对象的存储、this指针

目录 一. 对于面向过程和面向对象的认识 二. 类 2.1 struct关键字定义类 2.1.1 C语言中的struct关键字 2.1.2 C中的struct关键字 2.2 class关键字 2.1 使用class关键字定义类 三. 类的访问限定及封装 3.1 类的访问权限及访问限定符 3.1.1 访问权限 3.1.2 访问限定…

3款百里挑一的国产软件,逆天好用,装了就舍不得卸载

推荐3款让你偷懒&#xff0c;让你上头的提效电脑软件&#xff0c;个个功能强大&#xff0c;让你远离加班&#xff01; 很多几个小时才能做好的事情&#xff0c;用上它们&#xff0c;只需要5分钟就行&#xff01;&#xff01; 1、JNPF快速开发平台 JNPF 是一款精巧耐用的软件…

Linux 练习一(思维导图 + 练习过程)

文章目录一、Linux 用户管理及文件操作第一段练习记录&#xff1a;主要对用户进行删除添加设置密码等操作第二段练习记录&#xff1a;主要包括权限设置和查找命令第三段练习记录&#xff1a;关于文件的命令练习第四段练习记录&#xff1a;查找命令及查看内存命令的使用二、Linu…

Linux c:使用二级指针传参,交换两个字符串的函数测试

代码&#xff1a; #include <stdlib.h> #include <stdio.h> #include <unistd.h> #include <sys/types.h> #include <sys/stat.h> #include <string.h> int swap1(char **p1, char **p2) { char * temp NULL; temp *p1; *p1 *p2; *p2…

C语言和C++的区别和联系,大多数人都说错了

前言 C语言和C到底是什么关系&#xff1f; 首先C和C语言本来就是两种不同的编程语言&#xff0c;但C确实是对C语言的扩充和延伸&#xff0c;并且对C语言提供后向兼容的能力。对于有些人说的C完全就包含了C语言的说法也并没有错。 C一开始被本贾尼斯特劳斯特卢普&#xff08;Bj…

【JDK8新特性之Stream流-Stream流常用的API以及案例实操】

JDK8新特性之Stream流&#xff0c;不知道你在投递简历的时候有没有看到JD(工作岗位要求去描述)上写到熟悉JDK中Stream流的相关使用。如果没有的话&#xff0c;接下来就和我一起学习一下吧 1.原始集合处理数据的弊端->Stream流优势之处&#xff0c;案例演示 自定义一个集合&…