Прыжок не плавный, больше похож на телепортацию - PullRequest
0 голосов
/ 29 марта 2019

Мой Плеер, как сказано в названии, больше телепортируется, как прыжки, но я не нашел ответа на это. Я использовал это мой код

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

1 Ответ

0 голосов
/ 30 марта 2019

Input.GetKeyDown должен вызываться из вашей Update() функции, а физические силы должны применяться в вашей FixedUpdate() функции.

GetKeyDown верен только для одного кадра, в котором он встречается. FixedUpdate может или не может работать в течение этого кадра. Итак, никогда не используйте GetKeyDown (или любой другой аналогичный вариант ввода Вниз и Вверх) в FixedUpdate. 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

Возвращает истину во время кадра, когда пользователь начинает нажимать клавишу идентифицируется по имени. 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) для прыжка, который начинается с максимума и уменьшается на протяжении всего прыжка.

Я уменьшаю это в FixedUpdate до jumpForce = Mathf.Max(jumpForce - jumpDecay * Time.fixedDeltaTime, 0).

Если обнаружено Input.GetKeyUp и _jumping == true, установите jumpForce = 0. (хватит прыгать)

При столкновении с землей установите _jumping в значение false и установите jumpForce = maxJumpForce.

В FixedUpdate проверьте, если _jumping, затем примените силу, используя наш jumpForce.

Это приводит к тому, что чем дольше вы удерживаете прыжок, тем дольше ваш прыжок, подобно играм, таким как Mario и Hollow Knight

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...