本文主要是介绍Unity中Animator播放动画结束监听实现,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
本文分享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();
}
这篇关于Unity中Animator播放动画结束监听实现的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!