一、拿取物体
要实现拿取的功能,首先给要拿取的物体添加碰撞器,VRTK_InteractableObject脚本,
Disable When Idle: 如果该检查被选中,那么当对象没有与之交互时,将禁用interactable对象脚本。这将消除相互作用的对象对每个帧的调用的潜在数量。
Touch Hightlight Color:高光,该颜色将会覆盖全局的颜色(比如在VRTK_InteractTouch脚本上的修改)。
Allowed Touch Controllers: 决定哪个控制器可以发起接触。
Ignored Colliders:当被接触时,在该物体上的一组碰撞器被忽略。
Is Grabble:决定是否可以被抓取。
HoldButtonToGrab:选中后抓取按键需要一直按着,不选的话按一下物体在手上,再按一下就掉了
Stay Grabbed On Teleport:选中后即使瞬移,物体仍然会在手上。
Valid Drop:决定了在什么环境下抓住的物体可以被丢下。
Grab Override Button:覆盖全局的抓取按键
Allowed Grab Controllers:决定哪个控制器可以被抓取
Grab Attach Mechanic Script:这个决定了被抓去的物体将以什么样的形式被抓取,如果未曾设置相关参数,
那么第一个抓取脚本将会被使用,如果没有,则使用刚性连接脚本将会在运行时自动产生,
Sencondary Grab Action Script:当另外一只手柄控制器尝试抓住该物体的时候,采取什么操作。如果未曾设置相关参数,
这个脚本将会被使用,如果没有,将没有任何反应。
Use Only if Grabbed:如果选中的话,使用只能用在物体当前被抓取时。
Pointer Activates(激活) Use Action:当射线点击到相互作用的物体上,该物体若是没有选择 Hold Button To Use 那么Using方法将会被使用,
且指针无法激活时也能被使用。如果使用这个设置,那么这个世界指针将不会抛出目标集事件,因为它可以防止在使用指针的对象时发生不需要的远程传送。
当我们需要自定义功能的时候,我们就要开始自己写脚本了,我们可以继承这个类,添加自己的功能
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using VRTK;
public class interacted : VRTK_InteractableObject
{
//开始接触
public override void StartTouching(GameObject currentTouchingObject)
{
base.StartTouching(currentTouchingObject);
}
//停止接触
public override void StopTouching(GameObject currentTouchingObject)
{
base.StopTouching(currentTouchingObject);
}
//抓取
public override void Grabbed(GameObject currentTouchingObject)
{
base.Grabbed(currentTouchingObject);
}
//放下物体
public override void Ungrabbed(GameObject currentTouchingObject)
{
base.Ungrabbed(currentTouchingObject);
}
//开始使用
public override void StartUsing(GameObject currentTouchingObject)
{
base.StartUsing(currentTouchingObject);
}
//停止使用
public override void StopUsing(GameObject currentTouchingObject)
{
base.StopUsing(currentTouchingObject);
}
}
最后在控制器脚本上添加VRTK_Interact Touch,VRTK_Interact Use,VRTK_Interact Grab脚本。
VRTK_Interact Controller Appearance 脚本,,可在控制器和物体交互时进行隐藏。