Unity中AOE自爆动画循环异常及Hitbox失效问题求助
问题解决:AOE爆炸动画循环、Hitbox失效及触发键修改方案
一、触发键改为E键的修改
直接替换输入检测逻辑,把原来的鼠标中键检测改成E键:
// 替换Update方法里的输入判断 if (Input.GetKeyDown(KeyCode.E))
二、动画无限循环修复
从你提供的Animator截图来看,重点检查以下两点:
- 爆炸动画片段的循环设置:选中爆炸动画片段,在Inspector面板中把
Loop Time选项取消勾选,确保动画播放一次后自动停止,不会循环。 - Animator过渡条件:检查爆炸动画回到默认/idle状态的过渡规则,确保没有设置始终为true的过渡条件(比如误加了
true作为过渡条件),同时可以关闭过渡的Has Exit Time,或者设置合理的退出时间,避免动画还没播放完就强制过渡回去,或者无限循环触发。
三、Hitbox完全失效的修复
你的代码和设置存在几个关键问题,逐一修正:
- 协程启动逻辑错误:
CooldownNoHit()协程被放在CanAoE判断外,导致即使技能处于冷却,每次按键都会启动协程,多次重置isAoE状态,干扰Hitbox检测。需要把协程启动移到CanAoE为true的分支内。 - 碰撞检测事件类型错误:AOE技能通常使用触发碰撞而非物理碰撞,把
OnCollisionEnter2D替换为OnTriggerEnter2D,同时确保Hitbox的Collider2D组件勾选了Is Trigger选项。 - 变量状态冲突:原代码中重复设置
isAoE=true,优化逻辑避免冗余。
修改后的完整代码
using System.Collections; using System.Collections.Generic; using UnityEngine; public class AoESelfDetonate : MonoBehaviour { public bool CanAoE = true; public bool isAoE = false; public float AoECoolDown = 5f; private Animator anim; // 提前缓存Animator组件,避免重复获取 void Start() { anim = GetComponent<Animator>(); // 初始化时获取组件 } void Update() { // 改为E键触发 if (Input.GetKeyDown(KeyCode.E)) { Debug.Log("Button Down"); if (CanAoE) { Debug.Log("Can AoE"); CanAoE = false; isAoE = true; anim.SetTrigger("Explode"); StartCoroutine(ResetAttackCooldown()); StartCoroutine(CooldownNoHit()); // 移到CanAoE判断内 } } } // 替换为Trigger事件 void OnTriggerEnter2D(Collider2D collision) { Debug.Log("On Hit"); if (collision.gameObject.CompareTag("Enemy") && isAoE) { Destroy(collision.gameObject); Debug.Log("On Destroy"); } } IEnumerator ResetAttackCooldown() { yield return new WaitForSeconds(AoECoolDown); CanAoE = true; } IEnumerator CooldownNoHit() { yield return new WaitForSeconds(0.60f); isAoE = false; } }
额外调试建议
- 在
OnTriggerEnter2D中输出isAoE的值,确认检测时状态是否正确。 - 检查Hitbox的碰撞层设置,确保和Enemy所在的层级在Physics2D设置中是可以相互检测的。
- 在Animator窗口中开启
Debug模式,实时查看参数和动画状态的切换,确认"Explode"触发后动画是否正常播放一次并回到默认状态。
内容的提问来源于stack exchange,提问作者ChickenNugg265
相关产品推荐
相关产品推荐

