Collider隔空碰撞问题重现以及观察
Unity项目从Unity2017升级到Unity2018出现Collider隔空碰撞,采用 于 OnCollisionEnter 中添加 Debug.Break()
代码,碰撞发生时,游戏运行暂停,在场景编辑器中可以明显地看到SphereCollider 与 BoxCollider 之间还有一段明显的距离。同时用 Physics.OverlapBox 函数对二者作相交检测,测试结果为碰撞体之间没有发生重叠。
原因分析
Unity 2017 → 2018 升级后,物理引擎版本变了,导致 Collider 之间的接触判定范围发生了变化。在 Unity 2018 里,PhysX 从 3.3 升级到了 3.4(具体版本视 2018.x 分支不同,后续还有 3.4.2、3.4.3 等),这个升级带来了一些重要的变化,尤其是:
1. Physics Queries Hit Backfaces / Contact Offset 改变
- Unity 2018 里 Collider 的 Contact Offset 默认值 和计算方式和 2017 不一样。
- Contact Offset 是为了防止物体高速运动时错过碰撞(tunneling)而人为加的“缓冲区”。
- 升级后,这个值可能变大或计算逻辑不同,导致你在球体和立方体之间还有一小段空隙时就会触发碰撞。
解决方法:
- 检查 Edit → Project Settings → Physics → Default Contact Offset
Unity 2018 里默认是 0.01,但升级可能会变成 0.1 甚至更大。 - 如果是单独物体,可以在 Collider 组件上调节 contactOffset 属性:
myCollider.contactOffset = 0.001f;
2. 碰撞检测模式变化
- Unity 2018 对 Continuous 碰撞检测的内部算法调整过。
- Continuous/Continuous Dynamic 模式会更早地产生接触点(提前判定),所以会看起来“隔空”碰撞。
- 若碰撞体带 RigidBody 并开启了 Continuous 模式,试试改成 Discrete 看是否恢复原状。
3. PhysX 容差(Skin Width / Bounds Inflation)
- 升级后,物理系统在生成 AABB 时可能会额外“膨胀”一点(inflated bounds),这是优化 broad-phase 碰撞检测的副作用。
- SphereCollider 与 BoxCollider 在 PhysX 3.4 中的接触点生成算法有优化,会更早产生接触事件。
4. 升级时物体缩放 / Transform 精度问题
- 如果球体和立方体的 scale 不是 1,Unity 2018 在计算 Collider 边界时浮点精度和 2017 略有不同,也会导致碰撞提前触发。
解决方法
- 把球体的 RigidBody 的碰撞检测方式修改为 Discrete
- 检查 Edit → Project Settings → Physics → Default Contact Offset, 设置值为 0.01
对应的修改如下:

作出以上改动后,运行测试,隔空碰撞问题没有重现,问题解决!
结语
Unity版本升级时,增加了新功能,解决了某些BUG。这对于新项目来说是一件好事,但是对于之前版本的项目来说,很可能就是灾难性的。尤其是物理、车体碰撞这块,已有项目都是基于之前的物理调出来的玩法。物理兼容性不好的话,就会导致升级后的项目玩法很不一样了。最明显的例子莫过于WheelCollider从unity4升级到unity5之后,你就会看到该组件的默认参数值完全不一样了,这些参数的取值范围大小也发生了明显的变化,多数的赛车类项目升级之后车子就卡在原地不能动了,或者动起来也怪怪的,车子一闪一闪,漂移之类的效果玩不出来了。对于这些问题,对玩法影响太大了,只能重新做一次了!