1、将左右手模型放到LeftController、RightController下,调整手模型位置
2、将下方A或B代码挂载到手模型上,并赋值状态机
3、实现能抓取物体
a、左、右手Left/RightController下新建空物体 AttachPoint ,挂载Rigidbody,取消使用重力。 b、将这两个抓取点分别赋值给左右手的组件 VRTK_InteractGrab 的 ControllerAttachPoint 属性。
4、关闭[CameraRig]下方的两个左右手Model。
新建脚本,内容如下:
该脚本分别挂载到自己新建的LeftController和RightController上,用以当获得按下Trigger键信息时,播放手的抓取动画。
别忘了改正播放抓取动画状态机对用的参数、勾选HasExitTime。
using UnityEngine;
using VRTK;
//分别挂载到左右手HandController上去。
public class Skode_VRHandController : MonoBehaviour {
[Tooltip("手模型的动画状态机,用以回调事件播放动画")]
public Animator ani;
void Start () {
//按下Trigger事件
GetComponent<VRTK_InteractUse>().UseButtonPressed += InteractUse_UseButtonPressed;
//松开Trigger事件
GetComponent<VRTK_InteractUse>().UseButtonReleased += InteractUse_UseButtonReleased;
}
private void InteractUse_UseButtonPressed(object sender, ControllerInteractionEventArgs e)
{
ani.SetBool("isGrabbing",true);
}
private void InteractUse_UseButtonReleased(object sender, ControllerInteractionEventArgs e)
{
ani.SetBool("isGrabbing",false);
}
}
最下方的脚本,直接挂载到RightController上,给它赋值手的状态机。注意改下播放的动画名称,动画层级。
播放的动画是状态机动画名称
代码如下:
using UnityEngine;
using VRTK;
//分别挂载到左右手HandController上去。
public class Skode_VRHandController : MonoBehaviour {
[Tooltip("手模型的动画状态机,用以回调事件播放动画")]
public Animator ani;
void Start () {
//获得按下Trigger键的深度
GetComponent<VRTK_ControllerEvents>().TriggerAxisChanged += Skode_VRHandController_TriggerAxisChanged;
}
private void Skode_VRHandController_TriggerAxisChanged(object sender, ControllerInteractionEventArgs e)
{
//直接播放状态机中的动画,而不是状态机。
//动画片段,位于状态机的0层,动画时间/进度
ani.Play("Grab",0,e.buttonPressure);
ani.speed = 0; //暂停动画,便于逐帧进行控制。
}
}
最终效果:
大家还有什么问题,欢迎在下方留言!