Unity父物体挂载Rigidbody时子物体OnCollisionEnter触发异常如何解决
问题原因
Unity物理系统的复合碰撞体规则如下:若父物体挂载了Rigidbody,其所有子物体上未绑定独立Rigidbody的非Trigger Collider,都会被合并为父物体的复合碰撞体。所有和这些子碰撞体产生的碰撞事件,只会发送到父Rigidbody所在的GameObject上,子物体本身无法触发自身的OnCollisionEnter回调。
你场景中的绿色立方体是挂载了Rigidbody的「Rb」对象的子物体,且自身没有独立Rigidbody,因此它的Collider属于Rb的复合碰撞体部分。当带独立Rigidbody的蓝色立方体和绿色碰撞时,碰撞事件只会发送给Rb对象和蓝色对象,绿色自身的脚本自然收不到回调。而红色立方体没有带Rigidbody的父对象,是独立的静态碰撞体,和蓝色的动态Rigidbody碰撞时,两个对象都能触发各自的碰撞回调,这就是两者表现差异的核心原因。
你补充测试里给红色单独加Rigidbody后逻辑正常,也是因为红色成为了独立的刚体,碰撞事件会直接发送到自身对象上。
解决方案
你可以根据自己的需求选择以下任意一种方案解决:
- 方案1:给绿色立方体单独挂载Rigidbody,勾选
Is Kinematic选项。此时绿色会成为独立的运动学刚体,不再归属于父物体的复合碰撞体,碰撞时自身就能正常触发OnCollisionEnter回调,同时不会受物理引擎外力影响,适配你当前关闭重力、手动控制的使用场景。 - 方案2:将绿色立方体的碰撞逻辑迁移到父物体「Rb」上。如果Rb下有多个子碰撞体需要区分,你可以在Rb的
OnCollisionEnter方法中通过collision.contacts[0].thisCollider获取到实际发生碰撞的子碰撞体,判断为绿色碰撞器后再执行对应逻辑即可。 - 方案3:在父物体「Rb」上挂载脚本接收碰撞事件,收到事件后主动调用绿色立方体挂载的脚本中的对应方法,不需要调整现有逻辑的结构。
内容的提问来源于stack exchange,提问作者María Román
相关产品推荐
相关产品推荐

