unity中碰撞检测及性能与检测级别之间的博弈

关于碰撞检测,有三个经典的问题:

1.物体之间检测到碰撞的必要条件是什么?(经典面试题)
2.物体速度过快导致穿透碰撞体怎么办?(项目中要经常面对这个问题)
3.什么时候要给碰撞体加刚体,什么时候不用加?(我自己编的:))

先回答问题一:

两个物体都要有碰撞体,其中至少要有一个物体有刚体。

以上问题和答案没有提及是什么样的碰撞,是Collision还是Trigger,关于这两种碰撞什么情况下可以检测到,可以从以下图表中得到答案:

unity中碰撞检测及性能与检测级别之间的博弈_第1张图片

再回答问题二:

这个问题又很多答案,比如考虑能否降速,能否加大碰撞体的厚度,能否使用射线进行预判,能否减小Time Manager中的Fixed TimeStep等,这里提供另一种官方推荐的方法——提高碰撞检测的级别。

在rigidbody中Collision Detection中有三个选择:

  1. discrete
  2. continous
  3. continous dynamic

unity中碰撞检测及性能与检测级别之间的博弈_第2张图片

continous要比discrete的检测级别更高,当然性能消耗也更大;实际工程中尽量使用discrete,但是遇到穿透问题的时候,可以考虑是否有必要牺牲性能来解决上述问题。

这里边还有一个第三个选项:continous dynamic (以下简称CD),CD与continous的区别是CD会根据碰到的物体来确定检测级别,比如检测discrete就用discrete,检测continous就用continous。

最后说第三个问题:

考虑是否加刚体,当然看你是否需要刚体组件啦!不过这里还有另一种考虑,就是刚体对碰撞体的影响。没有刚体的碰撞体会被unity引擎当做是静态碰撞体,unity认为静态碰撞体是不会动的,并基于此做一些优化,所以一旦你让静态碰撞体(没有刚体的碰撞体)运动(例如:上下浮动的金币上只有碰撞体没有刚体),不但会造成极大的性能消耗,有时还会发生一些意想不到的问题。

所以,从碰撞检测性能角度讲,不动的物体可以只加碰撞体不加刚体,运动的物体一定要加刚体。

那么有时候我们希望一个物体运动又不希望它受力的影响(比如上述金币),该怎么办呢?这是可以把这个刚体isKinematic设为true。

参考资料:
https://docs.unity3d.com/Manu...
https://forum.unity.com/threa...

你可能感兴趣的:(unity中碰撞检测及性能与检测级别之间的博弈)