GameObject的快速滑动移动不会与碰撞者发生碰撞

时间:2017-07-19 06:41:14

标签: c# unity3d 2d collider

我正在2D环境中开发Unity游戏。播放器GameObject附加了Rigidbody2D。滑动时水平移动。滑动太快时,它不会与Colliders发生碰撞。也许它会在检测到碰撞之前改变其变换位置?滑动缓慢时不会发生这种情况。

3 个答案:

答案 0 :(得分:1)

如果物体的移动太快,它将完全忽略碰撞,因为它从不接触实际的对撞机 - 它只是跳过它。

为了解决这个问题,您需要预测碰撞何时发生并在正确的时刻触发它。

如果滑动不太快,将碰撞检测设置为连续为 pixlark 表示可能有帮助。

答案 1 :(得分:1)

根据您的问题,我假设您正在Update()函数中移动对象(如果没有,请更正我)。这意味着您每帧移动对象一定量。但是,Unity会检查碰撞器并在不同的时间间隔内进行物理计算(固定时间步长,https://docs.unity3d.com/Manual/class-TimeManager.html)。

在物体碰撞之前,检查碰撞器。 Unity每Fixed Timestep计算一次碰撞器(默认值为0.02次/秒)。如果unity没有检测到碰撞,则意味着您的对象相交的时间少于Fixed Timestep,或者换句话说,它们的移动速度非常快(就像您描述的情况一样)。修复此问题的一种(坏)方法是减少物理计算之间的时间量。但是,这会大大降低您的计划效率。

相反,请考虑在函数FixedUpdate()中移动对象,以便每次物理检查碰撞时对象都会移动。这应该可以解决您的问题。

看看第3个答案(Garth-Smith): https://forum.unity3d.com/threads/rigidbody-2d-wont-collide-with-another-object-when-its-moving-really-fast.248786/

我特别想突出部分:

  

如果你有一个Rigidbody2D,你应该在FixedUpdate()中移动它   使用rigidbody2D.MovePosition(Vector2)。这将移动   Rigidbody2D通过空间,而不是从A点传送到   B点。

关于Raycasts的第二部分不应该是你的问题所必需的,但是如果你继续遇到问题,你可以使用它们检查jdweng在评论中说明的范围。

如果您不熟悉Raycast,可以参考以下几个地方: https://docs.unity3d.com/ScriptReference/Physics2D.Raycast.html https://unity3d.com/learn/tutorials/topics/physics/raycasting

答案 2 :(得分:0)

确保Rigidbody2D的碰撞检测模式设置为dockerContinuous

相关问题