Unity快速按攻击按钮时动画事件未触发致变量异常问题求助
问题根源与解决办法
1. 核心代码逻辑错误
你主脚本的Update方法存在两个致命问题:
- 使用
Input.GetKey而非Input.GetKeyDown:GetKey会在按键按住的每帧重复执行代码,按住攻击键时,每帧都在强制播放攻击动画、重置gun_attacking,直接打乱动画流程。 - 代码中错误将
gun_attacking设为false,但你需求是按下攻击时把这个变量设为true,逻辑完全相反,直接导致状态混乱。
2. 动画事件失效的本质原因
快速连续按攻击键时,调用Animator.Play("gun_attack")会强制打断当前正在播放的攻击动画,直接跳转到新的攻击动画开头。如果上一次动画还没播放到触发事件的帧,那该动画事件就永远不会执行——被打断的动画已终止,后续帧不会再触发它的事件。
而OnStateExit是Animator状态机的生命周期函数,只要当前动画状态被退出(无论正常播放完还是被强制打断),它都会执行,所以能保证gun_attacking被重置。你之前需要同时保留动画事件和状态机行为才有效,纯粹是主脚本逻辑错误导致的混乱,并非两者都必需。
正确实现方式
第一步:修复主脚本Update逻辑
改成仅在按键按下瞬间触发攻击,且只有非攻击状态下才允许触发:
void Update() { // 用GetKeyDown检测单次按键按下,而非持续按住 if (Input.GetKeyDown(script_buttons.button_attack) && !gun_attacking) { gun_attacking = true; // 与需求一致,设为true player_animator.Play("gun_attack"); } }
第二步:保留状态机行为的OnStateExit(移除动画事件)
只需在攻击动画的状态机行为中保留OnStateExit即可,它能覆盖所有动画退出场景(正常结束/被打断):
override public void OnStateExit(Animator animator, AnimatorStateInfo stateInfo, int layerIndex) { attack_script.gun_attacking = false; }
这样修改后,无论多快按攻击键,只要动画状态退出,gun_attacking都会被重置,不会出现无法重置的情况。
为何之前“双保险”会有效?
因为你主脚本每帧都在把gun_attacking设为false,叠加动画事件偶尔触发、状态机行为偶尔触发,三者混乱叠加刚好“蒙对”结果,但这是错误逻辑的叠加,绝非正确解决方案。
内容的提问来源于stack exchange,提问作者PlayerWet
相关产品推荐
相关产品推荐

