使两个物理对象不会发生碰撞,但会检测Unity中的碰撞

Jel*_*ela 6 physics 2d unity-game-engine

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

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

我想为敌人制作一个子游戏对象,把它放在玩家的层上,添加一个刚体并触发对撞机并使用它来检测玩家和敌人之间的碰撞,但感觉如此令人费解以至于让我感到疑惑如果没有更优雅的解决方案.

Emi*_*nez 5

编辑 (2020-05-26):现在您可以告诉引擎忽略两个给定对象之间的碰撞。感谢 Deepscorn 的评论。将保留答案的其余部分不变,并在阅读时记住这一点。

是的,您需要创建一个GameObject带有触发器碰撞器的 child ,并将其放在与播放器层交互的层中。

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

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

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

您的替代方案是通过代码来完成这一切,这更不优雅。播放器上的单个子胶囊现在听起来还不错,不是吗?