0

我正在用 Unity3d 开发类似 Falldown 的游戏。所以我的问题是:如何让球以恒定的速度下落并增加跳跃能力?问题是随着时间的推移,球越来越多地被拉下来,因为重力。因此,如果我只想不断下降,我会使用,例如,

void Update () {
    rigidbody.velocity = new Vector3(rigidbody.velocity.x, -500, rigidbody.velocity.z);
}

对于跳跃,我可以使用:

rigidbody.AddForce(new Vector3(0,500,0), ForceMode.Impulse);

但我不知道如何同时实现跳跃和下降:(

请帮帮我:)

4

2 回答 2

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);

然后,使用物理来管理跳跃、正常坠落和碰撞。

这可能是您“最快”的解决方案。但是请注意,如果您的游戏变得足够复杂,它可能会反过来咬您一口。


希望有帮助,

-扎克

于 2013-07-03T16:53:47.100 回答
0

Zach has a great answer, however as an additional option...

The RidgidBody has the ability to constrain (or freeze) x, y and z.

This removes gravity and velocity so you could turn the freeze position y on & off.

Run the jump ability immediately after, or between the freeze/unfreeze command.

The pre calculated momentum will not affect the object as it is automatically set to zero.

I think this is a quicker work around but I wouldn't recommend it beyond simple prototyping.

Hope this helps :)

于 2015-07-15T16:39:00.323 回答