因此,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);
然后,使用物理来管理跳跃、正常坠落和碰撞。
这可能是您“最快”的解决方案。但是请注意,如果您的游戏变得足够复杂,它可能会反过来咬您一口。
希望有帮助,
-扎克