Прыжки
Часть раздела Создание настоящих игр путешествия по 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, будет давать разную высоту при разной гравитации.
Задание
СреднеСделай один скрипт прыжка, подходящий и для Мальчика, и для Кенгуру.
- В
Update()замени9fнаMathf.Sqrt(jumpHeight * -2f * gravity)— начальную скорость, при которой персонаж поднимается ровно наjumpHeight. - Добавь
&& 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);
}
}
Все уроки раздела Создание настоящих игр
1Текст на экране
Холст и текстПокажем счётФорматирование чиселТаймер обратного отсчётаПовторение: спидометр4Сцены и уровни
Загрузить сценуПерезапустить уровеньСледующий уровеньСохранить между сценамиПовторение: выбор уровня2Кнопки и экраны
Кнопки и onClickЛямбдыСвязи в InspectorВключение и выключение панелейШкалы здоровьяПовторение: магазин улучшений5Сохранение с помощью PlayerPrefs
Сохранение числаЗагрузка со значением по умолчаниюРекордСохранение настроекПовторение: монеты в банкеПотренируйтесь самостоятельно: Песочница Unity