Menu
CoddyTech

Прыжки

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

Прыжок — это вертикальная скорость, задаваемая один раз в момент нажатия 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

Задание

Средне

Два прыгуна используют один и тот же скрипт Jumper.cs: Малыш, у которого в Inspector задано значение gravity −18 и jumpHeight 1, и Кенгуру, у которого gravity равна −8, а jumpHeight — 4. Нажатие пробела задаёт verticalSpeed значение 9 — число, подобранное методом проб и ошибок: оно не подходит ни одному из прыгунов, к тому же прыжок срабатывает и в воздухе. Исправь прыжок:

  • При нажатии пробела начинается прыжок на высоту ровно jumpHeight, рассчитанную на основе собственных значений jumpHeight и gravity каждого прыгуна.
  • Прыгать может только стоящий на земле персонаж.

Нажми Play и прыгни, затем нажми Check.

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

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);
    }
}
quiz iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

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