#unity VRTK#部分常用组件解析(一)

这节,让我们从VRTK的一些案例出发,对VRTK实现的部分基本的类和方法进行分析来加强unity vr开发的能力。


概要:

  1. VRTK_Controller Events(带有通用别名的控制器按钮事件
  2. 两代虚拟类VRTK_DestinationMarker、VRTK_WorldPointer以及派生的各种射线指针类
  3. 基于射线指针实现的各种传送,例如VRTK_BasicTeleport
  4. VRTK_InteractableObjects类:与对象的交互


  • VRTK_Controller Events(script)

这个VRTK_ControllerEvents脚本负责处理游戏控制器(HTC Vive手柄)发出的事件,所以把它绑在每个控制器对象上,这样才能实时进行手柄按钮事件的监听。

当一个控制器按钮被按下的时候,脚本会发送一个事件来表明这个按钮已经被按下了,这样做的好处是允许其他脚本在无须实现任何控制器逻辑的情况下就能监听这个事件,这就是所谓的解耦。当一个控制器按钮被释放的时候,脚本同样会发出一个事件来表明这个按钮已经被松开了。

脚本为所有的按钮设置了一个公共布尔值按钮状态,允许其他脚本来查询某个按钮是否处于按下状态,这样就增加了使用的灵活度。这些布尔值公共变量都通俗易懂,与按钮事件相关。

当然,后面还有许多事件委托。

事件发出的有效载体信息包含:
· controllerIndex:所使用控制器的索引。
· buttonPressure:0到1的浮点数,表示按钮按下的所施加的压力值。
· touchpadAxis: 一个表示触摸板触摸位置的Vector2类型变量。
· touchpadAngle:一个表示触摸板触摸位置的转动位置的浮点数,0是顶部,180是底部,其他角度随之对应。

当控制器被按下时也会有通用动作的别名事件被发出。这些动作别名可以被映射到想要的控制器按钮上。这些别名是:
· Toggle Pointer:打开关闭镭射棒
· Toggle Grab:抓取游戏对象
· Toggle Use:使用对象
· Toggle Menu:打开一个游戏内菜单

而VRTK_ControllerEvents_ListenerExample脚本中则有对应事件的注册。VRTK_ControllerEvents脚本的例子可以在SteamVR_Unity_Toolkit/Examples/002_Controller_Events场景中看到,事件怎样被使用和监听的代码例子可以参见SteamVR_Unity_Toolkit/Examples/Resources/Scripts/VRTK_ControllerEvents_ListenerExample.cs脚本。

      • VRTK_SimplePointer两代虚拟类VRTK_DestinationMarker  、VRTK_WorldPointer以及派生的各种射线指针类)

简单指针(Simple Pointer)脚本从控制器尾部发出一个有色光束来模拟激光束。这在场景中指向对象很有用,它能判断所指向的对象以及对象距控制器发出光束位置的距离。

射线指针类似于鼠标的光标,在VR里我们也需要这样一个“光标”来进行交互和控制。

VRTK_SimplePointer继承VRTK_WorldPointer,又接着继承VRTK_DestinationMarker,继承MonoBehavior。默认使用控制器的触摸板来开关射线,也可以在VRTK_ControllerEvents里更改,因为整个事件都是通过该事件来触发的,而Simple Pointer只是进行监听。从这里看出Simple Pointe对ControllerEvents的依赖。

脚本部分最开始已经说明了继承派生关系,这里从源头开始讲会相对容易理解。

祖类VRTK_DestinationMarker 是传送类的抽象类。(抽象类就是我们在写某个功能的时候,为了让这个功能可以很方便地重写和扩展,保持对象的一致性和方法的稳定性,就有了抽象层)

事件类
  DestinationMarkerEnter - 当与其他gameobject发生collision时发送事件.
  DestinationMarkerExit - 当与其他gameobject结束collision时发送事件.
  DestinationMarkerSet - 当destination marker是active时发送事件,确定最新的目标点 (可用于选择和传送).

事件装载参数 : 

    public struct DestinationMarkerEventArgs 
{ 
    public float distance; 
    public Transform target; 
    public Vector3 destinationPosition; 
    public bool enableTeleport; 
    public uint controllerIndex; 
} 
· float distance - 原点和碰撞点之间的距离.
 · Transform target - 指示射线碰撞到游戏对象的的Transform.
 · Vector3 destinationPosition - 目标点的世界坐标.
 · bool enableTeleport - 是否应该触发传送.
 · uint controllerIndex 发送指示射线的手柄索引.

WorldPointer世界指针继承DestinationMarker,所以我们不用重复写终点标记的事件了,当发生碰撞时就会发出对应的事件。同样派生的SimplePointer也继承它的字段属性和方法,这使实施变得更简单,同时我们可以派生出更多个性化的射线指针。 这个世界指针为所有实现它的类提供了一个玩家区域光标展示。

经过两代继承,SimplePointer只需要初始化指针,重写父类方法。

下面是可用脚本参数:
· Enable Teleport(启用传送):如果勾选了,在目标设置事件中的teleport标志位就设为true,所以传送脚本就知道是否要行动到新的目标。如果这个选项没有勾选的话,控制器光束启动但是不会触发位移。
· Point Hit Color(指针碰撞颜色):当光束和一个有效目标碰撞的颜色。每个控制器可以有不同的颜色设置。
· Pointer Miss Color(指针无碰撞颜色):当光束没有命中有效目标时的颜色。每个控制器可以有不同的颜色设置。
· Show Play Area Cursor(显示游玩区光标):如果这个启动,游玩区界限就会在光束指针的顶端显示出来,颜色和当前指针颜色相同。
· Play Area Cursor Dimensions(游玩去光标尺寸):决定游玩区光标和碰撞的尺寸。如果值为零,Play Area Cursor 的尺寸将根据Play Area空间进行校正。
· Handle Play Area Cursor Collisions(处理游玩区光标碰撞):如果勾选,当游玩区光标和其他物体发生碰撞时,指针颜色就会变成Pointer Miss Color的颜色且WorldPointerDestinationSet 事件将不会被触发,这将防止传送到游玩区会发生碰撞的区域。
· Beam Always On(光束总是开启):如果这个勾选,光束指针总是可见,但是设置目标点事件仍然只会在所指定按钮松开时发出。
· Pointer Thickness(指针光束厚度):光束长宽也可以在脚本里设置以及能够开关显示在光柱最后的球形光柱顶端(表示光标)。
· Pointer Length(指针光束长度):在停止前光束投射的距离。
· Show Pointer Tip(显示指针顶端):切换是否光标显示在光束指针的尾部。

VRTK_SimplePointer脚本的例子可以在SteamVR_Unity_Toolkit/Examples/003_Controller_SimplePointer场景中看到并且事件用法和监听的脚本例子可以看SteamVR_Unity_Toolkit/Examples/Resources/Scripts/VRTK_ControllerPointerEvents_ListenerExample.cs脚本。

作为衍生和功能扩展,VRTK里还有许多其他类型的射线指针,这里先不展开描述。

因为篇幅原因这里就先讲到这里。之后我们会继续讲实现传送的方法以及可以交互的对象。

 



阅读更多
想对作者说点什么?

博主推荐

换一批

没有更多推荐了,返回首页