Unity 2020.3.15f2中OnCollisionEnter不触发 故障排查求助
Unity OnCollisionEnter 不生效问题解决方案
核心原因
Unity碰撞事件默认仅发送到碰撞体(Collider)挂载的游戏对象、以及该碰撞体关联的刚体(Rigidbody)挂载的游戏对象,不会自动向上传递给父对象。你当前将带OnCollisionEnter的脚本挂载在父级对象上,但SphereCollider、Rigidbody组件均挂载在子对象上,因此父对象无法接收碰撞回调。
可行解决方案
- 方案1:直接将带
OnCollisionEnter逻辑的脚本移动到带有SphereCollider和Rigidbody的子对象上,是成本最低的适配方案。 - 方案2:如果逻辑必须保留在父对象中,可在子对象上挂载碰撞中转脚本,示例代码如下:
// 挂载到带有Collider、Rigidbody的子对象上 public class CollisionTransfer : MonoBehaviour { void OnCollisionEnter(Collision col) { // 替换为你父对象上的脚本类名,调用父对象的碰撞处理逻辑 GetComponentInParent<你父对象的脚本类名>()?.OnCollisionEnter(col); } }
- 方案3:如果需要父对象统一管理所有子碰撞体的碰撞事件,可给父对象挂载Rigidbody组件,删除子对象上的Rigidbody,子对象的Collider会作为父刚体的复合碰撞体,此时父对象上的
OnCollisionEnter即可正常触发。
其他排查项(可选)
- 确认挂载脚本的父对象处于激活状态、脚本组件未被禁用
- 确认Unity控制台未过滤普通Info级别的日志
- 确认两个碰撞对象的层级未在项目物理碰撞矩阵中被禁用交互
内容的提问来源于stack exchange,提问作者GuinoAlaska
相关产品推荐
相关产品推荐

