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