因此,Unity 为我们提供了通过力或通过明确设置它们的状态(如速度、旋转、加速度)与刚体交互的选项。一个好的一般规则是一个对象只能以这些方式中的一种来实现。显式和通过物理引擎作用的对象可能会产生“奇怪”的行为,就像您在这里遇到的一样!
在您提出的解决方案中,您通过一个力(使其跳跃)和一个明确的集合(使脊体以固定速度下落)作用于您下落的物体。如果您启用了对象物理,它也会受到力的影响!如果我们有兴趣编写尽可能“最好”的 Unity 脚本,我们可能应该只选择一个系统(强制或显式)。
你有几个选择。
1) 我希望这是您想要去的路线。
如果您希望您的下落对象由 Unity 物理引擎管理,那么您的跳跃命令看起来不错(因为向物理对象添加力是可以的)但是显式设置下落速度会破坏我们的范例(因为现在我们正在交互通过设置值和施加力来处理对象)。
不过,好消息是,我们可以通过用力“推动”我们坠落的物体来产生任何我们想要的坠落行为。为了阻止我们的物体加速超过某个阈值,我们可以做这样的事情来抵消重力的进一步拉动:
if(rigidbody.velocity.y >= max_speed)
rigidbody.AddForce(new Vector3(0.0f,-1*Physics.gravity,0.0f));
当然,这不是一个完美的解决方案。如果你这样做,你的物体的最大速度会有一些微小的差异。但希望它能让你走上正确的轨道,你可以根据自己的喜好进行调整。 (考虑在物体达到一定速度后“关闭”物体的重力。老实说,你觉得最自然的东西。只要你不设置明确的属性(你仍然可以看!)你做得很好。 )
2) 如果您不需要 Unity 的物理引擎来作用于您的对象(听起来不像这种情况),您可以通过使跳转命令简单地向对象的y 速度。但请记住,一旦你走下这条路,不建议你的对象受到力的作用——即使是通过 Unity 物理引擎。
3) 选项 3 是忽略“规则”并利用您在帖子中提供的解决方案。为了让它“工作”,看起来你需要做的就是检查你的下落速度,看看球的下落速度是否比可接受的快,如果是这种情况,只应用你的明确速度:
在您的对象上启用或模拟重力,并且:
if(ridgidbody.velocity.y < -500)
rigidbody.velocity = new Vector3(rigidbody.velocity.x, -500, rigidbody.velocity.z);
然后,使用物理来管理跳跃、正常坠落和碰撞。
这可能是您“最快”的解决方案。但请注意,如果您的游戏变得足够复杂,它可能会反过来咬您一口。
希望对你有帮助,
-扎克