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

Recommended strategy for overriding certain Rigidbody collisions in Unity?

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

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

我考虑过的其他选项是:

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

提前致谢!

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

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

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

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

谢谢,亚历克斯!