unity - 两个具有刚体的物体如何相互穿过?

Posted

技术标签:

【中文标题】unity - 两个具有刚体的物体如何相互穿过?【英文标题】:unity - how two objects with rigidbody can pass through each other? 【发布时间】:2018-07-05 18:54:30 【问题描述】:

(我看到了类似我的问题,但我的情况不同)

我解释一下:

我有一个 2d 游戏(侧视图),玩家四处走动并用剑或锤子等武器互相攻击。我在一个名为“Ground”的碰撞层和“Player”层中设置了玩家。并检查“地面”和“玩家”层的碰撞。地面没有刚体,但玩家有(由于使用重力等)。我希望玩家不会相互碰撞以获得更流畅的机制,但我想在他们通过彼此时检测并接收消息,对于我需要的一些海藻。 现在,如果我取消选中“玩家”碰撞层(在 Collision2D 设置中),它们可以通过,但由于非活动碰撞,我无法接收任何消息。如果我将玩家的对撞机设置为触发器,它们会穿过地面并坠落。 (如有错误请指正)

那我该怎么办?

【问题讨论】:

作为一种快速的傻瓜解决方案,您可以在每个玩家内部创建第二个触发对撞机,以检测与其他玩家的碰撞。 【参考方案1】:

让您的玩家游戏对象有两个子对象(一个可以称为 GroundCollider,另一个可以称为 PlayerCollider)

在第一个上,添加一个未选中 onTrigger 的对撞机。在第二个中,添加一个选中 onTrigger 的对撞机

【讨论】:

谢谢。答案并不完全正确,答案很简短,但很接近。【参考方案2】:

如果两个对象都需要是实体的(不是触发体积),那么您需要编辑物理层。

    在检查器面板下拉菜单中将两个对象更改为单独的层(有 32 个层,只有前五个左右具有默认名称)。

这恰好来自我正在处理的一个项目,顶部带有红色标记的图层是默认图层。底部是“编辑层”,您可以在其中命名和定义新层(最多 32 个)。

    转到编辑 -> 项目设置 -> 物理并更改物理碰撞遮罩,以便将您分配给两个对象的两个图层设置为不交互:

取消选中不应碰撞的任何对(默认情况下,所有层都与所有层发生碰撞)。

【讨论】:

在这种情况下这似乎不是一个好的解决方案:对于 Unity Networking,您为播放器使用预制件 -> 您将如何将其设置为不同播放器的不同层?如果你有两个以上的玩家,它也不是很可扩展。 @derHugo 呃……你所有的玩家都应该使用相同的物理层。或者你每队使用一个(盟友互相穿过,但撞到敌方玩家)。 每个玩家不使用一层。 对不起,也许我只是误解了,或者不清楚你在说什么是“两个对象” @derHugo 相关的一切。如果两者都是“玩家”,那么它们具有相同的层,并且您可以防止玩家层与玩家层发生冲突。【参考方案3】:

所以在玩了烤面包机所说的之后,我找到了解决方案。

地面对撞机必须在“Ground”层中,带有触发器的玩家在“Player”层中选中,我们还需要一个名为“GroundCollider”的第三层和一个带有未选中触发器的对撞机。

好的。然后在物理 2D 设置中,“玩家”层必须检查与自身的碰撞。并且“Ground”层和“GroundCollider”应该只检查彼此的碰撞,而不是与自身或任何其他层。

通过这些设置,玩家与地面发生碰撞,两个玩家可以互相检查碰撞,也可以互相穿过。

【讨论】:

以上是关于unity - 两个具有刚体的物体如何相互穿过?的主要内容,如果未能解决你的问题,请参考以下文章

unity3D中,给物体添加刚体后,为啥不是掉在地面上,而是穿过地形一直往下落呢?

unity3d如何使刚体不被穿越?

unity怎么让刚体不发生碰撞,直接穿过去

unity3d怎么添加碰撞体

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

Unity之碰撞体组件