使两个物理对象不碰撞,但在 Unity 中检测碰撞

Posted

技术标签:

【中文标题】使两个物理对象不碰撞,但在 Unity 中检测碰撞【英文标题】:Make two physics objects not collide but do detect collisions in Unity 【发布时间】:2015-06-13 15:00:08 【问题描述】:

我有一个 Unity 项目,其中有一个 2D 游戏世界,它由静态对撞机组成,以使几何图形对居住在其中的角色保持立体感。玩家是一个动态对撞机(具有非运动学刚体)。还有一个敌人角色也是一个动态对撞机。两个角色都像我期望的那样走过地板并撞到墙壁。

我想要实现的是玩家和敌人之间并不牢固,所以他们可以互相穿行。我通过将敌人和玩家放在不同的层上并设置碰撞矩阵来实现这一点,这样这些层就不会相互碰撞。然而,我现在遇到的问题是我确实想检测敌人和玩家是否相互碰撞。我为敌人角色添加了一个触发碰撞器,它在敌人层上,这意味着它不会检测到与玩家的碰撞。

我想为敌人制作一个子游戏对象,把它放在玩家的图层上,添加一个刚体并触发碰撞器,并用它来检测玩家和敌人之间的碰撞,但感觉太复杂了让我想知道是否没有更优雅的解决方案。

【问题讨论】:

【参考方案1】:

编辑(2020-05-26):现在你可以告诉引擎ignore collisions between two given objects。感谢 Deepscorn 的评论。将保持其余答案不变,并牢记这一点。

是的,你需要创建一个子GameObject,带有一个触发碰撞器,并将它放在一个与玩家层交互的层中。

不,您不需要在新的GameObject 中添加Rigidbody,父级刚体已经使其成为动态碰撞器,因此您将获得OnTrigger 事件。

作为旁注,为了让事情井井有条,如果你创建了敌人的孩子,不要把它放在玩家层。例如,将来您可能需要禁用玩家的层与自身的碰撞。此外,如果您的玩家以这种方式与许多对象交互,我会在单独的PlayerTrigger 层上为玩家而不是敌人设置一个触发器,以保持简单。

没有更简单的方法吗?并不真地。你肯定需要玩家和敌方对撞机之间没有交互,但它们之间也需要某种交互。所以其中一个需要跨越两层,否则整个交互将由一个布尔值来描述。物理引擎一次性处理大量信息,因此您可以设置所需的所有层和碰撞,但在物理循环期间,您无法进一步控制发生的情况。您不能告诉引擎忽略两个对象之间的碰撞。只有 32 层,并且让它们以严格的方式运行实际上是大量优化。如果您担心创建另一个层的性能,请禁用不需要的层之间的交互,例如触发层与地板和墙壁,或者甚至不接触的层。

您的替代方案是全部通过代码完成,这更不优雅。播放器上的单个子胶囊现在听起来没那么糟糕,不是吗?

【讨论】:

我按照你说的做了,而且工作正常。我并没有真正考虑过将触发器放在玩家身上,所以我所有的敌人都可以保持无触发器。省去了很多麻烦。 “你不能告诉引擎忽略两个对象之间的碰撞”实际上,现在看起来你可以:docs.unity3d.com/ScriptReference/Physics.IgnoreCollision.html

以上是关于使两个物理对象不碰撞,但在 Unity 中检测碰撞的主要内容,如果未能解决你的问题,请参考以下文章

Unity3D使用时发现的问题及解决方法(触发碰撞条件)

2022-04-20 Unity入门7——物理系统之碰撞检测

Unity之碰撞体组件

Unity3d碰撞检测中碰撞器与触发器的区别

Unity --- 物理引擎 --- 触发器 与 碰撞器详解

Unity 碰撞检测与触发检测