【问题标题】:Fast swipe movement of GameObject does not collide with CollidersGameObject 的快速滑动移动不会与 Colliders 发生碰撞
【发布时间】:2017-07-19 06:41:14
【问题描述】:

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

【问题讨论】:

  • 您无法测试是否相等,而是需要一个范围,因此在快速移动时,您可能会通过相等条件而不是完全相等。

标签: c# unity3d 2d collider


【解决方案1】:

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

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

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

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

我特别想强调的部分:

如果你有一个 Rigidbody2D,你应该在 FixedUpdate() 中移动它 使用刚体2D.MovePosition(Vector2)。这将移动 Rigidbody2D 穿越空间,而不是将其从 A 点传送到 B点。

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

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

【讨论】:

  • 非常感谢。我在固定更新中移动游戏对象。我通过滑动来移动我的对象,transform.position += transform.right * _hMovement * transformSpeed * Time.deltaTime;我正在查看您提供的参考资料。
【解决方案2】:

如果你的对象的移动太快,它会简单地忽略碰撞,因为它从不接触实际的对撞机 - 它只是跳过它。

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

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

【讨论】:

    【解决方案3】:

    确保 Rigidbody2D 的碰撞检测模式设置为 Continuous 或 Continuous Dynamic。

    【讨论】:

      猜你喜欢
      • 2018-12-31
      • 1970-01-01
      • 2017-05-09
      • 2017-05-21
      • 2015-11-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多