Unity 的跌倒游戏

问题描述 投票:0回答:2

我正在使用 Unity3d 开发类似 Falldown 的游戏。所以我的问题是:如何让球以恒定速度下落并增加跳跃能力?

问题是,随着时间的推移,由于重力的作用,球越来越向下拉。因此,如果我想要不断下降,我会使用:

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

对于跳跃,我可以使用:

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

但是我不知道如何同时实现跳跃和下降。我该怎么做?

c# unity-game-engine
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);

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

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


希望有帮助,

-扎克


0
投票

扎克有一个很好的答案,但是作为附加选项......

RidgidBody 能够约束(或冻结)x、y 和 z。

这会消除重力和速度,因此您可以打开和关闭冻结位置 y。

在冻结/解冻命令之后或之间立即运行跳跃能力。

预先计算的动量不会影响物体,因为它会自动设置为零。

我认为这是一个更快的解决方法,但除了简单的原型设计之外我不会推荐它。

希望这有帮助:)

© www.soinside.com 2019 - 2024. All rights reserved.