本文分享Unity中Animator播放动画结束监听实现
今天要分享的是一个在项目中会经常用到, 但是却没有一个统一实现的问题.
我们在Unity的开发中经常会用到动画, 即使用Animator, 但是Unity却没有给我们提供动画结束的回调方法.
通常情况下, 在一些比较简单的项目中, 我们会在动画帧中添加结束事件来达到我们的目的. 这也是Unity官方推荐的方式.
但是在一些大型项目中, 我们很难对所有的动画都添加结束事件, 所以最好能使用代码来完成.
很多同学都会遇到这种困扰, 作者也曾经查询过大量的资料和网站, 做过各种尝试.
下面就给大家大概介绍下一些常用的方式.
通过手动添加结束事件来实现
新建一个Animaton, 选择需要添加事件的帧, 点击添加事件, 输入事件回调方法. 如下:
然后在使用该动画的脚本中实现对应的回调方法即可达到目的.
这种方式在大部分小型项目中都可以正常使用, 只是使用较为繁琐.
通过状态机状态的变化来实现
Unity的动画是基于状态机的, 所以我们可以通过状态的切换来间接获得动画的结束.
但是状态机的变化只能在Editor模式下监听到, 所以这种方式一般不使用, 有兴趣的同学可以自行研究.
通过延时来实现
通过查询动画片段的执行时间, 用一个定时器来做回调. 下面是代码:
public int PlayEffect(string stateName, Action callback = null)
{
var animator = GetComponent<Animator>();
animator.Update(0f);
animator.Play(stateName, -1);
if (callback == null) return 0;
StartCoroutine(DelayRunEffectCallback(animator, stateName, callback));
return 0;
}
public IEnumerator DelayRunEffectCallback(Animator animator, string stateName, Action callback)
{
// 状态机的切换发生在帧的结尾
yield return new WaitForEndOfFrame();
var info = animator.GetCurrentAnimatorStateInfo(0);
if (!info.IsName(stateName)) yield return null;
yield return new WaitForSeconds(info.length);
callback();
}