跳跃不顺畅,更像是瞬移

时间:2019-03-29 18:29:31

标签: c# unity3d

正如标题所说,我的播放器更像是跳跃,就像跳跃一样,但我找不到答案。我用的是我的代码

void Jumping()
{
    if (Input.GetKeyDown(KeyCode.Space) && currentJumps <= maxJumps)
    {
        rb.AddForce(Vector3.up * jumpForce, ForceMode.Impulse);
        currentJumps++;
    }
}

1 个答案:

答案 0 :(得分:0)

需要从您的Update()函数中调用Input.GetKeyDown,并且应该在FixedUpdate()函数中应用物理力。

  

GetKeyDown仅对于发生它的一帧为真。   在该帧期间,FixedUpdate可能会运行,也可能不会运行。所以,永远不要使用   GetKeyDown(或任何其他类似的Down和Up输入选项)在   固定更新。   https://forum.unity.com/threads/fixedupdate-and-input-getkeydown.56862/

例如这可能会使您的代码看起来像这样:

private bool _jumping;

void Update()
{
    if (Input.GetKeyDown(KeyCode.Space))
        _jumping = true;
    else if (Input.GetKeyUp(KeyCode.Space))
        _jumping = false;
}

void FixedUpdate()
{
     if (_jumping) rb.AddForce(Vector3.up * jumpForce, ForceMode.Impulse);
}

还请注意:

Input.GetKeyDown

  

在用户开始按下键的帧期间返回true   按名称标识。   https://docs.unity3d.com/ScriptReference/Input.GetKeyDown.html

Input.GetKey

  

当用户按住名称标识的键时返回true。   https://docs.unity3d.com/ScriptReference/Input.GetKey.html

Input.GetKeyUp

  

在用户释放由...标识的帧期间,返回true   名称。 https://docs.unity3d.com/ScriptReference/Input.GetKeyUp.html


我通常如何实现跳跃:

我倾向于使用GetKeyDown来检测跳转的开始,检查_jumping是否为假,并将其设置为true。

我有一个浮点值,它是跳跃的力量乘数(你的jumpForce),它从高开始,并在整个跳跃过程中减小。

我在FixedUpdatejumpForce = Mathf.Max(jumpForce - jumpDecay * Time.fixedDeltaTime, 0)中减少了这一点。

如果检测到Input.GetKeyUp_jumping == true,则设置jumpForce = 0(停止跳跃)

与地面碰撞时,将_jumping设置为false并设置jumpForce = maxJumpForce

FixedUpdate中,检查是否_jumping然后用我们的jumpForce施力。

这会导致行为,您按住跳跃的时间越长,跳跃的时间就越长,类似于Mario和Hollow Knight等游戏