VRTK案例001~010

来源:互联网 发布:burpee 知乎 编辑:程序博客网 时间:2024/04/28 17:37

VRTK这个工具包提供了许多unity引擎中VR常用的功能,诸如(但不局限于):

  • 用常用别名封装的控制器按钮事件
  • 控制器世界光标指针(eg.镭射光标steamVR_LaserPointer)
  • 玩家传送机制
  • 用控制器抓取/握住游戏对象
  • 用控制器和游戏对象交互
  • 把游戏对象转化为可交互的UI元素
VRTK工具包项目拆分:
预设、脚本、案例

001-CameraRig_VR_PlayArea

展示[CameraRig]预设用法的简单场景,实际上就是对VR_PlayArea的简单设置。


002-Controller_Eventsduiying

还是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,也可以传送。


0 0
原创粉丝点击