如何防止刚体穿过其他对撞机

Posted

技术标签:

【中文标题】如何防止刚体穿过其他对撞机【英文标题】:How to Prevent RigidBody from passing through other colliders 【发布时间】:2014-01-30 16:18:00 【问题描述】:

我有一枚硬币RigidBody,硬币周围的墙壁上装满了盒子对撞机。出于试用目的,我已将以下代码应用于硬币。

private void OnMouseDown() 

    rigidbody.AddForce(30.0f, 0f, 5.0f, ForceMode.Impulse);

但是,有时硬币会穿过墙壁,但是当我将速度从 30 点增加到 50 点时,它会在第一次点击时穿过墙壁。我用谷歌搜索了很多,除了 DontGoThroughThings 脚本对我不起作用或我真的不知道如何使用它之外,仍然一无所获。

我一直在硬币上添加连续动态,在墙上添加连续碰撞检测,但仍然不起作用。

【问题讨论】:

***.com/questions/5788261/… 我仍然没有任何有效的解决方案可以尝试。我尝试将 Fixed Timestep 更改为 0.1 并在一定程度上工作,但不是 100%。如果有人有任何解决方案,请帮忙。谢谢 【参考方案1】:

物理碰撞检测的问题是,有时当物体的速度太高时(在这种情况下,由于向刚体施加了力),碰撞不会被检测到。原因是您正在执行的代码以每秒 x 步数运行,因此有时刚体会在一个步骤到另一个步骤之间通过碰撞器。假设你有一个时速 100 英里的球和一堵 1 英尺宽的墙,每次代码运行时,代码都会根据球的物理特性将球移动确定的英尺数,因此球的运动是虚拟的但这不是真正的物理运动,因此可能会发生这样的情况:从一个步骤到另一个步骤,球可以从 a 点移动到 b 点,而墙壁位于这些点之间,因此不会检测到碰撞。

可能的解决方案。

您有一个简单的解决方案,但它不会像应有的那样准确,而一个更难的解决方案将完全准确。

第一个解决方案是增加对撞机的大小,根据你的硬币可以达到的最大速度,这样对撞机就会足够大,这样一帧到另一帧之间的碰撞就不会错过。

第二种更难的解决方案是为您的碰撞检测添加一个辅助功能,即某种安全检查。例如使用物理射线投射。您可以将光线投射设置为正向并确定该对象是否即将发生碰撞,如果确实如此,并且一旦对象不再被光线投射碰撞,那么您的碰撞检测就失败了,这样您就可以让您的辅助人员确认并调用碰撞状态。

我希望它对我的英语有所帮助和抱歉。如果您不太了解它,我可以帮助您编写代码,但我需要您项目中的一些代码。

【讨论】:

我试过增加墙的大小,但没有用,我已经提供了代码。我只是为了简单的测试目的而增加我的硬币的力量。【参考方案2】:

查看对撞机是否未选中“Is Trigger”。 另外,检查游戏对象是否有碰撞器。

【讨论】:

【参考方案3】:

这个问题我遇到过很多次了..

确保您的硬币的刚体具有“Is Kinamatic” False,Is Triggger:false,

而且墙壁的“Is Trigger”也是假的。

【讨论】:

【参考方案4】:

您可以保存每次更新时的速度和位置,然后测试是否越界,如果硬币离开有效区域,您可以将其恢复到最后一个有效位置,或者如果您愿意,您可以自己绘制碰撞

【讨论】:

以上是关于如何防止刚体穿过其他对撞机的主要内容,如果未能解决你的问题,请参考以下文章

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

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

具有动态和静态刚体的 PhysX 碰撞过滤器

修改列表时刚体随机加速(Unity)

在 Unity 中导入 Blender,如何生成正确的网格对撞机?

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