Трасса
Часть раздела Создание настоящих игр путешествия по Unity на Coddy. Урок 48 из 56.
В этой главе мы создадим трёхмерный платформер. Ты будешь бегать и прыгать по парящим платформам, кататься на скользящей платформе, активировать контрольные точки, чтобы после падения не возвращаться к началу, собирать отображаемые на экране самоцветы, пересекать финишную линию и переходить на следующий уровень, а также пытаться побить свой лучший результат по времени. В проекте с самого начала есть пять скриптов: Player, MovingPlatform, Checkpoint, Gem и FinishLine. Последние четыре пока пусты, и в каждом уроке мы будем заполнять один из них. Персонаж игрока использует CharacterController, управление которым осуществляется с помощью действий Input System, а камера является его дочерним объектом, поэтому следует за ним без скрипта.
CharacterController перемещается двумя способами. Move(motion) перемещает его на заданное расстояние и ничего не добавляет, поэтому за гравитацию, прыжки и Time.deltaTime отвечает скрипт, как в главе о Character Controller. SimpleMove(speed) принимает скорость в единицах в секунду, сам умножает её на время кадра и добавляет гравитацию; передаваемое значение y игнорируется, поэтому персонаж, перемещаемый с его помощью, падает с выступов, но никогда не может прыгнуть. Этой овчарке в игре о пастушьем псе, видимой сверху, прыгать не нужно, поэтому SimpleMove и действие Move — это всё, что нужно для её скрипта:
using UnityEngine;
using UnityEngine.InputSystem;
public class Sheepdog : MonoBehaviour
{
[SerializeField] private float speed = 6f;
private CharacterController controller;
private InputAction moveAction;
void Start()
{
controller = GetComponent<CharacterController>();
moveAction = InputSystem.actions.FindAction("Move");
}
void Update()
{
Vector2 input = moveAction.ReadValue<Vector2>();
controller.SimpleMove(new Vector3(input.x, 0f, input.y) * speed);
}
}Персонаж игрока в платформере должен уметь прыгать, поэтому он хранит собственную вертикальную скорость и перемещается с помощью Move, считывая действия Move и Jump вместо класса Input. Unity рекомендует вызывать Move или SimpleMove один раз за кадр: перемещение при ходьбе и падение выполняются одним вызовом, и тогда isGrounded описывает всё это перемещение.
Задание
СреднеНачни платформер с игрока. Скрипт Player содержит speed (5), jumpHeight (1.5) и gravity (-9.81), controller и velocity для падения. Найди действия Move и Jump один раз, в Start, а в Update:
- Move перемещает игрока со скоростью
speedединиц в секунду: вправо и влево вдоль x, вперёд и назад вдоль z. - Гравитация каждый кадр добавляет
gravity * Time.deltaTimeкvelocity.y. Пока контроллер находится на земле иvelocity.yменьше 0, сначала установиvelocity.yв -2, чтобы игрок оставался прижатым к земле. - Каждое нажатие Jump, пока игрок на земле, устанавливает
velocity.yвMathf.Sqrt(jumpHeight * -2f * gravity): высота прыжка составляетjumpHeightединиц. Удерживание Jump приводит к одному прыжку, а прыгать в воздухе нельзя. - Вызови
controller.Moveодин раз, передав вместе перемещение иvelocity, умноженные наTime.deltaTime.
Нажми Играть и перепрыгни на первые платформы, затем нажми Проверить.
Попробуйте сами
using UnityEngine;
using UnityEngine.InputSystem;
public class Player : MonoBehaviour
{
[SerializeField] private float speed = 5f;
[SerializeField] private float jumpHeight = 1.5f;
[SerializeField] private float gravity = -9.81f;
private CharacterController controller;
private Vector3 velocity;
void Start()
{
controller = GetComponent<CharacterController>();
}
void Update()
{
// передвигаться с помощью действия Move, прыгать с помощью действия Jump, падать под действием гравитации
}
}
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Создание настоящих игр
1Текст на экране
Холст и текстПокажем счётФорматирование чиселТаймер обратного отсчётаПовторение: спидометр4Сцены и уровни
Загрузить сценуПерезапустить уровеньСледующий уровеньСохранить между сценамиПовторение: выбор уровня7Управление временем
Пауза с timeScaleЗамедленное движениеНемасштабируемое времяПовторение: Bullet Time10Проект: 3D-платформер
ТрассаДвижущиеся платформы2Кнопки и экраны
Кнопки и onClickЛямбдыСвязи в InspectorВключение и выключение панелейШкалы здоровьяПовторение: магазин улучшений5Сохранение с помощью PlayerPrefs
Сохранение числаЗагрузка со значением по умолчаниюРекордСохранение настроекПовторение: монеты в банке