【问题标题】:Unity: Ignoring 2D collisions based on contexts like trajectory or speedUnity:忽略基于轨迹或速度等上下文的 2D 碰撞
【发布时间】:2014-07-24 07:41:45
【问题描述】:

我浏览了文档,但找不到使用内置物理引擎实现最简单的联系人管理的方法。

我有一种情况,当例如 2 个物体以相似的速度沿相似的方向行进时(基本上当它们的速度向量减法的距离太短时),应该忽略 2D 碰撞...

这些对象位于定义在正常情况下应该与之碰撞的其他类型对象的层中。相交(而不是碰撞)的对象数量可以任意增加。所以改变层不是一个可行的选择。

使用常规 box2d,我将使用 b2ContactListener.PreSolve 根据掩码和其他参数过滤对象,具体取决于掩码。 Unity 的 2D API 相当于什么?

【问题讨论】:

  • 你查过OnCollision___2D和OnTrigger___2D的方法吗?你可以改变不同方向的碰撞层,碰撞会自动发生。
  • @Savlon :据我了解 OnCollision2D 是在解决冲突后触发的......我错了吗?如果没有,有没有办法在触发时取消结果?我已经为 4 种不同类型的对象和 4 种不同的玩家使用了图层。我有任意数量的对象,除非我对层的理解是错误的,否则我看不出您的建议如何通过层实现。
  • 如果禁用OnCollisionEnter2D() 中对应的Rigidbody 组件会怎样?它是否给出了您正在寻找的结果?
  • @AldourCheng rigidbody2D.active = false 使对象简单地处于非活动状态。 coll.rigidbody.collisionDetectionMode = CollisionDetectionMode2D.None 不产生可见效果。如果您的意思是停用对撞机,那么不会。因为这样的话,禁用碰撞器的对象将不会与其他相互排斥的对象、墙壁或它们应该撞击的其他对象发生碰撞。有没有办法取消OnCollisionEnter2D 中的冲突?
  • @Coyote 你的意思是你想暂时禁止对象受到内置物理引擎的影响吗?根据manual,Rigidbody 负责这个。那么如果你take it out from physics control呢?

标签: unity3d game-physics physics-engine unity3d-2dtools


【解决方案1】:

我知道在运行时改变碰撞行为的唯一方法是禁用两个层之间或两个碰撞器之间的碰撞。

如果您的对象已经在不同的层上,您可以通过Physics2D.IgnoreLayerCollision() 禁用(和启用)它们之间的冲突。

如果你不想禁用整个层,你可以用Physics2D.IgnoreCollision()指定两个应该互相忽略的碰撞器

由于在碰撞发生之前没有调用方法,您要么需要检查自己哪些对象可能发生碰撞并启用或禁用碰撞,要么使用OnCollisionEnter2D() 并在之后禁用碰撞。对于第二种方式,您需要存储碰撞前的速度并在碰撞发生后再次设置它们。

要添加某种预检查,您可以在对象周围添加更大的第二个碰撞器并将其设置为触发器。在OnTriggerEnter2D() 期间,您可以检查是否应该发生实际碰撞。

【讨论】:

  • 到目前为止,我使用的是 Physics2D.IgnoreCollision()。但是有些对象有多个对撞机,即使自动化的过程也不是很有趣,因为我必须添加特殊的触发器来检查对象当前是否相互忽略,如果是的话,一旦它们越过就删除它们......然后......如何你不忽略碰撞吗?
  • @Coyote 重新启用碰撞使用第三个参数:IgnoreCollision(collider1, collider2, false)
  • 这也行不通。当物体发生碰撞时,将碰撞后的速度放回去也会抵消其他物体发生的速度变化,并且位置也是错误的。
  • @Coyote 如果他们错了,你显然设置错了。如答案中所述,您需要在碰撞发生之前保存它们的值。也许编写自己的碰撞行为更容易,只需使用 Unity 提供的触发功能即可。如果不了解您的项目的更多信息,就不可能说哪种方法可能是最好的。
  • 当其他组件添加力和更新速度时,缓存值不会更新。基本上,我必须让所有其他组件知道缓存系统才能开始工作...不需要解决方法的对象继续按预期工作,具有解决方法且没有其他组件/对象改变其力的对象不是举止得当。我仍然对统一中没有预求解器回调感到困惑......
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多