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

Unity 2D平台游戏冲刺时禁用Animator致佩剑飞出问题

问题根因

你的佩剑绑定在Animator控制的角色骨骼节点上,且自身挂了Rigidbody2D刚体组件。
禁用Animator组件后,所有骨骼节点不再受动画驱动更新位置,佩剑失去父骨骼的位置约束,受自身重力影响下落;等你重新打开Animator,骨骼被动画拉回预设挂载位置,佩剑就会直接瞬移回正确位置,和你描述的现象完全一致。
靠禁用整个Animator规避冲刺卡动画的做法太粗暴,完全没必要。

解决方案

方案1(优先用,一劳永逸)

不要开关Animator组件,用Animator参数控制状态机切换,专门做冲刺状态:

  • 给Animator新增布尔类型参数isDashing
  • 在Animator状态机里新增Dash冲刺状态,添加两条状态过渡:
    • 从Any State过渡到Dash,触发条件为isDashing == true,关闭Has Exit Time,过渡时长设为0,避免动画卡顿
    • 从Dash过渡回Idle/Run/Jump等常规状态,触发条件为isDashing == false,同样关闭Has Exit Time,过渡时长设为0
  • 修改Dash协程逻辑,把原来开关Animator的代码替换为参数赋值,改完的协程代码如下:
public IEnumerator Dash() 
{
    animator.SetBool("isDashing", true);
    canDash = false;
    isDashing = true;
    float originalGravity = rb.gravityScale;
    rb.gravityScale = 0f;
    rb.velocity = new Vector2(transform.localScale.x * dashingPower, 0f);
    tr.emitting = true;
    yield return new WaitForSeconds(dashingTime);
    tr.emitting = false;
    rb.gravityScale = originalGravity;
    isDashing = false;
    animator.SetBool("isDashing", false);
    yield return new WaitForSeconds(dashingCooldown);
    canDash = true;
}

改完之后Animator全程正常运行,骨骼始终保持对佩剑的位置约束,既不会出现冲刺卡半空动画的问题,佩剑也不会掉落。

方案2(最小改动打补丁,适合临时用)

如果暂时不想改Animator状态机,就保留开关Animator的逻辑,在禁用Animator的同时关闭佩剑的物理模拟:

  • 先获取佩剑的Rigidbody2D组件引用
  • 协程开头animator.enabled = false;的下一行加swordRb.simulated = false;,让佩剑不受重力、物理效果影响,自然不会下落
  • 协程末尾animator.enabled = true;的下一行加swordRb.simulated = true;,冲刺结束恢复佩剑物理即可
    这个方案的缺点是后续如果加其他挂在骨骼上的带刚体的道具(比如盾牌、飞镖),每个都要单独加开关物理的逻辑,维护起来麻烦。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 03:57:21