Pixel Art RPG в Unity: Перемещение персонажа

Настройка сцены

  1. Добавьте компонент Rigidbody2D к игроку. Во вкладке «Constraints» установите галочку «Freeze Rotation». Это предотвратит вращение и опрокидывание персонажа при столкновении с уровнем.
  2. Добавьте коллайдер к корневому объекту тайлов земли, чтобы избежать создания множества отдельных коллайдеров. Растяните коллайдер до нужных размеров.
  3. В 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 содержит два условия:

  1. Если состояние Jump: ожидание, пока скорость не станет нулевой (приземление). После приземления состояние переключается на Idle.
  2. Если состояние Walk: задаётся ускорение персонажа влево или вправо в зависимости от направления, используя тернарный оператор. Скорость умножается на WalkSpeed и Time.deltaTime. Если таймер остановки закончился, состояние переключается на Idle.

Методы управления

Есть три публичных метода: MoveLeft(), MoveRight(), Jump().

  • MoveLeft() и MoveRight() проверяют, не находится ли персонаж в состоянии прыжка. Затем меняют состояние на Walk, меняют направление взгляда (изменяя масштаб по оси X) и запускают соответствующую анимацию с помощью метода Play(). Таймер остановки устанавливается на 0.5 секунды.
  • Jump() проверяет, не находится ли персонаж уже в прыжке. Если нет, то придает персонажу вертикальное ускорение.

Описана реализация базового перемещения персонажа с использованием Finite State Machine. Код простой и понятный, его можно расширять и усложнять, например, добавив иерархию состояний. Более детальный код доступен по ссылке (ссылка опущена).

Что будем искать? Например,программа