Прыжки
Часть раздела Создание настоящих игр путешествия по 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, будет давать разную высоту при разной гравитации.
Задание
СреднеДва прыгуна используют один и тот же скрипт 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);
}
}
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Создание настоящих игр
1Текст на экране
Холст и текстПокажем счётФорматирование чиселТаймер обратного отсчётаПовторение: спидометр4Сцены и уровни
Загрузить сценуПерезапустить уровеньСледующий уровеньСохранить между сценамиПовторение: выбор уровня7Управление временем
Пауза с timeScaleЗамедленное движениеНемасштабируемое времяПовторение: Bullet Time10Проект: 3D-платформер
ТрассаДвижущиеся платформы2Кнопки и экраны
Кнопки и onClickЛямбдыСвязи в InspectorВключение и выключение панелейШкалы здоровьяПовторение: магазин улучшений5Сохранение с помощью PlayerPrefs
Сохранение числаЗагрузка со значением по умолчаниюРекордСохранение настроекПовторение: монеты в банке