此问题是在做特殊关卡遇到的,一个可以移动的碰撞体如果速度过快会穿过另一个碰撞体,慢的话是可以的,问题原因找到了,只需要一个设置就行

对于Unity引擎而言,是可以直接解决这个问题的。

Unity的Rigidbody里有个Collision Detection的碰撞检测属性。
该属性有三个选项:Discrete(离散), Continuous(连续), Continuous Dynamic(动态连续)。

其中的Discreet一词应为笔误,实为Discrete(Discreet意为慎重,两者意思相差很大)。整个Manual里没有第二处用到Discreet的地方,也没有任何官方说明提到该词。
翻译过来基本上就是

碰撞检测属性:用于防止快速移动的物体穿过其他物体而不触发碰撞检测。

离散(Discrete):
- 碰撞体在遇到本场景其他碰撞体时使用离散式碰撞检测(Discrete)。
- 其他碰撞体在遇到它时会使用离散式碰撞检测(Discrete)。
- 用于正常碰撞。(这是默认值)

连续(Continuous):
- 碰撞体在遇到其他动态碰撞体(即包含rigidbody)使用离散式碰撞检测(Discrete),在遇到静态MechColliders(即不含rigidbody)时使用连续式碰撞检测(Continuous)。
- 设为动态连续(Continuous Dynamic)的碰撞体在遇到该物体时使用连续式碰撞检测(Continuous), 其他碰撞体在遇到该物体时使用离散式碰撞检测(Discrete)。
- 用于设定被动态连续(Continuous Dynamic)的物体所碰撞的物体。(会影响物理引擎的性能表现。如果你没有快速运动物体的碰撞问题,就乖乖设为离散吧)

动态连续(Continuous Dynamic):
- 碰撞体在遇到其他设为连续(Continuous)或动态连续(Continuous Dynamic)的物体时使用连续式碰撞检测(Continuous)。在遇到静态MeshColliders(即不含rigidbody)时也使用连续式的碰撞检测。遇到其他碰撞体则使用离散式碰撞检测(Discrete)。
- 用于快速运动的物体。

理成一个碰撞检测属性与碰撞检测方式的对应表格就是:

 

如果你有一个快速运动的小球,它会穿过一个静态的墙,那么将球设为Continuous即可解决问题。
但如果你有多个这样的小球,它们之间则依旧会遇到互相穿过对方的问题,那么将球都设为Continuous Dynamic更好。


所以遇到题主的问题时,将快速运动的物体设为Continuous/Continuous Dynamic即可。


理论上你可以设定所有物体为Continuous Dynamic,然而这样的物体数量一旦增加起来,对性能会有很大的影响。 

 

因为我这是2D,只有一个Continuous属性, 选择后在运行,OK,没问题了

posted on 2016-06-29 13:23  C#小学徒  阅读(7795)  评论(0编辑  收藏  举报