Unity代码添加Animator动画回调事件

手动添加动画回调事件

在帧动画上方右键,添加Animation Event;
在Inspector选择添加的方法。
需要脚本挂载在相应有Animator的物体上,才可选择其public方法。
在这里插入图片描述

代码添加动画回调事件

需要用到的类
Animator、
AnimatorOverrideController 用于覆盖控制器中的动画剪辑,以针对给定的头像专门化动画,不会重置状态机的当前状态、
AnimationClip 存储基于关键帧的动画、
AnimationEvent 动画事件、
Action。
参数定义,使用Dictionary存储AnimationClip

添加动画事件代码:
方法一:Clip.AddEvent();有效期到运行结束。
方法二:AnimationUtility.SetAnimationEvents(),相当于手动添加,永久有效。

  	private Animator mAnim;
    private AnimatorOverrideController mController;
    private Dictionary<string, AnimationClip> mClipDic = new Dictionary<string, AnimationClip>();
    private Action mCallBack;
    private AnimationEvent evt;

初始化

  public void Awake()
    {
        mController = new AnimatorOverrideController();
        mAnim = transform.GetComponent<Animator>();
        //通过Animator中的runtimeAnimatorController,将AnimatorOverrideController与Animator链接
        mController.runtimeAnimatorController = mAnim.runtimeAnimatorController;
    }

播放调用

public void Play(string animName, Action action)
    {
    	//回调事件
        mCallBack = action;
        //避免重复添加多个回调函数到动画中。
        if (!mClipDic.ContainsKey(animName))
        {
        	//通过AnimatorOverrideController[动画名],获取clip
            mClipDic.Add(animName, mController[animName]); 
            //初始化AnimationEvent 动画事件。
            evt = new AnimationEvent();
            //事件挂载的时间位置。
            evt.time = mClipDic[animName].length;
            //事件调用的函数名
            evt.functionName = "MyCallback";
            //加入到clip中。有效期:播放结束
            //mClipDic[animName].AddEvent(evt);
            //加入到clip中。有效期:永久。直到手动删除。
            AnimationUtility.SetAnimationEvents(mClipDic[animName], new AnimationEvent[] { evt });
        }
        //播放动画
        mAnim.Play(animName,0,0);
    }
    
    private void MyCallback()
    {
        if(mCallBack != null)
            mCallBack.Invoke();
    }

完整代码

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using NaughtyAttributes;
using UnityEngine.Events;
using UnityEditor;
using System;
/// <summary>
/// 播放Animator并加入播放完成回调。
/// </summary>
[RequireComponent(typeof(Animator))]
public class UIAnim : MonoBehaviour
{
    private Animator mAnim;
    private AnimatorOverrideController mController;
    private Dictionary<string, AnimationClip> mClipDic = new Dictionary<string, AnimationClip>();
    private Action mCallBack;
    private AnimationEvent evt;
    public void Awake()
    {
        mController = new AnimatorOverrideController();
        mAnim = transform.GetComponent<Animator>();
        mController.runtimeAnimatorController = mAnim.runtimeAnimatorController;
    }

    public void Play(string animName, Action action)
    {
        mCallBack = action;
        if (!mClipDic.ContainsKey(animName))
        {
            mClipDic.Add(animName, mController[animName]); 
            evt = new AnimationEvent();
            evt.time = mClipDic[animName].length;
            evt.functionName = "MyCallback";
            //mClipDic[animName].AddEvent(evt);
            AnimationUtility.SetAnimationEvents(mClipDic[animName], new AnimationEvent[] { evt });

        }
        mAnim.Play(animName,0,0);

    }
    private void MyCallback()
    {
        if(mCallBack != null)
            mCallBack.Invoke();
    }
}

发布了7 篇原创文章 · 获赞 1 · 访问量 177

猜你喜欢

转载自blog.csdn.net/boyZhenGui/article/details/104016087