Настройка сцены
- Добавьте компонент Rigidbody2D к игроку. Во вкладке «Constraints» установите галочку «Freeze Rotation». Это предотвратит вращение и опрокидывание персонажа при столкновении с уровнем.
- Добавьте коллайдер к корневому объекту тайлов земли, чтобы избежать создания множества отдельных коллайдеров. Растяните коллайдер до нужных размеров.
- В Mecanim назначьте три состояния: Idle, Walk, Jump, и соответствующие им анимационные клипы. Для изменения состояния по умолчанию выберите его, кликните правой кнопкой мыши и выберите «Set as layer default state».
Структура кода
Проект использует два класса: KeyboardController и Player.
- KeyboardController отвечает за обработку ввода с клавиатуры. В будущем его можно заменить на ввод с сенсора или команды от сервера/ИИ.
- Player – класс персонажа, имеющий конечный набор состояний: Idle, Walk, Jump. Правила переходов между состояниями предотвращают некорректные ситуации, например, ходьбу во время прыжка. Контроллер реализован по паттерну Finite State Machine (FSM), поэтому переходы между анимациями запускаются программно, а не задаются непосредственно в анимациях.
Класс Player: подробный разбор
Переменные
Класс Player содержит следующие переменные:
- Публичные:
- WalkSpeed (float): скорость ходьбы.
- JumpForce (float): сила прыжка.
- Приватные:
- _moveState (перечисление): текущее состояние персонажа (Idle, Walk, Jump).
- _direction (перечисление): направление взгляда персонажа (влево или вправо).
- Три поля для кеширования ссылок на компоненты Transform, Rigidbody2D и Animator.
- Два поля для плавной остановки (таймер, установленный на 0.5 секунды).
Метод Update
Метод Update содержит два условия:
- Если состояние Jump: ожидание, пока скорость не станет нулевой (приземление). После приземления состояние переключается на Idle.
- Если состояние Walk: задаётся ускорение персонажа влево или вправо в зависимости от направления, используя тернарный оператор. Скорость умножается на WalkSpeed и Time.deltaTime. Если таймер остановки закончился, состояние переключается на Idle.
Методы управления
Есть три публичных метода: MoveLeft(), MoveRight(), Jump().
- MoveLeft() и MoveRight() проверяют, не находится ли персонаж в состоянии прыжка. Затем меняют состояние на Walk, меняют направление взгляда (изменяя масштаб по оси X) и запускают соответствующую анимацию с помощью метода Play(). Таймер остановки устанавливается на 0.5 секунды.
- Jump() проверяет, не находится ли персонаж уже в прыжке. Если нет, то придает персонажу вертикальное ускорение.
Описана реализация базового перемещения персонажа с использованием Finite State Machine. Код простой и понятный, его можно расширять и усложнять, например, добавив иерархию состояний. Более детальный код доступен по ссылке (ссылка опущена).