在 Unity 中覆盖某些刚体碰撞的推荐策略?

问题描述

我正在寻找有关游戏开发策略和/或方法的新手建议。我正在开发一个在 Unity 中使用刚体物理的游戏,我有一个角色与游戏世界中的物理对象很好地交互。我正在努力解决的问题是,我想要控制某些物理交互,但我自己控制它们的尝试与 Unity 已经(正确)所做的事情相冲突。

为简单起见,假设我有一个基于刚体的播放器,当某些基于刚体的对象与该播放器发生碰撞时,我想覆盖它们偏转到的位置。当我检测到碰撞并使用 rb.AddForce(myForceVector,ForceMode.VeLocityChange) 施加我自己的力时,Unity 也会由于相同的碰撞而施加它自己的力。我还尝试直接使用 rb.veLocity = myForceVector 设置速度,这大部分是有效的,但仍然存在在我设置速度后 Unity 施加力的情况,因此它充其量只是小故障。

我考虑过的其他选择是:

  • 在实际碰撞发生之前,使用额外的、更大的 IsTrigger 碰撞网格来检测和处理我正在寻找的特殊类型的碰撞。这可能适用于速度较慢的射弹,但对于较快的碰撞可能会有同样的问题。
  • 将播放器更改为不基于刚体,这可能可行,但需要我编写许多其他交互,这些交互已经使用刚体物理开箱即用。
  • 使用 RayCasting 检测下一次可能发生这些特殊碰撞的时间,并在实际碰撞之前处理它们。这就是我目前倾向于的地方。

有没有人推荐这种事情的最佳实践?

提前致谢!

解决方法

最简单的方法可能就是完全控制。在正确定时按下时,禁用刚体和碰撞器。然后自己将它移动到目标位置。很难精确控制刚体——每个 FixedUpdate(),它可能会从碰撞中获得力,并且在 Update() 调用之间可能有很多 FixedUpdate() 调用。

您可以在对象的当前位置和目标位置之间使用 Lerp() 或 Slerp() 编写一个非常简单的协程。这样,您就可以完全控制对象如何朝着目标移动。

,

只是为了跟进......我试图按照上面亚历克斯 M 的回答中的建议“完全控制”,但这最终使我的特定情况下的许多其他事情变得复杂。然而,他在原始问题中关于禁用对撞机的评论使我走上了一条不同的道路,最终运行良好......

我最终在撞击时禁用了偏转刚体的碰撞器,并直接设置了偏转体的速度。这样,当碰撞处于活动状态时,我能够避免从 Unity 施加任何额外的力。一旦偏转的物体在路上,我只需要重新启用对撞机。

谢谢,亚历克斯!