# 代码

需要提前知道的知识点

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

代码如下:

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 { }
        public AnimEventHandler onCancelAnim;
        public AttackEventHandler onMeleeAttack;
        public AttackEventHandler onRangedAttack;
        private Animator anim;
        private AudioSource audioSource;
        private void Awake()
        {
            anim = this.GetComponent<Animator>();
            audioSource = this.GetComponentInParent<AudioSource>();
        }
        // 需要手动添加动画事件
        /// <summary>
        /// 取消动画时触发
        /// </summary>
        /// <param name="animParam">AnimatorParameter</param>
        private void OnCancelAnim(string animParam)
        {
            anim.SetBool(animParam, false);
            onCancelAnim?.Invoke();
        }
        /// <summary>
        /// 声音特效
        /// </summary>
        private void OnAudio(AudioClip audio)
        {
            audioSource.PlayOneShot(audio);
        }
        /// <summary>
        /// 近战攻击时触发
        /// </summary>
        private void OnMeleeAttack()
        {
            onMeleeAttack?.Invoke();
        }
        /// <summary>
        /// 远程攻击时触发
        /// </summary>
        private void OnRangedAttack()
        {
            onRangedAttack?.Invoke();
        }
    }
}

# 使用方法

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

img

img