如何防止刚体穿过其他对撞机
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】:您可以保存每次更新时的速度和位置,然后测试是否越界,如果硬币离开有效区域,您可以将其恢复到最后一个有效位置,或者如果您愿意,您可以自己绘制碰撞
【讨论】:
以上是关于如何防止刚体穿过其他对撞机的主要内容,如果未能解决你的问题,请参考以下文章