# 代码

需要提前知道的知识点

  • 委托和事件
  • 动画和动画事件

代码如下:

AnimationEventBehaviour
using System;
using UnityEngine;
using UnityEngine.Events;
namespace Common
{
    /// <summary>
    /// 动画事件行为类
    /// </summary>
    public class AnimationEventBehaviour : MonoBehaviour
    {
        // 在特定时机取消动画或触发事件
        // 实际的使用过程中,需要什么事件就在这个脚本里添加
        [Serializable]
        public class AnimEventHandler : UnityEvent { }
        [Serializable]
        public class AttackEventHandler : UnityEvent { }
        private Animator Anim;
        public AnimEventHandler CancelAnim;
        public AttackEventHandler MeleeAttack;
        public AttackEventHandler RemoteAttack;
        private void Awake()
        {
            Anim = this.GetComponent<Animator>();
        }
        // 需要手动添加动画事件
        /// <summary>
        /// 取消动画时触发
        /// </summary>
        /// <param name="animParam">AnimatorParameter</param>
        private void OnCancelAnim(string animParam)
        {
            Anim.SetBool(animParam, false);
            CancelAnim?.Invoke();
        }
        /// <summary>
        /// 近战攻击时触发
        /// </summary>
        private void OnMeleeAttack()
        {
            MeleeAttack?.Invoke();
        }
        /// <summary>
        /// 远程攻击时触发
        /// </summary>
        private void OnRemoteAttack()
        {
            RemoteAttack?.Invoke();
        }
    }
}

# 使用方法

注意:如果将 OnCancelAnim 放到动画的最后一帧,可能会因为动画过度的效果而导致动画再次播放(虽然播放的不完全,但是有可能会触发放在前几帧的动画事件),从而导致错误的结果。

img

img