Unity 2D运动学刚体穿过动力学刚体异常问题咨询
Unity 2D运动学刚体穿模&异常碰撞问题解决
为什么会出现穿模和诡异位移?
- 运动学刚体(红色)的本质:
Rigidbody2D设为Kinematic时,完全不受物理引擎的碰撞约束限制,MovePosition()是直接硬设置它的位置,不会因为动力学刚体(绿色)被墙挡住就停下——物理引擎只会让绿色刚体对红色的移动做出反应,但红色本身不会被任何物体阻挡。 - 碰撞检测的"隧道效应":
MovePosition()是瞬间更新位置,如果单次移动的距离过大,或者红色移动速度太快,物理引擎来不及检测中间的碰撞,就会直接穿过去。圆形碰撞体因为接触面积小,这种情况更明显,引擎为了修正碰撞冲突,会把被墙卡住的绿色圆形刚体强行"挤"到红色的另一侧,就出现了跳位置的诡异现象。
怎么解决?
方法1:换用动力学刚体控制移动(最靠谱)
如果需要红色刚体被绿色或墙体挡住,别用运动学刚体了,把红色的Rigidbody2D改成Dynamic(动力学),然后用AddForce()或者直接设置velocity来控制移动——这样物理引擎会自动处理所有碰撞约束,红色碰到绿色被卡住后自然会停下,完全不会穿模。
方法2:保留运动学刚体,但提前做碰撞检测
如果必须用运动学刚体(比如要绑定动画、做场景触发之类的),那每次调用MovePosition()前,先检测路径上有没有障碍物:
- 用
Rigidbody2D.Cast()检测从当前位置到目标位置的路径,看是否会撞到绿色刚体或墙体; - 如果检测到碰撞,就停止移动,或者只移动到碰撞前的位置,避免穿模。
方法3:调整物理参数缓解问题
- 给绿色刚体调大
Mass(质量),让它更难被红色推动,能减少被挤飞的情况; - 给红色和绿色刚体开启
Continuous Collision Detection(连续碰撞检测),可以降低快速移动导致的隧道效应,圆形刚体的异常位移会改善很多。
内容的提问来源于stack exchange,提问作者Vishal Shah
相关产品推荐
相关产品推荐

