手动添加动画回调事件
在帧动画上方右键,添加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();
}
}