Menu
CoddyTech

Прыжки

Часть раздела Создание настоящих игр путешествия по Unity на Coddy. Урок 40 из 60.

Прыжок задаёт вертикальную скорость один раз — в момент нажатия Space; гравитация, которую скрипт уже добавляет, затем замедляет подъём, останавливает его в верхней точке и возвращает контроллер вниз. Осталось определить начальную скорость для заданной высоты. Гравитация отнимает скорость с постоянной скоростью, поэтому прыжок с начальной скоростью v поднимается на v * v / (2 * g) единиц, прежде чем остановиться. Если преобразовать формулу, начальная скорость для высоты h равна v = √(2 * g * h).

Если gravity хранится как отрицательное число, -20, а высота прыжка составляет 2.5 единицы, то получаем Mathf.Sqrt(2.5f * -2f * -20f) — квадратный корень из 100: 10 единиц в секунду. Значение -2f превращает отрицательную гравитацию в положительную, потому что квадратный корень из отрицательного числа — это NaN:

if (controller.isGrounded && verticalSpeed < 0f)
{
    verticalSpeed = -2f;
}
if (Input.GetButtonDown("Jump") && controller.isGrounded)
{
    verticalSpeed = Mathf.Sqrt(jumpHeight * -2f * gravity);
}
verticalSpeed += gravity * Time.deltaTime;

Проверка сброса verticalSpeed < 0f срабатывает только при падении: обычный сброс с условием if (controller.isGrounded) после строки прыжка перезаписал бы скорость прыжка в кадре, когда выполняется прыжок. Проверка controller.isGrounded при прыжке не позволяет прыгать в воздухе. Измените jumpHeight или gravity в Inspector, и прыжок всё равно будет достигать ровно jumpHeight, тогда как фиксированная скорость, например verticalSpeed = 8f, будет давать разную высоту при разной гравитации.

challenge icon

Задание

Средне

Сделай один скрипт прыжка, подходящий и для Мальчика, и для Кенгуру.

  1. В Update() замени 9f на Mathf.Sqrt(jumpHeight * -2f * gravity) — начальную скорость, при которой персонаж поднимается ровно на jumpHeight.
  2. Добавь && controller.isGrounded в if прыжка, чтобы персонаж не прыгал в воздухе.

Нажми «Играть» и пробел: Мальчик поднимется на 1 единицу, а Кенгуру — на 4. Затем нажми «Проверить».

Попробуйте сами

using UnityEngine;

public class Jumper : MonoBehaviour
{
    public float speed = 5f;
    public float gravity = -18f;
    public float jumpHeight = 1f;

    CharacterController controller;
    float verticalSpeed;

    void Start()
    {
        controller = GetComponent<CharacterController>();
    }

    void Update()
    {
        if (controller.isGrounded && verticalSpeed < 0f)
        {
            verticalSpeed = -2f;
        }
        if (Input.GetButtonDown("Jump"))
        {
            verticalSpeed = 9f;
        }
        verticalSpeed += gravity * Time.deltaTime;

        Vector3 move = new Vector3(Input.GetAxisRaw("Horizontal"), 0f, Input.GetAxisRaw("Vertical")) * speed;
        move.y = verticalSpeed;
        controller.Move(move * Time.deltaTime);
    }
}

Все уроки раздела Создание настоящих игр

Потренируйтесь самостоятельно: Песочница Unity