上一节讲了实现基础传送传送的VRTK_BasicTeleport,和可交互对象组件VRTK_InteractableObject。
这次的内容与可交互对象相关联:
控制器上的各个交互组件:
触摸交互对象(VRTK_InteractTouch)
触摸交互脚本被添加到[CameraRig] 预制里的控制器对象上。
可用参数如下:
· Hide Controller On Touch: 当有效触碰发生时隐藏控制器模型
· Hide Controller Delay:触摸隐藏控制器之前的等待秒数。
· Global Touch Highlight Color: 如果交互对象被触碰就能高亮显示,没有设置本地颜色的话就使用全局颜色。
发出事件如下:
· ControllerTouchInteractableObject:当有效对象被碰到时发出
· ControllerUntouchInteractableObject: 当一个有效对象不再被触碰时发出
发出事件有效载体信息包含:
· controllerIndex(控制器序号):正在交互的控制器的序号
· Target(目标): 控制器正在交互的对象的GameObject
VRTK_InteractTouch 的例子参见SteamVR_Unity_Toolkit/Examples/005_Controller_BasicObjectGrabbing场景。场景演示了添加了 VRTK_InteractableObject 脚本的对象被控制器触碰时能够高亮显示交互对象的能力。
抓取交互对象(VRTK_InteractGrab)
交互抓取脚本被添加到[CameraRig] 预制里的控制器对象上,并且需要添加VRTK_ControllerEvents脚本用来监听抓取和释放交互游戏对象的控制器按钮事件。它监听AliasGrabOn和AliasGrabOff 事件来确定对象合适应该被抓取和释放。
控制器对象也需要添加VRTK_InteractTouch 脚本用来确定何时一个可交互对象被触摸到。只有有效的被触摸对象才能被抓取。
如果控制器触碰到一个包含VRTK_InteractableObject脚本并且isGrabbable 标志位设置为真的游戏对象,该对象就可以被抓取。
如果有效可交互对象是可抓取的,按下控制器上所设置的抓取按钮(默认是Trigger按钮)将抓取和对齐对象到控制器上,并且直到抓取按钮松开才会被释放。
当控制器抓取按钮松开时,如果可交互对象是可抓取的,它将会被按一定速率沿着控制器松开时的方向进行推动,这就模拟了对象投掷。
可交互对象需要碰撞体用来激活触发和一个刚体用来拾取它们并在游戏世界中四处移动它们。
可用脚本参数如下:
· ************************************************************
· Controller Attach Point:控制器模型上用来吸附抓取的对象的刚体点(默认为tip)
· Hide Controller On Grab:当有效抓取发生时隐藏控制器模型。
· Hide Controller Delay:在抓取时隐藏控制器之前的等待时间秒数。
· Grab Precognition(预先抓取): 在抓取按钮按下时和控制器正在抓取某个东西时之间时间量。例如,如果一个对象下落过快,因为人的反应时间可能很难及时按下抓取按钮来抓住对象。这个值越高意味着抓取键可以越提前在控制器碰到对象以及碰撞发生前按下,如果抓取键仍然被按下(如果抓取对象需要持续按键抓取的话),则抓取动作就会成功。
· Throw Multiplier(投掷乘数):用来乘以对象被扔出时速度的量。在放大 CameraRig 来模拟能够把物体扔的更远时是很有用的。
· Create Rigid Body When Not Touching:如果勾选,当抓取按钮按下时,如果控制器没有碰到一个可交互的对象,那么添加到控制器上的刚体就允许控制器去推动周围其他的刚体对象。
发出事件如下:
· ControllerGrabInteractableObject: 当有效对象被抓取时发出
· ControllerUngrabInteractableObject: 当有效对象从抓取到放开时发出
发出事件有效载体信息包含:
· controllerIndex: 正在交互的控制器序号
· target: 控制器正在交互的对象的GameObject
VRTK_InteractGrab的例子可以参见SteamVR_Unity_Toolkit/Examples/005_Controller/BasicObjectGrabbing场景。场景演示了抓取挂有VRTK_InteractableObject 脚本的可交互对象。对象可拾起可抛出。
更复杂一点的例子可以参见场景SteamVR_Unity_Toolkit/Examples/013_Controller_UsingAndGrabbingMultipleObjects ,这里演示了每个控制器都能单独抓取和使用对象并且对象也可以被同时切换它们的使用状态。SteamVR_Unity_Toolkit/Examples/014_Controller_SnappingObjectsOnGrab场景演示了不同的对齐抓取的对象到控制器上的机制。
使用可交互对象(VRTK_InteractUse)
交互使用脚本被添加到[CameraRig] 预制里的控制器对象上,并且需要添加VRTK_ControllerEvents脚本用来监听使用和停止使用交互游戏对象的控制器按钮事件。它监听AliasUseOn 和AliasUseOff 事件来确定对象合适应该被使用和停止使用。
控制器对象也需要添加VRTK_InteractTouch脚本来决定何时可交互对象被触碰。只有有效的触碰对象才能被使用。
如果控制器触碰到一个包含VRTK_InteractableObject 脚本且isUsable标志位设置为真,这个对象就能被使用。
可用脚本参数如下:
· Hide Controller On Use:当有效使用动作开始时隐藏控制器模型
· Hide Controller Delay:在使用之前,隐藏控制器的等待时间秒数
发出事件如下:
· ControllerUseInteractableObject: 当一个有效对象开始被使用时发出
· ControllerUnuseInteractableObject: 当一个有效对象停止被使用时发出
发出的事件的有效载体信息包含:
· controllerIndex: 正在交互的控制器序号
· target: 控制器正在交互的对象的GameObject
例子参见SteamVR_Unity_Toolkit/Examples/006_Controller_UsingADoor场景,模拟打开一扇门和关上。地上也有一个立方体可以被抓取来展示可交互对象怎么被使用或者抓取。
另一个例子可参见SteamVR_Unity_Toolkit/Examples/008_Controller_UsingAGrabbedObject场景,它展示了对象可以用一个按钮抓取并用另一个按钮使用。
自动抓取可交互对象(VRTK_ObjectAutoGrab)
通过把VRTK_ObjectAutoGrab脚本加到控制器上并指定应该默认抓取的对象,来让特定控制器能自动抓取可交互对象。
自动抓取对象脚本添加到[CameraRig] 预制里的控制器对象上,控制器对象还需要添加VRTK_InteractGrab 脚本。
可用脚本参数如下:
· Object To Grab(抓取的对象):在游戏开始时被控制器抓取的游戏对象(在场景或者预制里)。
· Clone Grabbed Object(复制被抓取对象):如果勾选,Object To Grab(抓取的对象)将被复制到一个新对象并添加到控制器上,而被复制的对象留在场景里。这在两个控制器都需要抓取同样的对象时是需要的,因为单个对象不能被不同的控制器同时抓取。如果被抓取的对象是一个预制就也需要被复制,因为它需要存在于场景中被抓取。
例子参见SteamVR_Unity_Toolkit/Examples/026_Controller_ForceHoldObject场景。这里每个控制器自动抓取了一把剑,同时为了防止剑被扔掉,剑被永久的添加到用户的控制器上
到这里我们就可以在场景里使用这些组件,通过控制器来与物体进行各种交互了。如果要编写自己的物体交互方式可以在该物体上绑上一个自定的脚本组件,让它继承自VRTK_InteractableObject,然后对交互方法进行重载即可。