You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Unity中Update()内移动物体导致攻击动画无法及时触发

问题分析与解决方案

核心问题

攻击动画未在角色向攻击前摇位置移动时触发,仅在移动完成后播放;但直接跳转到目标位置时,动画能立即触发。本质是移动过程中,角色的行走动画状态覆盖了攻击动画的触发逻辑。

解决方案

方案1:用动画参数区分攻击与普通移动状态

  1. 在Animator中添加参数
    打开角色的Animator控制器,添加布尔型参数IsAttacking。

  2. 修改行走动画的过渡条件
    调整Idle→Walk、Walk→Idle等行走相关的过渡条件,加入IsAttacking == false的判断,确保攻击状态下不会播放行走动画。

  3. 更新攻击逻辑代码
    触发攻击时标记动画状态,避免行走动画干扰:

    MovingObject enemyToAttack = GameManager.instance.CheckForCreatureCurrentPosition(pos);
    if (enemyToAttack != null)
    {
        target = enemyToAttack;
        cameraFollow=false;
        attacking=true;
        animator.SetBool("IsAttacking", true); // 标记进入攻击状态
        animator.SetTrigger("attack");
        futurePosition = Vector3.Lerp(transform.position, pos, 0.2f);
    } else {
        target=null;
        cameraFollow=true;
        animator.SetBool("IsAttacking", false); // 重置攻击状态
        futurePosition = pos;
    }
    
  4. 攻击完成后重置状态
    在Attack()方法中完成攻击逻辑后,重置动画状态,准备返回原位置:

    public virtual void Attack()
    {
        // 执行敌人扣血等攻击逻辑
        // 设置返回原位置的目标点(需提前记录攻击前的初始位置)
        futurePosition = originalAttackPosition;
        attacking = false;
        animator.SetBool("IsAttacking", false);
        // 可选:触发攻击收回的动画Trigger
        animator.SetTrigger("attackReturn");
    }
    

方案2:调整Animator更新时机

如果是动画状态更新顺序导致的问题,可以修改Animator的更新时机:

  1. 选中角色的Animator组件,在Inspector面板找到Update Mode选项。
  2. 将默认的Normal改为Early Update或Animate Physics,让Animator优先处理攻击动画的触发,避免被后续的移动参数覆盖。

额外检查点

  • 确认attack动画的过渡设置:从AnyState到attack的过渡需关闭Exit Time,且仅绑定attack Trigger,无额外条件限制。
  • 检查是否有其他代码在移动过程中修改Animator参数(如移动速度),导致攻击动画被打断。
  • 确保攻击动画的时长足够覆盖角色移动到20%位置的时间,避免动画提前结束后回到行走状态。

内容的提问来源于stack exchange,提问作者apozapozapoz

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 03:50:31