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();
    }
}

如果文章对你有帮助,不妨关注我一下,点个赞。
我会一直分享Unity开发中解决的坑,分享学到的技术,也会分享读书心得和理财心得,谢谢大家。

  • 4
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

真鬼123

祝你节节高升岁岁平安越来越漂亮

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值