VRTK 2.2.1版本所有Demo详解

昨天没事进了vrtk官网,才发现居然已经出到了3.2.0,赶紧下下来看了看。大版本更新变化实在太大了,也突然感觉到了使用插件的坏处,就是要一直追着别人的步伐。。但是怎么说呢,更新毕竟是好事,vrtk在新版本中明显感觉功能强大了不少,因此最近还会抽时间写一篇新版本的vrtk的Demo详解,以下是我之前学习老版本vrtk时总结的一些小小的东西,因为是大半年前总结的,所以有些东西可能理解的并不透彻,但是在之后我使用vrtk作为参考还是提供了很大帮助的,因为最近快离职了所以赶紧把这些东西传到网上。。另外这个最初是写给自己看的,所以很多地方可能不太好懂,欢迎一起讨论。。

有些demo没写,可能是因为那几个demo参考价值不大,或者是内容跟之前写过的demo场景功能相似,所以略过了。


启蒙:
http://www.chinaar.com/unity/1739.html  SteamVR Unity工具包(一):概览和控制器事件
http://www.chinaar.com/unity/1740.html  SteamVR Unity工具包(二):激光和移动
http://www.chinaar.com/unity/1741.html  SteamVR Unity工具包(三):控制器交互


总结:
  控制器行为脚本(VRTK_ControllerActions,绑在左右手控制器上)提供了处理常见控制器行为的帮助方法。如下可用公共方法: IsControllerVisible(): 如果控制器模型是可见的返回真,否则返回假。 ToggleControllerModel(bool on):根据所给布尔值状态设置控制器模型的可见性。如果传入true,控制器模型就被显示出来,如果传入false,控制器就被隐藏了。 
  TriggerHapticPulse(int duration, ushort strength):启动控制器开始震动,根据给定的持续计时(第一个参数)和震动强度(第二个strength参数)。最大强度可以是3999,超过就限制为3999(参考例子016)。
  ToggleHighlightTrigger(bool state, Color? highlight = null, float duration = 0f)第一个参数表示高亮状态,true开始高亮,false取消高亮。第二个参数是颜色。第三个参数是渐变到第二个参数的时间
  防止hingle关节碰撞挤压乱跑:继承该物体的interactObject然后在oncollisionenter、stay和exit中分别打开和关闭物体的刚体动力学。例如只有在可以拉动这个物体的手进入碰撞时不变刚体属性其他物体进入碰撞时打开刚体动力学使其不受影响。另外关节绑定隐藏和左右手控制有些坑可以参考SHAQ的物体抓取


demo:
  003_Controller_SimplePointer例子演示simpointer事件输出,按下某个按键出现射线可在vrtk_controllerEvents中的pointerToggleButton修改


  004_CameraRig_BasicTeleport例子相对003在头盔额外绑定了vrtk_BasicTeleport基础传送器作位移,其中IgnoreTarget...标签可以修改某些物体无法移动(射线射中时仍显示miss,墙可以加这个)


  006_Controller_UsingADoor例子可以控制控制器开门(双向开门)。和013相似,门上脚本继承了VRTK_InteractableObject勾选isUsable然后重写StartUsing方法。具体内容为触发startusing时调用SetDoorRotation判断当前手柄位置在门前还是门后(门要选择是否勾选rotated字段,如果勾选则判断X轴,未勾选则判断Z轴)随后调用SetRotation方法将openRotation变量修改。主要改Y轴,其中doorOpenAngle代表打开的度数,剩下两个字段判断到底正开还是反开,最后update中将门的旋转过度到openRotation。原理上应该是这样,只是代码中sideFlip和side不懂为什么要做的这么复杂。


  007_CameraRig_HeightAdjustTeleport例子使用了VRTK_HeightAdjustTeleport高度可变传送器,基本和基础传送器一样,只是暂时不知道如何设置移动的高度


  009_Controller_BezierPointer例子是使用贝赛尔曲线移动,同样可以根据Pointer Toggle button修改按键触发方式。其中ActivateDelay表示传送间隔防止频繁传送。


  011_Camera_HeadSetCollisionFading展示了利用VRTK_HeadsetCollisionFade脚本(绑在camera(eye)上,5.3以前版本绑在head上)限制玩家无法将头盔伸进碰撞体里面,否则头盔会淡入纯色并禁用传送。注意HeadsetCollisionEventHandler脚本中的HeadsetCollisionEventHandler委托,该委托第二个参数是本类中的一个struct结构体,在调用的时候传递结构体的两个参数进来(碰撞到的物体和头盔camera),很巧妙的做法。使用时可以给HeadsetCollisionDetect事件增加事件或修改VRTK_HeadsetCollisionFade的事件逻辑以检测或提示物体是否可以碰


  012_Controller_PointerWithAreaCollision与009相似是用贝塞尔移动,但是勾选了Handle Play Area Cursor Collisions如果勾选则表示游玩区域只要有碰撞就无法移动,需要一并勾选ShowPlayAreaCursor(显示游玩区域)才能生效。


  013_Controller_UsingAndGrabbingMultipleObjects例子中物体可以拿在手上使用,原理上是继承了VRTK_InteractableObject方法勾选isUsable并且在子类中重写StartUsing和StopUsing(非常好的例子,例如遥控器这种物体拿在手上直接继承重写方法就好了,很舒服。)


  014_Controller_SnappingObjectsOnGrab例子演示物体被抓取时位置绑定(例如剑拿在手上手中握着的总是剑柄)


  015_Controller_TouchpadAxisControl例子演示了利用控制器pad控制一辆汽车移动,控制器上绑着RC_Car_Controller脚本用来做各种事件触发,触发事件全部调用汽车上绑定的RC_Car脚本,这个脚本就用来控制汽车的移动,旋转。汽车移动旋转跳跃统一只用刚体控制,例如MovePosition,MoveRotation和add一个向上的force模拟跳跃。


  016_Controller_HapticRumble例子和026相似,用剑砍箱子。主要展示了剑上面sword脚本中OnCollisionEnter方法调用了TriggerHapticPulse根据挥砍的力度进行手柄震动。另外collisionForce字段在CollisionForce方法中被箱子上挂的脚本Breakable_Cube获取,用来判断大于一定力度会砍到箱子时会在箱子中附加一个爆炸力炸散箱子(原本六个面什么都没有,父类有刚体和box碰撞体,当触发爆炸时会将六个面的parent设为空,并且附加刚体到六个面随后对每个面附加AddExplosionForce爆炸力,具体参考breakable_cube脚本中的ExplodeFace方法)。


  017_CameraRig_TouchpadWalking例子中展示了VRTK_PlayerPresence表示玩家碰撞体,其中 Ignore Grabbed Collisions勾选则表示不和抓取的物体碰撞。另外还有VRTK_TouchpadWalking表示pad控制移动,这个没有什么好说的。


  018_CameraRig_FramesPerSecondCounter展示了vr中显示fps帧数,使用了FramesPerSecondCanvas这个UGUI预设体。


  019_Controller_InteractingWithPointer表示使用simplePointer触发物体using,物体的类写法仍然是继承VRTK_InteractableObject并重写startusing和stopusing方法(我还在父类发现了ongrab和ungrab的以及using的事件,可以灵活使用)。唯一不同的是使用时勾选了PointerActivatesUseAction,则pointer可以触发到改对象的startuse事件(startuse勾选HodlButtonToUse则按住触发startUsing,松开触发stopUsing,不勾选按下则只触发startUsing,再按下触发stopUsing。另外修改useoverrideButton无法控制射线触发方式,只可以更改普通触发的控制器按键)。另外该例子上的左右控制器还绑了一个Controller_Menu脚本,可以参考写法,大致是监听VRTK_ControllerEvents的menu按下和弹起事件触发实例化一个menuBox并显示。menuBox上还挂着一个Menu_Container_Object_Colors脚本,也是继承VRTK_InteractableObject并写了一个切换颜色的方法,当上面三个颜色按钮startUsing时调用该方法执行所有子类继承VRTK_InteractableObject的方法里切换颜色方法切换所有子类颜色(很巧妙)。最后在正方体和原型中的startusing时create物体出来。看似效果比较复杂,但实际上流程十分简洁明了。(有一点疑问是在Menu_Color_Changer中startusing最后调用ResetMenuItems方法遍历所有Menu_Color_Changer执行了stopusing,暂时不知道为什么要这样结束,可能是怕两次startusing间隔时间太短导致报错做的措施)。


  021_Controller_GrabbingObjectsWithJoints例子中使用抓取配合关节绑定实现了开关门/开关盒子/转动轮盘等效果。


  022_Controller_CustomBezierPointer是特殊外观的贝塞尔曲线,特殊预设大致是播放粒子效果。


  023_Controller_ChildOfControllerOnGrab是一个射箭的demo,注意VRTK_ControllerEvents中的grabPressed字段可以判断抓取键是否按下以及VRTK_DeviceFinder.GetControllerLeftHand()可以直接获取到制定控制器或camera(不需要device的ID),其他代码以后有时间细看。
  
  024_CameraRig_ExcludeTeleportLocations设置camera剔除部分物体无法移动。
  
  025_Controls_Overview 强化版关节绑定,使用另外脚本实现而不依靠关节,其中数值变化是ControlReactor脚本中调用另一个脚本的基类OnValueChanged注册改变百分比方法。其他滑动和旋转效果均继承自VRTK_Control脚本,子类代码应该是自己实现的。未细看所以可能有坑,慎用。


  026_Controller_ForceHoldObject例子演示自动抓取,左右控制器都绑定了VRTK_ObjectAutoGrab脚本,其中剑的抓取被设置为不能放下并且抓取模式为变成控制器子物体(即Child_of_Controller而不是fixed_Joint)。这样只要重复开启了VRTK_ObjectAutoGrab剑都会自动跑到控制器上来。




  030_Controls_RadialTouchpadMenu 控制器Menu上的UI,未细看


  034_Controls_InteractingWithUnityUI UGUI实例,未看


  038_CameraRig_DashTeleport Dash移动,会有一个人物移动过去的过渡动画


  039_CameraRig_AdaptiveQuality FPS测试

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章