主要代码逻辑是创建一个action队列,当动画播放结束时就移除队头,执行后面的事件
public class Enemy : MonoBehaviour
{
public event Action E_AnimatorFin;//当动画播放完毕时
public Action DefaultAction;//默认事件
public Dictionary<Action, string> EventAnimator= new();//Event对应的动画
public List<Action> Eventlist=new();//要做的event列表
private Animator ani;
public virtual void Start()
{
ani = GetComponent<Animator>();
E_AnimatorFin += OnAnimatorFinish;
StartCoroutine(SpawningAnimator());
IEnumerator SpawningAnimator()
{
yield return new WaitForSeconds(0.02f);
PlayAnimator(ani, EventAnimator[ Eventlist[0]],
() =>
{
Debug.Log("动画播放前执行代码"+ EventAnimator[ Eventlist[0]]);
},
() =>
{
E_AnimatorFin?.Invoke();
Debug.Log("动画播放完执行代码");
});
}
}
public virtual void OnAnimatorFinish()
{
StartCoroutine(spawnanimator());
IEnumerator spawnanimator()
{
yield return new WaitForSeconds(0.02f);
if (Eventlist.Count == 0)
{
Eventlist.Add(DefaultAction);
Debug.LogWarning(name+$"并没有新的事件,目前在执行默认的事件");
}
try
{
PlayAnimator(ani, EventAnimator[ Eventlist[0]],
() =>
{
De