如何防止RigidBody穿过其他碰撞器

时间:2014-01-30 16:18:00

标签: unity3d game-physics unityscript rigid-bodies

我有一枚硬币RigidBody和围绕它的墙壁与盒子对撞机。出于试用目的,我已将以下代码应用于硬币。

private void OnMouseDown() 
{
    rigidbody.AddForce(30.0f, 0f, 5.0f, ForceMode.Impulse);
}

但是,有时硬币会穿过墙壁,但是当我将速度从30点增加到50点时,它会在第一次点击时穿过墙壁。我搜索了很多东西,但除了DontGoThroughThings脚本之外什么都没有,这对我来说不起作用,或者我真的不知道如何使用它。

我总是在硬币上添加连续动态并在墙壁上连续碰撞检测,但仍然无法正常工作。

4 个答案:

答案 0 :(得分:4)

物理碰撞检测的问题在于,有时当物体的速度太高时(在这种情况下由于加入刚体的力),碰撞将不会被检测到。原因是您正在执行的代码以每秒几十步的速度运行,因此有时刚体将在一步到另一步之间穿过对撞机。让我们说你有一个每小时100英里的球和一个1英尺宽的墙,每当代码按照它的物理原理运行时,代码会将球移动到一定数量的球,因此球的运动是虚拟化的但它不是一个真正的物理运动,所以它可能发生从一个步骤到另一个步骤,球可以从a点移动到b,并且墙壁在这些点之间,因此不会检测到碰撞。

可能的解决方案。

你有一个简单的解决方案,它不会像它应该的那样准确,而且更难以完全准确。

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

第二个也是更难的解决方案是为你的碰撞检测添加辅助功能,进行某种安全检查。例如,使用物理光线投射。您可以将光线投射设置为向前方向,并确定该对象是否是一次非常大的碰撞,如果是,并且一旦该对象不再被光线投射碰撞,那么您的碰撞检测失败了,这样您就可以通过辅助来确认并调用碰撞状态。

我希望它对我的英语有所帮助和抱歉。如果你没有强调它,我可以帮助你使用代码,但我需要你的项目中的一些代码。

答案 1 :(得分:1)

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

答案 2 :(得分:0)

我多次遇到这个问题..

确保你的硬币的Rigidbody有“Kinamatic”错误,是Triggger:false,

墙壁的“触发器”也是错误的。

答案 3 :(得分:0)

您可以保存每次更新的速度和位置,然后测试越界,如果硬币离开有效区域,您可以在最后一个有效位置恢复它,或者如果您想要自己绘制碰撞