VRTK是扩展SteamVR的一个Unity3D插件,主要是为了方便开发者快速地开发出vr产品,其内置了相当多的当下比较成熟的VR界面下的交互、操作等解决方案,目前最新版本为3.2.0,支持了更多VR设备,功能也更加强大。然而我昨天才知道并下载。。因此写下此文章来供自己参考,当然也欢迎讨论新插件的黑科技。。
另外steamVR也更新到了1.2.1,其中也有一个Demo场景,也实现了相当多的交互操作,虽然目前版本功能并没有VRTK提供的功能强大,但是使用起来感觉非常流畅,其中的射箭Demo完全就跟TheLab中的射箭操作感一模一样。。相比之下vrtk那个寒酸的射箭场景就....如果steamVR在下个版本提供更多Demo场景和更强大的功能,我想会抢走相当多的steamVR开发者抛弃vrtk了吧。。。哈哈
因为我是从老版本转过来的,因此可能很多地方会和老版本作对比。还有一些Demo场景未写,原因是跟老版本差别不大因此不再浪费时间解释。望谅解哈。
开始:
测试发现VRTK_TrackObjectGrabAttach跟踪抓取在碰撞很多的地方比关节抓取效果要好一些,关节抓取控制器在碰撞体内时被抓取得物体会乱飞,但是跟踪抓取试了一下似乎没有这个问题。
VRTK_ObjectAppearance静态类包含一些操作gameobject的功能,例如将其高亮,改变透明度等(高亮需要这个gameobject挂了继承
VRTK_BaseHighlighter的组件,例如VRTK_OutlineObjectCopyHighlighter,还需要先调用该组件的Initialise初始化方法之后才能
用VRTK_ObjectAppearance高亮)。
008_Controller_UsingAGrabbedObject这个例子又从VRTK_InteractableObject脚本上分离出来了一个VRTK_InteractControllerAppearance脚本。该脚本效果同旧版本的抓取/触摸/使用时隐藏控制器。以及场景中还有一些比老版本更多的其他可交互物体。
011_Camera_HeadSetCollisionFading 这个例子中[VRTK_Scripts]下挂的脚本VRTK_HeadsetCollision有一个对象:headset,它在
运行时动态寻找当前头盔并变为其子物体。新版本中很多挂在[VRTK_Scripts]下的脚本都是以此方法寻找到正确的当前VR设备,因此开发者不需要考虑我用htcVive时和Oculus时脚本需要做出什么改变,vrtk会自动帮你做这块的工作。
012_Controller_PointerWithAreaCollision 利用VRTK_BodyPhysics和VRTK_HeadsetCollision给角色全身添加了碰撞体。另外还
在手柄上分离了VRTK_PlayAreaCursor脚本来显示移动时游玩范围指示,另外和旧版本一样勾选了此脚本上的
HandlePlayAreaCursorCollisions来限制玩家不能移动到游玩范围碰撞到其他碰撞体的位置。
017_CameraRig_TouchpadWalking 老版本直接在camerarig上添加VRTK_TouchpadWalking脚本就行了。新版本需要在移动的手柄
上加VRTK_TouchpadControl脚本来控制移动。
021_Controller_GrabbingObjectsWithJoints 这个场景新增加了些东西,例如一个蓝色盒子,主要用来演示
VRTK_SpringJointGrabAttach这个脚本,物体被抓取时创建一个关节,感觉就像抓到一个很重的东西。
还有一个灭火器,管子是用弹簧关节连接的(虽然效果还是很假...),然后管头也可以抓取,还可以设置BreakDistance,这个值是
自定义的,超出范围后手动调用交互物体类的ForceStopInteracting方法就可以强制放下对象(因为管头用的是追踪连接,不能像
关节连接一样设置breakForce,因此只能这样去判断)。
然后还有一把手枪,其中开枪后会打开手枪脚本并移动手枪顶的位置,手枪顶的关节会将其强行拉回来,感觉就像是开枪产生的动画
,另外枪上还有一个保险栓,可以打开或关闭使枪不能射击(保险栓碰撞很小,之前旧版本这种小碰撞体很难触摸到,但是新版本却
很容易,可能vrtk新版本有优化吧)。
023_Controller_ChildOfControllerOnGrab 射箭例子在[VRTK_Scripts]中出现了新脚本:HeadsetFollower对象上挂的
VRTK_SDKObjectAlias 挂了这个脚本的物体会在运行时自动变为所选SdkObject的子物体(只看到了头和camerarig的子物
体的选项,可以自己扩展左右手),然后Headset对象挂了一个VRTK_TransformFollow脚本,GameObjectToFollow就是
HeadsetFollower对象,GameObjectToChange则是自己。这样最终效果就是HeadsetFollower对象和头部位置一致,然后
Headset也与HeadsetFollower对象位置一致,都是头部子物体,取箭就可以在头部取。
024_CameraRig_ExcludeTeleportLocations 例子展示有些地区不能移动,利用了VRTK_PolicyList。
025_Controls_Overview 这个场景使用vrtk自带脚本实现了vr模式下的一些物理交互,值得一提的是有一个旋转按钮在老版本中是
没有最大最小值限制的,就像煤气灶开关一样,但是却可以无限旋转。。所以新版本新加了更多交互例子,也为旋转按钮增加了限制。
027_CameraRig_TeleportByModelVillage 这个例子运用了ModelVillage_TeleportLocation脚本实现靠近三个方块中的一个后按下
扳机键后传送到某处。旧版本也有这个例子但是当时没看。。注意场景这个桌子也是利用023demo的脚本让桌子变成camerarig的子
物体。
028_CameraRig_RoomExtender 这个例子使用了VRTK_RoomExtender脚本来扩展游玩范围,但是无论老版本还是新版本效果都不太好。。
029_Controller_Tooltips 这个例子是各种提示..其实没啥好说的,看看demo就都懂了。唯一跟老版本的一点区别就是加了一个
VRTK_HeadsetControllerAware脚本用来控制手柄距离多近之后显示提示。
030_Controls_RadialTouchpadMenu 例子是手柄选择的ui,还有靠近物体时显示一个可选择选项的ui。没有细看,以后可能会用到
,所以mark一下。。
031_CameraRig_HeadsetGazePointer 这个例子一个是靠头盔来移动,一个是靠头顶上一个黄球对象控制移动。可能没什么用,但
还挺有意思,以后说不定会用到,再mark一下!
032_Controller_CustomControllerModel 改变控制器模型的例子,这个真没什么好说的了。
034_Controls_InteractingWithUnityUI 这个例子最大的改变就是有了一个可拖动的UI,主要是用了VRTK_UIDraggableItem这
个脚本,配合VRTK_UIDropZone脚本实现物体可拖入方框。注意VRTK_UIDraggableItem要勾选restrictToDropZone代表
可拖入挂了VRTK_UIDropZone的框框中去,另外一个restrictToOriginalCanvas表示物体是否可拖入canvas画布中。另
外这个拖动完美兼容ugui的EventTrigger脚本,具体使用方法可以参考例子。
035_Controller_OpacityAndHighlighting 这个例子控制器按下任何按键都会高亮该按键并且提示ui,可以参考脚本:
VRTK_ControllerAppearance_Example。手柄高亮仍然依靠VRTK_OutlineObjectCopyHighlighter脚本控制。另外这里有个功能:
VRTK_ObjectAppearance.SetOpacity(GameObject model, float alpha, float transitionDuration = 0f)
方法可以设置一个model的透明度。
037_CameraRig_ClimbingFalling 这个例子每个物体都挂了VRTK_ClimbableGrabAttach脚本使得可以用手柄攀爬(可交互物体使用
该脚本后不能再给可交互物体增加其他抓取方式)。另外场景中还有一个绳索,抓住之后会位移这个绳索实现滑动效果。
040_Controls_PanelMenu 这个例子使用了PanelMunu这个预设体放为可交互对象的子物体,按下pad对应按键后会弹出对应ui,一
些可交互ui需要调用VRTK_PanelMenuItemController对应的事件方法,具体可以参考此demo。
041_Controller_ObjectSnappingToDropZones 这个例子利用了SnapDropZone这个预设体实现物体放到指定位置拼装的功能,左边
简单物体的拼装效果还不错,但是右边人体的拼装体验很差,稍不注意胳膊腿就飞了。。即使关节的breakForce设置了infinity但
是还是无效。。回头如果这个功能运用到项目中的话还存在这个问题那这个功能就很鸡肋了。。
042_CameraRig_MoveInPlace 之前demo有一个是用pad键控制移动,是一个很鸡肋的功能,因为会很晕。vrtk似乎注意到了这个问
题,所以这个demo更改了移动方式,利用VRTK_MoveInPlace脚本实现控制器按下某个键之后不停地做Y轴移动才开始移动,这样会
使玩家增加一点沉浸感,虽然暂时还是觉得很鸡肋啊!
043_Controller_SecondaryControllerActions 这个场景共有两个有用的脚本,一个是放着长枪和拐杖上的
VRTK_ControlDirectionGrabAction脚本,它的用处是使这个可交互物体变为可双手抓取,一个手抓取,另一个手控制旋转。想象
一下手持shotGun的时候就需要双手,一个细节是挂了此脚本的可交互物体不能用关节控制器,如果勾选PrecisionGrab(按当前控
制器位置抓取)后另一只手控制的旋转就不会复位,如果使用了SnapHandle那么另一只手松开后旋转会复位。然后另一个脚本是
VRTK_AxisScaleGrabAction,它可以让另一只手改变物体缩放。
044_CameraRig_RestrictedTeleportZones 最后一个例子主要展示了固定目标点位移。主要是依靠DestinationPoint这个预设体,
上面挂的脚本VRTK_DestinationPoint很明了了:开关传送、默认样式,hover的样式以及关闭时的样式等等的功能。目前我在开
发的一个项目就是需要这种定点传送,奈何我还用着老版本的vrtk..都是泪啊。。
总结:
花了大半天的时间总算大致看完了新版vrtk的demo。其实怎么说呢,我一直认为这些插件一定要把这些demo仔细看一遍,这样在
开发时心里才能有一些底。vrtk的确很强大,但它并不是百科全书。遇到问题时才来匆匆忙忙一个一个查找demo费时又费力,而
且也不一定有你需要的效果。而如果你完整的看过vrtk的所有demo,遇到问题时可以先在脑子过一遍vrtk是否已经有了解决方案?
如果没有是否有类似的效果,能否改改就用呢?这样在美术或者策划带着天马行空的想法来要求你实现时你才能更得心应手地预
估他们的想法实现难度。不过虽然这么说估计我马上也要转行做别的了,vr实现的效果毕竟还是有些简单,而且我目前也在我司
看不到任何前途。。希望以后vrtk和steamvr更加强大,能够推出更强大的插件吧。。也希望vr不要就此没落啦...