Unity2D敌人攻击动画中断问题:如何让攻击完成后再切换状态
解决敌人攻击动画被中断的问题
核心问题是当前逻辑在玩家移出攻击范围时立刻终止攻击状态,导致动画被打断。要解决这个问题,必须让攻击动画完整播放完毕后,再切换回追击状态,具体修改步骤如下:
1. 新增状态控制变量
在敌人脚本的类中添加两个变量,用于跟踪攻击状态和是否需要终止攻击:
private bool isAttacking; // 标记当前是否正在播放攻击动画 private bool shouldStopAttack; // 标记玩家是否已离开攻击范围,需在动画结束后停止攻击
2. 修改攻击触发与状态判断逻辑
调整EnemyLogic和新增攻击检查方法,避免直接中断攻击:
void Update() { EnemyLogic(); CheckAttack(); // 新增:检查是否满足攻击条件 if(!attackMode) { Move(); } } void EnemyLogic() { distance = Vector2.Distance(transform.position, target.position); // 玩家离开攻击范围时,仅标记需要停止攻击,不立刻中断 if(distance > attackDistance) { shouldStopAttack = true; } } // 新增:检查攻击触发条件 void CheckAttack() { // 满足攻击距离、不在冷却、不在攻击动画中时,触发攻击 if(distance <= attackDistance && !cooling && !isAttacking) { attackMode = true; isAttacking = true; shouldStopAttack = false; anim.SetBool("Attack", true); anim.SetBool("canWalk", false); cooling = true; // 这里可以添加攻击伤害逻辑 } }
3. 添加动画完成回调
在敌人的Animator中,找到攻击动画LightBandit_Attack,在动画的最后一帧添加一个动画事件(Animator Event),调用OnAttackAnimationComplete方法:
// 攻击动画播放完毕时触发的回调 void OnAttackAnimationComplete() { isAttacking = false; // 如果玩家已经离开攻击范围,就切换回追击状态 if(shouldStopAttack) { StopAttack(); shouldStopAttack = false; } else { // 玩家仍在攻击范围内,可继续攻击(根据需求调整,比如保留冷却逻辑) cooling = false; attackMode = false; anim.SetBool("Attack", false); } }
4. 调整移动逻辑
修改Move方法,确保攻击动画播放时敌人不会移动:
void Move() { anim.SetBool("canWalk", true); // 不在攻击状态时才移动 if(!isAttacking) { Vector2 targetPosition = new Vector2(target.position.x, transform.position.y); transform.position = Vector2.MoveTowards(transform.position, targetPosition, moveSpeed * Time.deltaTime); } }
原理说明
通过isAttacking锁定攻击状态,动画未完成前不允许切换回移动;用shouldStopAttack延迟处理玩家离开的逻辑,直到攻击动画播放完毕。这样既保证了攻击动作的完整性,又能在动画结束后正常恢复追击。
内容的提问来源于stack exchange,提问作者oliver oliver
相关产品推荐
相关产品推荐

