Animation Event ,顾名思义,就是动画中的事件。比如我们现在有这样的需求:当前模型移动到某个位置后触发一个自定义的事件,然后再移动回来,这时就需要调用Animation event来实现了。
Animator 和Animation相关的使用说明可以看这篇文章
https://blog.csdn.net/lengyoumo/article/details/106506810
Animation Event 的使用方法
使用Animation Event有两种方法。一种是通过代码添加事件。一种是使用可视化动画控制器来添加事件。个人比较推荐动画控制器的添加方式,因为这样更加直观而且修改更加方便。下面分别说说这两种事项方式
一 通过动画控制器添加事件
步骤:
- 在animator绑定的物体上添加一个新脚本,并写入触发事件后要调用的方法。要注意这个脚本不能放在其他物体上,否则控制器可能会找不到。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class RbotArmController : MonoBehaviour
{
// 事件触发后 将要调用的方法
public void PrintEvent(int i)
{
print("PrintEvent: " + i + " called at: " + Time.time);
}
}
-
在animation 控制器中的时间线上添加事件帧。
2.1 找到你的.anim动画文件并打开它的控制器窗口
2.2 点击时间线上需要触发事件的位置,然后点击添加事件帧按钮即可生成。 -
事件帧绑定方法
点击时间线上刚刚创建的事件帧,Inspector窗口中就出现了相应的设置选项。function这里填写我们在脚本中创建的方法名:PrintEvent,下面的float、int、object、string是要传递的参数。可以不填。
到这一步就已经实现了关键帧添加。当动画进行到事件关键帧就会触发绑定好的相关事件。
二 通过代码方式添加事件
- 这个脚本创建在哪里都行,只要绑定好animator即可。脚本无法访问到通过控制器创建的事件关键帧,只能自己创建事件关键帧,并设置相关的事件。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class RbotArmController : MonoBehaviour
{
// 指定animation 动画控制器,在脚本所在的物体上直接拖拽即可
public Animator armAnimator;
private void Start()
{
// 创建一个事件
AnimationEvent evt = new AnimationEvent();
// 绑定触发事件后要执行的方法名
evt.functionName = "PrintEvent";
// 执行方法后要传入的参数
evt.intParameter = 12345;
// 设置事件关键帧的位置,当事件过了1.3秒后执行
evt.time = 1.3f;
// 设置目标动画剪辑
AnimationClip clip = armAnimator.runtimeAnimatorController.animationClips[0];
// 绑定事件
clip.AddEvent(evt);
}
// 触发事件后,要执行的方法
public void PrintEvent(int i)
{
print("PrintEvent: " + i + " called at: " + Time.time);
}
}
- 绑定相关的animator
将脚本放到某个物体上,然后拖拽动画所在的animator到armAnimator上,即可完成绑定
这时,当动画播放到1.3秒所在的时间线位置时,绑定的相关方法就会触发。
Animation Event无法触发的解决办法
- 如果是通过animation控制器添加的事件,要注意脚本是否和animator所在的对象所处同一对象。
- 如果是代码的添加方法,注意不能放在基类当中。就是说如果你的 脚本继承了某个基类,而事件的响应方法在基类中,那么这样可能会无法成功触发方法。
- 同时使用代码和动画控制器的方式添加,要注意是否有冲突。
- 在动画控制器上添加关键帧时,要注意是否多点了导致同一时间位置添加了你没注意到的多个事件帧,这样会导致不易定位且不会影响主进程的报错