# 代码
需要提前知道的知识点
- 委托和事件
- 动画和动画事件
代码如下:
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 放到动画的最后一帧,可能会因为动画过度的效果而导致动画再次播放(虽然播放的不完全,但是有可能会触发放在前几帧的动画事件),从而导致错误的结果。