【问题标题】:Are There Alternatives to Collision Detection in Unity3D?Unity3D 中是否有碰撞检测的替代方案?
【发布时间】:2016-10-11 01:03:37
【问题描述】:

所以,我正在开发一款游戏,但我遇到了一个问题:我试图检测两个物体的碰撞,起初我认为我需要两个碰撞器。然后我发现我需要一个刚体,现在我发现两个物体都需要一个刚体,这需要大量的 cpu 使用,而刚体仅用于检测这些碰撞。它极大地限制了我可以在一个场景中拥有多少个对象。

我唯一能减薄的解决方案是从每一侧投射小射线。还有其他更优的行业标准解决方案吗?

提前致谢

【问题讨论】:

  • 在你的对象周围投射光线将是我猜的最糟糕的解决方案。互联网上有很多关于碰撞检测的资源,但是手动实现解决方案会很痛苦。如果不是所有对象都必须碰撞在一起,您可以使用 Unity 图层:docs.unity3d.com/Manual/LayerBasedCollision.html
  • 是的,这也是我能想到的最糟糕的事情:D
  • 只有在使用 MeshCollider 时才需要刚体进行碰撞。如果使用更简单的对撞机,则不需要刚体。
  • 在此处进一步了解:docs.unity3d.com/Manual/CollidersOverview.html,触发器部分

标签: unity3d collision-detection


【解决方案1】:

没有办法完全按照您的意愿行事。由于您没有描述您打算做什么(即使是 2D 或 3D),这里有一个通用的解决方案:
1) 仅将Rigidbody 附加到其中一个对象(可能发生碰撞的两个对象中)
2) 在Rigidbody上打勾IsKinematic,这样它就不会对物理做出反应
3) 在另一个对象的 Collider 上勾选isTrigger(因此它不需要Rigidbody,但在用 非触发器(!!!) 碰撞器击中另一个对象时会触发触发事件(刚体)

或者在所有 GO 上使用 Rigidbody,但在所有 GO 上打勾上 IsKinematic


至于您自己的碰撞检测,请参阅@Hellium 的评论。
我要补充一点,如果您编写自己的碰撞检测代码,那么最终您很可能会得到一个消耗更多计算量的代码。时间(并且可能至少有点草率)。
仅仅因为您将使用脚本而不是 C++ 编写代码,并且引擎的碰撞检测是 C++。 (您的 .net 脚本将通过 il2cpp 编译为本机,因此不是本机实现 == 必须比具有类似性质但受引擎支持的代码慢,即用 c++ 编码)

旁注:如果您找到您的应用。运行缓慢,这不一定是因为碰撞检测。 你的代码,当你检测到碰撞运行缓慢时你所做的并不是不可能的。
我强烈建议您使用 the profiler 来查看是什么减慢了您的应用程序的运行速度。
如果它确实是您的代码,请发布有关如何使其运行更快的问题。

【讨论】:

  • 你是一个庞大的信息库。谢谢你,兄弟。
  • 哦,我绝对不是建议我自己检测是要走的路。如果我认为我不会要求另一种方式
  • 呃,所以按照指示我来发现当飞机是触发器时,你会通过它。这正常吗?
  • @ThomasCaplan 是的,触发器只是触发器,“感知”碰撞,而不是“物理对撞机”(这就是它们不需要 RigidBody 的原因)
  • 那么我应该在预制件中创建第二个平面吗?我有点需要我的地板坚固:D
猜你喜欢
  • 2013-02-20
  • 1970-01-01
  • 2015-12-23
  • 1970-01-01
  • 1970-01-01
  • 2022-08-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多