【HTCVR】VRTK插件案例分析之001~010
来源:互联网 发布:云和山的彼端 mac 编辑:程序博客网 时间:2024/05/13 09:23
VRTK是个很好用的使用Unity开发Steam VR的工具集,感谢开发者团队在其中做了很多非常棒的工作。其官方文档对插件中的Scripts、Prefabs都做了很详细的介绍。对于插件中的所有例子,官方还做了视频放在了Youtube上。美中不足的是,对每个示例场景的分析不是很详细,这里对每个示例场景做一个比较详细的剖析,一遍掌握其中的用法。先做一下搬运工,以官方文档的内容开头:
欢迎来到VRTK
这个工具包提供了很多在Unity3d做VR开发中通用的VR功能,主要包括:
- 具有别名的控制器按钮事件
- 控制世界指针(激光指针)
- 玩家瞬间转移
- 使用控制器抓起/握住物体
- 使用控制器与物体交互
- 把游戏物体变成交互式的UI元素
这里有什么
这个工具集主要分成三个部分:
- Prefabs - VRTK/Prefabs/
- Scripts - VRTK/Scripts/
- Examples - VRTK/Examples/
所有相关的文件都存放在VRTK这个文件夹里面,这个文件夹可以拷贝到现有工程中。Examples文件夹包含了该工具集中的示例场景。
从这里开始
- 克隆这个代码库 git clone https://github.com/thestonefox/SteamVR_Unity_Toolkit.git
- 使用Unity3d打开SteamVR_Unity_Toolkit
- 从Unity Asset Store下载并导入SteamVR插件
- 浏览Examples中的场景可以查看脚本的示例用法
示例分析
Examples文件夹包含了所有的示例场景,用来说明脚本和prefab的用法。该文件夹中还有一个/Resources/Scripts文件夹,其中包含了示例场景中实现特定功能使用的帮助脚本,例如事件监听器。这些脚本在实际项目中没必要用。
下面开始进入主题:
VRTK这个工具包提供了许多unity引擎中VR常用的功能,诸如(但不局限于):
- 用常用别名封装的控制器按钮事件
- 控制器世界光标指针(eg.镭射光标steamVR_LaserPointer)
- 玩家传送机制
- 用控制器抓取/握住游戏对象
- 用控制器和游戏对象交互
- 把游戏对象转化为可交互的UI元素
001-CameraRig_VR_PlayArea
展示[CameraRig]预设用法的简单场景,实际上就是对VR_PlayArea的简单设置。
002-Controller_Events
还是001的场景,不同的是它控制器的事件进行了封装,便于在使用时进行调用,同时还在该事件触发时打印到控制台窗口。一旦触发对应的控制器事件就会在Console窗口显示。
脚本VRTK_ControllerEvents:(为我们提供控制器事件,即发出对应的事件)负责处理游戏控制器发出的事件,所以绑定在每一个控制器对象上,这样才能实时进行手柄按钮事件的监听(系统按钮除外:因为它是专门为Steam平台菜单预留的按钮,无法被重写)。
当一个控制器按钮被按下的时候,脚本会发送一个事件来表明这个按钮已经被按下了,这样做的好处是允许其他脚本在无须实现任何控制器逻辑的情况下就能监听这个事件,这就是所谓的解耦。
Trigger_Hairline:扳机微扣
Trigger_Touch:扳机触摸
Trigger_Press:扳机按下
Trigger_Click:扳机单击
Grip:手柄按钮
Touchpad_Touch:触摸板触摸
Touchpad_Press:触摸板按下
Application_Menu:应用菜单
Pointer Toggle Button:用来开关镭射光标的按钮,默认触摸板按下
Pointer Set Button:用来设置目的地标志的按钮,默认触摸板按下
Grab Toggle Button:用来抓取游戏对象的按钮,默认为手柄按钮
Use Toggle Button:设置使用游戏对象按钮,默认为扳机单击。
UI Click Button:用来点击UI元素按钮,默认为扳机单击。
Menu Toggle Button:用来调出游戏菜单的按钮,默认为应用菜单
Axis Fidelity:轴发生改变时的保真值,默认为1 。任何大于2的数值将有可能给出过于敏感的结果
003-Controller_SimplePointer
VRTK_SimplePointer:继承自VRTK_WorldPointer,又接着继承VRTK_DestinationMarker,继承MonoBehaviour。
在按下触摸板的时候从控制器上发射一条镭射光线,在碰撞到其他对象的时候会有一个光标指针,这个光标事件同样会打印到控制台窗口。()从控制器前端发射一条射线,射线指向的游戏对象就是我们选中的对象,然后用其他按钮来触发一些操作。
默认扳机键开关,要在VRTK_ControllerEvents里的pointer Toggle Button来改,因为整个事件都是通过该脚本来触发的,SimplePointer只是对事件进行监听。
Enable Teleport:光标指针获取新的目的地时能否传送过去。
抽象类:我们在写某个功能的时候,为了让这个功能可以很方便地重写和扩展,保持对象的一致性和方法的稳定性,就有了抽象类。
抽象层如何派生具象类的?
指针的原理其实很简单,标记一个终点,然后从原点发出一条射线,去获取碰撞到的点。原点就是获取当前的位置,这个很简单,所以指针的脚本主要都是在做终点标记的事情,中途无非是渲染光线懂得过程,所以抽象类就是标记重点VRTK_DestinationMarker.
004-CameraRig_VR_BasicTeleport
在003的基础上新增了简单版本的传送功能。
VRTK_Basic Teleport:按下触摸板发射镭射光线,松开触摸板时就会传送到光标所在的位置。
梳理一下流程:监听控制器事件——指针射线——重点标记——验证是否为有效传送点+传送(就是把CameraRig的位置设置为目标传送点的位置)
005-Controller_BasicObjectGrabbing
控制器触摸场景中物体时,物体高亮,扣动扳机即可抓起该物体,同时你可以做一个扔出去的动作,可以给该物体一个加速度,再松开扳机,即可把对象扔出去。
互动对象上再添加VRTK_Interactable脚本组件。
抓取逻辑:1,控制释放事件后立即执行器上的四个脚本组件
VRTK_Controller Events:(为我们提供控制器事件,即发出对应的事件)
VRTK_Controller Actions:控制器动作
VRTK_Interact Touch:触摸,触摸时可以配置是否隐藏控制器以及全局高亮颜色
2,对控制器按钮事件进行监听,监听到抓取和释放
006-Controller_UsingADoor
实现开关门功能
在抓取的四个脚本添加之后,又添加了VRTK_Interact Use(按下控制器上默认的扳机键来使用一个对象,释放该按钮停止使用该对象。).
在使用VRTK_Interact Use的前提是:建立在触摸和抓取之上,需要控制器事件和动作的支持。
在与可交互对象产生交互时,对象上往往需要一个脚本组件,该组件既可以使VRTK_Interacable Onject,也可以是继承于该类的子类。Openable_Door就是VRTK_Interacable Onject的子类。
也可以开窗户,开柜子,开闸等,只需要调整详细的角度即可。
007-CameraRig_HeightAdjustTeleport
展示了适应高度的传送机制,再有高低梯度的场景中,玩家应该拥有攀爬的能力,和现实中一样。同时,当脚下踏空的时候,也应该会掉落到低处,知道触地在实体上为止。
核心脚本:VRTK_Height Adjust Teleport
继承自VRTK_Basic Teleport,允许基于传送点事都在其他对象上来变更[CameraRig]的Y位置,和VRTK_Basic Teleport一样,脚本组件必须挂载在[CameraRig]上,且必须要World Pointer(世界指针)即可。
- 【HTCVR】VRTK插件案例分析之001~010
- 【HTCVR】VRTK插件案例分析之0011~020
- 【HTCVR】VRTK插件案例分析之0021~030
- 【HTCVR】VRTK插件案例分析之0031~037
- 【HTCVR】VRTK插件案例分析之0038~044
- 【HTCVR】VRTK插件功能
- 【HTCVR】VRTK插件模块功能分析之传送移动(一)
- 【HTCVR】VRTK插件模块功能分析之传送移动(二)
- VRTK案例001~010
- Unity Steam_VR开发工具插件---VRTK 自带案例分析
- Unity Steam_VR开发工具插件---VRTK 自带案例分析
- Unity Steam_VR开发工具插件---VRTK 自带案例分析
- 【HTCVR】VRTK基本功能脚本说明
- VRTK插件详解二:交互之事件与委托分析
- VRTK插件详解三:交互之相关脚本分析
- VRTK插件官方示例分析-040_Controls_PanelMenu
- VR开发之VRTK插件使用(一)
- VRTK插件之与UGUI的交互
- uname命令与uuname命令
- 利用外键关系实现多表关联更新
- 30岁还一事无成,你该怎么办?
- yii excle导出 项目实战
- 全面的freemarker教程
- 【HTCVR】VRTK插件案例分析之001~010
- zoj 2836 Number Puzzle(容斥原理)
- SQL常见死锁例子及分析
- HDU 6140 Hybrid Crystals(简单题 17多校第八场)
- 数据结构实验之排序五:归并求逆序数
- SPOJ CIRU(The area of the union of circles-圆的面积并)
- 电脑网页打不开怎么回事但qq能用
- MySQL常见的错误类型
- java内存区域-方法区