【问题标题】:unity - jump with rigidbody bugunity - 与刚体错误一起跳跃
【发布时间】:2021-02-11 11:18:32
【问题描述】:

我试图用刚体跳跃,有时我的跳跃很低,就像它堆叠在什么东西上一样,有时又很高。为什么会变?

谢谢你的回答

我的代码:

private void Update() {

    if (Input.GetKeyDown(KeyCode.Space) && isGrounded) Jump();
}

private void FixedUpdate()
{
    isGrounded = Physics.CheckSphere(groundCheck.position, 0.2f, groundMask);
}

private void Jump()
    {
        rigidbody.AddForce(Vector3.up * 20, ForceMode.VelocityChange);
        isGrounded = false;
    }

【问题讨论】:

  • 你的地面层对撞机是如何设置的?你的游戏是 2D 还是 3D?如何地形/地面设置?请提供更多信息。
  • 抱歉,我没有意识到,但您的问题仍然缺少地面设置?也许您的代码不是问题,但编辑器设置是问题。
  • 向我们展示检查器,我也不知道,但您可能还需要计算基于您的更新函数,或者在 fixedUpdate 函数中处理输入。为什么要分开?

标签: unity3d rigid-bodies


【解决方案1】:

首先,根据 Unity 文档 here,任何关于刚体的物理计算(例如 Jump() 中的计算)都应始终在 FixedUpdate() 函数内完成。 FixedUpdate() 以默认的固定速率每 0.02 秒运行一次,而 Update() 每帧运行一次,这对于运行它的每台机器都会有所不同。

我没有为您重新发明轮子,而是在 Unity 论坛上搜索并找到了以下代码,here,这应该可以帮助您进一步了解您的问题。我使用了那里的代码并针对您的场景进行了编辑。

private bool shouldJump = false;

void Update()
{
    if (Input.GetKeyDown(KeyCode.Space) && isGrounded)
    {
       shouldJump = true;
    }
}

void FixedUpdate()
{
    // Check for jump
    if (isGrounded && shouldJump)
    {
        shouldJump = false;

        rigidbody.AddForce(Vector3.up * 20.0f, ForceMode.VelocityChange);
    }
}

【讨论】:

  • 小心,认为物理计算“必须”在 FixedUpdate 中完成是幼稚的。你当然可以/经常应该但不必,在某些情况下你不需要(显然你使用帧时间,在任何一种情况下,用于数值精确计算)这个答案下的示例讨论:@ 987654323@
  • 请注意,乘以“高度”在物理上是没有意义的。 (当然,你可以乘以任何数字,比如“3.342f”,它会做“一些事情”。)游戏程序员需要完全理解牛顿物理学并使用实际的力。 (Unity 提供了四种模式,可以为您执行不同的牛顿计算,但无论如何,您都需要了解简单的中学牛顿物理学才能有意义地使用它。)
  • 关于乘以高度的评论是没有意义的。我应该更改它以匹配原始帖子。您将向量乘以所需的推力,表示为浮点数。如 Unity 文档中所示。 docs.unity3d.com/ScriptReference/Rigidbody.AddForce.html.
  • 仅供参考,我不知道“推力”在牛顿物理学意义上的技术含义。 (是牛顿吗?牛顿的时间导数?)当您使用 AddForce 时,有四种“模式”可供选择。 (与 Unity 一样,它们的文档记录非常糟糕,而且经过深思熟虑。)在 docs.unity3d.com/ScriptReference/ForceMode.html 上有一些关于这四个的粗略文档。 (请注意,在示例代码中,它具有“VelocityChange”,模式四。)您不太可能(但并非不可能)在每帧调用它时都使用 VelocityChange 模式。这里有...
  • .. www 上关于四种不同模式的许多长时间讨论,这有助于为那些从高中就忘记了牛顿物理学的人解释数学
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-11-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-07-08
  • 1970-01-01
相关资源
最近更新 更多