Unity碰撞检测分为离散,连续,动态连续
首先是官方的文档:
连续碰撞检测是一种阻止快速移动的碰撞体相互穿过的功能。使用正常 (Discrete) 碰撞检测时,如果对象在一个帧中位于某个碰撞体的一侧,而在下一帧中已经穿过了碰撞体,便属于彼此穿过的情况。要解决此问题,可在快速移动对象的刚体上启用连续碰撞检测。将碰撞检测模式设置为 Continuous 可防止刚体穿过任何静态(即非刚体)网格碰撞体。设置为 Continuous Dynamic 也会防止刚体穿过任何其他支持的刚体(即,碰撞检测模式设置为 Continuous 或 Continuous Dynamic 的刚体)。 盒型碰撞体、球形碰撞体和胶囊碰撞体支持连续碰撞检测。请注意,连续碰撞检测的目的是作为一种安全机制,可在对象会相互穿过的情况下捕获碰撞,但不会提供精确物理碰撞的结果;所以如果遇到快速移动对象的问题,仍然可以考虑在 TimeManager 检视面板中降低固定时间步长值以使模拟更准确
离散式离散式碰撞检测的物体在遇到其他碰撞体或者其他碰撞体碰到它时,都是离散式的碰撞检测。
连续式连续式的碰撞体在遇到静态物体时使用连续式彭黄检测,其余为离散式的
动态连续式动态连续式碰撞体在遇到离散式的碰撞体时是离散式碰撞检测,其余为连续式的碰撞检测。
我在Unity中做射击游戏时出现过穿模现象,碰撞检测从离散的改成连续的也没有解决,所以有了下面的方法。
当碰撞体很薄,物体运动速度很快的情况下,可能出现前一阵未发生碰撞,但是后一帧已经穿过物体了,
比如在Update()中60帧的情况下美0.02s执行一次,如果两次的间隔时间内物体已经穿过了碰撞体,那么就不会触发碰撞了。对于这种情况的解决方案是使用射线检测来判断碰撞
如果没有物理系统的时候,可以做一个预判帧,在当前帧预计算下一帧的位置,如果下一帧会穿过物体,那么在当前帧就判定为发生碰撞。