我正在开发 2D 环境中的 Unity 游戏。播放器GameObject
有一个Rigidbody2D
附件。滑动时它会水平移动。当滑动太快时,它不会与Colliders
. 也许它会在检测到碰撞之前改变它的变换位置?当滑动缓慢时不会发生这种情况。
3 回答
根据您的问题,我假设您正在Update()
函数中移动对象(如果不是,请纠正我)。这意味着您每帧移动对象一定量。但是,Unity 检查碰撞器并在不同的时间间隔(固定时间步长,https: //docs.unity3d.com/Manual/class-TimeManager.html )上进行物理计算。
就在对象碰撞之前,检查碰撞器。Unity 每次计算碰撞器Fixed Timestep
(默认为每秒 0.02 次)。如果 unity 没有检测到碰撞,则意味着您的对象相交的时间少于Fixed Timestep
,或者换句话说,它们移动得非常快(就像您描述的情况一样)。解决此问题的一种(坏)方法是减少物理计算之间的时间量。但是,这会大大降低您的程序效率。
相反,请考虑在函数中移动对象,FixedUpdate()
以便对象仅在每次物理检查碰撞时移动。这应该可以解决您的问题。
看看第三个答案(由 Garth-Smith 提供): https://forum.unity3d.com/threads/rigidbody-2d-wont-collide-with-another-object-when-its-moving-really-fast。 248786/
我特别想强调这部分:
如果你有一个 Rigidbody2D,你应该使用rigidbody2D.MovePosition(Vector2) 在 FixedUpdate() 中移动它。这将使 Rigidbody2D 在空间中移动,而不是将其从 A 点传送到 B 点。
关于 Raycasts 的第二部分对于您的问题应该不是必需的,但是如果您继续遇到问题,您可以使用它们来检查范围,正如 jdweng 在他的评论中所说的那样。
如果您不熟悉 Raycast,这里有几个地方可以了解 Raycast: https ://docs.unity3d.com/ScriptReference/Physics2D.Raycast.html https://unity3d.com/learn/tutorials/topics/physics/raycasting
如果你的对象的移动太快,它会简单地忽略碰撞,因为它从不接触实际的对撞机——它只是跳过它。
为了解决这个问题,您需要预测碰撞何时发生并在正确的时刻触发它。
如果滑动不是太快,如pixlark所说,将碰撞检测设置为 Continuous可能会有所帮助。
确保 Rigidbody2D 的碰撞检测模式设置为Continuous
或Continuous Dynamic
。