Трасса
Часть раздела Создание настоящих игр путешествия по Unity на Coddy. Урок 49 из 60.
В этой главе мы создадим 3D-платформер. Ты будешь бегать и прыгать по парящим платформам, кататься на одной из них, которая скользит, касаться контрольных точек, чтобы при падении не возвращаться к началу, собирать самоцветы, количество которых отображается на экране, пересекать финишную черту и переходить на следующий уровень, а также пытаться побить свой лучший результат. Игра состоит из пяти скриптов, которые уже есть в проекте с самого начала: 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 описывает всё это перемещение.
Задание
СреднеЗаставь игрока ходить, прыгать и падать.
- В
Start()найди действияMoveиJumpс помощьюInputSystem.actions.FindAction. - В
Update()перемещайся со скоростьюspeed: x у Move направь вдоль x, а y — вдоль z. - Прибавляй
gravity * Time.deltaTimeкvelocity.y; когда персонаж на земле и падает, устанавливай значение-2f. Прыжок, когда персонаж на земле, задаёт значениеMathf.Sqrt(jumpHeight * -2f * gravity). - Один раз вызови
controller.Move((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Сцены и уровни
Загрузить сценуПерезапустить уровеньСледующий уровеньСохранить между сценамиПовторение: выбор уровня2Кнопки и экраны
Кнопки и onClickЛямбдыСвязи в InspectorВключение и выключение панелейШкалы здоровьяПовторение: магазин улучшений5Сохранение с помощью PlayerPrefs
Сохранение числаЗагрузка со значением по умолчаниюРекордСохранение настроекПовторение: монеты в банкеПотренируйтесь самостоятельно: Песочница Unity