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
- 从Any State过渡到Dash,触发条件为
- 修改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
相关产品推荐
相关产品推荐

