我正在使用Unity3d开发类似Falldown的游戏。 所以我的问题是: 如何让球以恒定速度下降并增加跳跃能力? 问题是,随着时间的推移,球越来越多地因为重力而被拉下来。 因此,如果我想要不断下降,我会使用,例如,
void Update () {
rigidbody.velocity = new Vector3(rigidbody.velocity.x, -500, rigidbody.velocity.z);
}
跳跃我可以使用:
rigidbody.AddForce(new Vector3(0,500,0), ForceMode.Impulse);
但我不知道如何同时实现跳跃和摔倒:(
请帮帮我:)。
答案 0 :(得分:2)
因此,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);
然后,使用物理来管理跳跃,正常坠落和碰撞。
这可能是您“最快”的解决方案。但请注意,如果您的游戏变得足够复杂,它可能会回来咬你。
希望有所帮助,
-Zach