7

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

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

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

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

4

4 回答 4

7

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

可能的解决方案。

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

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

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

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

于 2014-01-30T20:14:06.950 回答
1

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

于 2014-02-05T04:00:52.290 回答
0

我多次遇到这个问题..

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

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

于 2014-09-11T12:00:03.007 回答
0

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

于 2015-06-22T21:20:12.137 回答