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

news/2024/4/20 17:31:36/文章来源:https://blog.csdn.net/LiKe11807/article/details/129187830

语录:

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


前言:

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


学习时间:

步骤一:

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

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【PyQt5图形界面编程(2)】:创建工程

创建工程 一、创建工程二、开始开发1、运行Qt5Designer,创建QT窗口2、运行pyUIC,转换xx.ui成xx.py3、main.py中引用xx.py中的类4、打包main.py成main.exe来发布5、执行终端报警处理方法三、其他(如果涉及)1、配置环境变量一、创建工程 采用虚拟环境来创建工程 相关的paka…

MyBatis学习笔记(五) —— MyBatis获取参数值的两种方式

5、MyBatis获取参数值的两种方式 MyBatis获取参数值的两种方式:${} 和 #{} ${} 的本质就是字符串拼接, #{} 的本质就是占位符赋值 ${} 使用字符串拼接的方式拼接sql,若为字符串类型或日期类型的字段进行赋值时,需要手动加单引号&a…

SpringBoot整合阿里云OSS文件上传、下载、查看、删除

SpringBoot整合阿里云OSS文件上传、下载、查看、删除1、开发准备1.1 前置知识1.2 环境参数1.3 你能学到什么2. 使用阿里云OSS2.1 创建Bucket2.2 管理文件2.3 阿里云OSS文档3. 项目初始化3.1 创建SpringBoot项目3.2 Maven依赖3.3 安装lombok插件4. 后端服务编写4.1 阿里云OSS配置…

4面美团软件测试工程师,却忽略了这一点,直接让我前功尽弃

说一下我面试别人时候的思路 反过来理解,就是面试时候应该注意哪些东西;用加粗部分标注了 一般面试分为这么几个部分: 一、自我介绍 这部分一般人喜欢讲很多,其实没必要。大约5分钟内说清楚自己的职业经历,自己的核…

自动驾驶仿真测试介绍

作者 | 楼泽如 上海控安可信软件创新研究院研发工程师 来源 | 鉴源实验室 01 引 言 自动驾驶汽车的兴起,正在重新定义汽车行业。随着自动驾驶技术的发展,自动驾驶汽车将会大大提升交通安全、减少事故发生、减少交通拥堵、提高公路容量等等&#xff0…

Java学习笔记 --- 正则表达式

一、体验正则表达式 package com.javase.regexp;import java.util.regex.Matcher; import java.util.regex.Pattern;/*** 体验正则表达式,给文本处理带来哪些便利*/ public class Regexp_ {public static void main(String[] args) {//假设,编写了爬虫&…

Linux——UDP协议与相关套接字编程

一.概念在网络通信中,传输层中最常用的通信协议有两个:TCP协议与UDP协议。这两种协议虽然都可以用于网络通信,但是通信方式不同决定了应用场景的不同。与TCP协议相比,UDP协议最具特色的不同点有两个:无连接与面向数据报…

码住!新手容易上手的5个tiktok数据分析网站

当下短视频已经称霸了各大内容平台,越来越多的创作者进入到短视频赛道,为了更好地运营自己的内容平台,数据分析是必不可少的。很多人都入局了tiktok,对于商家或者博主红人来说,这是比较新平台,希望能在这个…

python库streamlit学习笔记

什么是streamlit? Streamlit是一个免费的开源框架,用于快速构建和共享漂亮的机器学习和数据科学Web应用程序。它是一个基于Python的库,专为机器学习工程师设计。数据科学家或机器学习工程师不是网络开发人员,他们对花几周时间学习…

Vue-cli脚手架在做些什么(源码角度分析)

什么是Vue脚手架?在学习初期,我们的项目往往需要借助webpack、vite等打包工具配置Vue的开发环境,但是在真实开发中我们不可能每个项目从头来完成所有的webpack配置,这样显得开发的效率会大大的降低;所有的真实开发中&a…

实现基于国密SM3的密钥派生(KDF)功能

实现基于国密SM3的密钥派生(KDF)前言KDF 标准基于SM3的kdf实现前言 密钥派生函数(KDF):密钥派生函数是指从一个共享的秘密比特串中派生密钥数据,在密钥协商过程中,密钥派生函数作用在密钥交换所…

【一看就会】实现仿京东移动端页面滚动条布局

简单粗暴直接上代码&#xff1a; <!DOCTYPE html> <html lang"en"> <head> <meta charset"UTF-8"> <meta http-equiv"X-UA-Compatible" content"IEedge"> <meta name"viewport" content&q…

中移链结合CA证书实现节点准入控制

01背景介绍BSN开放联盟链&#xff08;BSN Open Permissioned Blockchain&#xff0c; 简称OPB&#xff09;包括多条基于公有链框架和联盟链框架搭建的公用链&#xff0c;开发者可以选择适合应用业务需求的开放联盟链部署和运行智能合约和分布式应用&#xff0c;每条开放联盟链各…

码匠 × OpenAI :快速生成 SQL 语句,提升开发效率!

目录 使用 OpenAI 生成 SQL 码匠连接与集成 OpenAI 总结 关于码匠 在码匠中&#xff0c;编写 SQL 语句&#xff0c;并结合码匠一系列开箱即用的组件实现复杂的业务逻辑&#xff0c;是很常见的应用开发场景。然而&#xff0c;不同的数据库在 SQL 增删改查操作语法、类型字段和…

Java知识复习(二)Java集合

1、List、Set和Map的区别 List&#xff1a;存储的顺序是有序的、可重复的Set&#xff1a;存储的顺序是无序的、不可重复的Map&#xff1a;使用键值对存储&#xff0c;Key和Value都是无序的&#xff0c;其中Key不可重复&#xff0c;而Value可重复 2、ArrayList和LinkedList的区…

JavaEE简单实例——MyBatis的一对一映射的嵌套查询的简单介绍和基础配置

简单介绍&#xff1a; 在前一章我们介绍了关于MyBatis的多表查询的时候的对应关系&#xff0c;其中有三种对应关系&#xff0c;分别是一对一&#xff0c;一对多&#xff0c;多对多的关系。如果忘记了这三种方式的对应形式可以去前面看看&#xff0c;一定要记住这三种映射关系的…

项目重构,从零开始搭建一套新的后台管理系统

背景 应公司发展需求&#xff0c;我决定重构公司的后台管理系统&#xff0c;从提出需求建议到现在的实施&#xff0c;期间花了将近半个月的时间&#xff0c;决定把这些都记录下来。 之前的后台管理系统实在是为了实现功能而实现的&#xff0c;没有考虑到后期的扩展性&#xf…

逆风翻盘拿下感知实习offer,机会总是留给有准备的人

个人背景211本&#xff0c;985硕&#xff0c;本科是计算机科学与技术专业&#xff0c;研究生是自学计算机视觉方向&#xff0c;本科主要做C和python程序设计开发&#xff0c;java安卓开发&#xff0c;研究生主要做目标检测&#xff0c;现在在入门目标跟踪和3d目标检测。无论文&…

并发编程学习篇从0-1合集

一、synchronized 一、原子性、有序性、可见性 1.1 原子性 数据库的事务&#xff1a;ACID A&#xff1a;原子性-事务是一个最小的执行的单位&#xff0c;一次事务的多次操作要么都成功&#xff0c;要么都失败。 并发编程的原子性&#xff1a;一个或多个指令在CPU执行过程中…

用Python获取弹幕的两种方式(一种简单但量少,另一量大管饱)

前言 弹幕可以给观众一种“实时互动”的错觉&#xff0c;虽然不同弹幕的发送时间有所区别&#xff0c;但是其只会在视频中特定的一个时间点出现&#xff0c;因此在相同时刻发送的弹幕基本上也具有相同的主题&#xff0c;在参与评论时就会有与其他观众同时评论的错觉。 在国内…