实现抓取功能:第一,手柄上要添加VRTK_InteractGrab脚本;第二,被抓取的物体上要添加VRTK_InteractableObject脚本并且isGrabbable 标志位设置为真,而且该物体满足被触碰的条件。以上都满足即可抓取物体。
下面为详细步骤:
VRTK_InteractGrab为抓取交互对象脚本,要添加到手柄上。当把该脚本添加到手柄上后,会自动添加VRTK_InteractTouch等脚本到手柄。如图:
被抓取的物体要有碰撞体,而且添加VRTK_InteractableObject脚本,如图:
这样就实现了抓取该物体功能。
下面进行原理详细解析:
VRTK_InteractGrab:抓取交互对象
交互抓取脚本被 添加到[CameraRig] 预制里的控制器对象上,并且需要添加VRTK_ControllerEvents脚本用来监听抓取和释放交互游戏对象的控制器按钮事件。它监听 AliasGrabOn和AliasGrabOff 事件来确定对象合适应该被抓取和释放。
注意:
1、控制器对象也需要添加VRTK_InteractTouch脚本用来确定何时一个可交互对象被触摸到。只有有效的被触摸对象才能被抓取。
2、如果控制器触碰到一个包含VRTK_InteractableObject脚本并且isGrabbable 标志位设置为真的游戏对象,该对象就可以被抓取。
3、如果有效可交互对象是可抓取的,按下控制器上所设置的抓取按钮(默认是Trigger按钮)将抓取和对齐对象到控制器上,并且直到抓取按钮松开才会被释放。
4、当控制器抓取按钮松开时,如果可交互对象是可抓取的,它将会被按一定速率沿着控制器松开时的方向进行推动,这就模拟了对象投掷
5、可交互对象需要碰撞体用来激活触发和一个刚体用来拾取它们并在游戏世界中四处移动它们。
Controller Attach Point:控制器模型上用来吸附抓取的对象的刚体点(默认为tip)
Hide Controller On Grab: 当有效抓取发生时隐藏控制器模型。
Hide Controller Delay:在抓取时隐藏控制器之前的等待时间秒数。
Grab Precognition:预先抓取: 在抓取按钮按下时和控制器正在抓取某个东西时之间时间量。例如,如果一个对象下落过快,因为人的反应时间可能很难及时按下抓取按钮来抓住对象。这个值越高 意味着抓取键可以越提前在控制器碰到对象以及碰撞发生前按下,如果抓取键仍然被按下(如果抓取对象需要持续按键抓取的话),则抓取动作就会成功。
Throw Multiplier:投掷乘数:用来乘以对象被扔出时速度的量。在放大 CameraRig 来模拟能够把物体扔的更远时是很有用的。
Create Rigid Body When Not Touching:如果勾选,当抓取按钮按下时,如果控制器没有碰到一个可交互的对象,那么添加到控制器上的刚体就允许控制器去推动周围其他的刚体对象。
发出事件如下:
· ControllerGrabInteractableObject: 当有效对象被抓取时发出
· ControllerUngrabInteractableObject: 当有效对象从抓取到放开时发出