我有一个 Unity 项目,其中有一个 2D 游戏世界,其中包含静态碰撞器,以使几何体对于居住在其中的角色来说是实体的。玩家是一个动态碰撞器(具有非运动学刚体)。还有一个敌人角色,它也是一个动态碰撞器。两个角色都像我期望的那样在地板上行走并撞到墙壁。
我想要实现的是,玩家和敌人彼此之间并不固定,因此他们可以相互移动。我通过将敌人和玩家放在不同的层上并设置碰撞矩阵来实现这一点,以便这些层不会相互碰撞。然而,我现在遇到的问题是,我确实想检测敌人和玩家是否遇到了对方。我向敌人角色添加了一个触发碰撞器,它位于敌人层上,这意味着它不会检测到与玩家的碰撞。
我想过为敌人制作一个子游戏对象,将其放在玩家的图层上,为其添加刚体并触发碰撞器,并使用它来检测玩家和敌人之间的碰撞,但感觉如此复杂,让我想知道如果没有更优雅的解决方案。
编辑(2020-05-26):现在你可以告诉引擎忽略两个给定对象之间的碰撞 https://docs.unity3d.com/ScriptReference/Physics.IgnoreCollision.html。感谢 Deepscorn 的评论。将保留答案的其余部分不变,并牢记这一点进行阅读。
是的,你需要创建一个孩子GameObject
,带有触发碰撞器,并将其放在与玩家层交互的层中。
不,您不需要添加Rigidbody
到新的GameObject
,父级的刚体已经使其成为动态碰撞器,所以你会得到OnTrigger
events.
附带说明一下,为了让事情井井有条,如果您创建敌人的子级,请勿将其放在玩家层中。例如,将来您可能需要禁用玩家与自身的图层碰撞。此外,如果你的玩家以这种方式与许多对象交互,我会在玩家而不是敌人上放置一个触发器,在一个单独的触发器上PlayerTrigger
层,只是为了让事情简单。
难道就没有更简单的方法吗?并不真地。您肯定需要玩家和敌人碰撞器之间没有交互,但它们之间也需要某种交互。因此其中之一需要跨越两层,否则整个交互将由单个布尔值来描述。物理引擎一次性处理大量信息,因此您可以设置所需的所有图层和碰撞,但在物理循环期间您无法进一步控制发生的情况。您不能告诉引擎忽略两个对象之间的碰撞。只有 32 层,并且让它们以严格的方式运行实际上是大量优化。如果您担心创建另一个图层的性能,请禁用不需要的图层之间的交互,例如触发图层与地板和墙壁,或者甚至不接触的图层。
您的替代方案是通过代码完成这一切,这甚至不太优雅。播放器上的单个子胶囊现在听起来并没有那么糟糕,不是吗?
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)