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元素
VRTK工具包项目拆分:
预设、脚本、案例

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:触摸,触摸时可以配置是否隐藏控制器以及全局高亮颜色

VRTK_Interact Grab:抓取

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(世界指针)即可。

008-Controller_UsingAGrabbedObject
展示了抓取之后再使用对象的功能
场景中极简易的枪按下两个手柄按钮抓取后,再按扳机开火。
Gun是从VRTK_InteractableObject派生出的脚本组件是比较简单的可交互对象的应用。
上图Whirlygig也是继承自VRTK_InteractableObject,使盒子上的胶囊体旋转起来。
009-Controller_BezierPointer
003+007场景。来建立在适应高度传送的基础上,在光标指针上做了优化,使镭射光线呈贝赛尔曲线状,类似于抛物线。优点:使玩家可以传送到实现不可及或者有障碍的地方,例如围墙和高台。
这里贝塞尔光标指针取代简单光标指针,使传送的目标点更灵活。
VRTK_BasicPointer 继承自VRTK_WorldPointer.
贝塞尔指针会从控制器的末端发射一条曲线到任何高度的地表,这比SimpleLaserPointer有用的多,因为镭射指针会被障碍物挡住,而贝塞尔指针的光线是弯曲的,可以跨越障碍物标记到后面的地面,或者穿越高低不平的地形。
010-CameraRig_TerrainTeleporting
在007的基础上加了地形Terrain,也可以传送。

【HTCVR】VRTK插件案例分析之001~010相关推荐

  1. 【HTCVR】VRTK插件案例分析之0038~044

    38 短距离传送 39 自适应质量 40 面板菜单 41 对象捕捉到拖放区域:每个游戏物体都有固定的摆放位置 42 移动到位 43 第二控制器动作 44 受限制的传送带

  2. 【HTCVR】VRTK插件案例分析之0031~037

    031 把贝塞尔曲线指针放在头盔上,激活光线.和可交互对象的互动都是通过控制器来完成的,从头盔发射光线有凝视某个物体的感觉. 032 和在僵尸游戏中配置Ak有相似之处 033 传送到unity自带的导 ...

  3. 【HTCVR】VRTK插件案例分析之0011~020

    011_CameraRig_HeadSetCollisionFading 防穿墙功能,穿墙就变黑(防患于未然) 就像客户进入样板间看房子,由于VR空间中用户的自由度是极高的,难免会把头伸到墙里.在游戏 ...

  4. 【HTCVR】VRTK插件案例分析之0021~030

    21 如何抓取,使用带关节的可交互对象 固定关节对象:立方体 弹力关节:拉取抽屉 旋转追踪机制:开门关门 角色关节:对于操作那些不同形状和多节点的对象更方便,可以通过拉取相关的部分来改变形状. 22 ...

  5. Unity Steam_VR 开发工具插件 VRTK自带案例分析(第一部分)

    转至https://www.cnblogs.com/zerotoinfinity/p/6474840.html VRTK这个工具包提供了很多在Unity3d做VR开发中通用的VR功能,主要包括 1)具 ...

  6. Unity Steam_VR开发工具插件---VRTK 自带案例分析

    DEMO 1  查询硬件手柄头显 在VRTK插件 的第一个demo   001_CameraRig_VR_PlayArea 案例 这个demo 显示的功能:  按下任一手柄上的按键,便载入下一个场景 ...

  7. VRTK插件详解四:部分自带案例分析

    DEMO 1  查询硬件手柄头显 在VRTK插件 的第一个demo   001_CameraRig_VR_PlayArea 案例 这个demo 显示的功能:  按下任一手柄上的按键,便载入下一个场景 ...

  8. R语言案例分析:财政收入的多元相关与回归分析

    R语言案例分析:财政收入的多元相关与回归分析 数据集下载 (mvcase3.xls)中的表Case3. y:财政收入  x1:国内生产总值  x2:能源消费总量  x3:从业人员总数  x4:全社会固 ...

  9. linux 定位 踩内存_运维必备的问题定位工具及案例分析

    [摘要]本文主要介绍各种问题定位的工具,并结合案例分析问题. 1. 背景 有时候会遇到一些疑难杂症,并且监控插件并不能一眼立马发现问题的根源.这时候就需要登录服务器进一步深入分析问题的根源.那么分析问 ...

最新文章

  1. 浅谈FIle协议与Http协议及区别
  2. portainer图形化监控
  3. 【模型迭代】拒绝推断(RI)
  4. tomcat6 优化初步
  5. 为什么男性比女性死得更早,心疼一秒钟!
  6. A - Super Jumping! Jumping! Jumping!
  7. 东方航空:拟与携程等出资设立三亚国际航空
  8. python语言入门-分分钟入门python语言
  9. Codeforces 500D. New Year Santa Network
  10. 在设计数据库时,使用代码,对数据项调整形成数字字典(小代码)
  11. 仿淘宝验证码 php,PHP中仿制 ecshop验证码实例
  12. ios笔试题算法_【2018年最新】iOS面试题之常见算法
  13. JDK动态代理为什么必须要基于接口
  14. 非参数统计的Python实现—— HL 检验
  15. 【聚沙成塔】将Mon Jun 01 2020 00:00:00 GMT+0800 (中国标准时间) 转换为 2020-06
  16. excel手机版_如何一次性将单位所有人的手机号导入手机通讯录中?
  17. html 防网页假死,JavaScript-如何防止由于脚本引起的浏览器假死
  18. mysql中的int(11)到底代表什么意思?
  19. 项目开发成本高周期长 数维图低代码平台解决行业痛点
  20. R语言——字符串提取函数

热门文章

  1. new Foo().getName()经典面试题
  2. 在windows和ubuntu下安装Syncthing
  3. Vscode Pylint no-member
  4. 最新研究报告: 坐飞机哪个位置最安全?
  5. 关于电路的竞争与冒险问题详解
  6. navicat 导出excel数据不全问题
  7. vivo 云原生容器探索和落地实践
  8. latex 参考文献显示问号_UESTC 本科Latex毕设论文模板 无痛上手指南
  9. 征信与风控,这两者千万别搞混了
  10. 初来乍到,zynq的ps端之hello world