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

时间:2015-06-13 15:00:09

标签: unity3d 2d physics

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

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

我想为敌人制作一个子游戏对象,把它放在玩家的图层上,添加一个刚体并触发对手并使用它来检测玩家和敌人之间的碰撞,但感觉如此令人费解,以至于我不知道是否有更优雅的解决方案。

1 个答案:

答案 0 :(得分:4)

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

不,你不需要为新Rigidbody添加GameObject,父亲的刚体已经使它成为动态对手,所以你会得到{{1事件。

作为旁注,只是为了保持组织有序,如果你创造了一个敌人的孩子,不要把它放在玩家层。例如,将来您可能需要禁用播放器与自身的层冲突。此外,如果你的玩家以这种方式与许多物体互动,我会在一个单独的OnTrigger层上在玩家而不是敌人身上放置一个触发器,只是为了简单起见。

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

您的替代方案是通过代码完成所有操作,这甚至不那么优雅。播放器上的单个儿童胶囊现在听起来不好,不是吗?