GameMode, PlayerController и GameState

Урок собирает воедино тройку, которая управляет потоком игры: GameMode, PlayerController и GameState.

PlayerController — это представитель игрока в мире: он принимает ввод, владеет Pawn'ом и хранит данные конкретного игрока, не привязанные к телу.

Разделение ответственности

В прошлых уроках мы встречали GameMode, контроллеры и состояние по отдельности. Теперь соберём их вместе — это каркас управления любой игрой. Каждый отвечает за своё, и не стоит сваливать всё в один класс.

КлассОтвечает заЖивёт
GameModeПравила: классы, спавн, условия победыТолько на сервере
PlayerControllerВвод, владение Pawn'ом, данные игрокаУ каждого игрока
GameStateОбщее состояние матча (счёт, время)У всех (реплицируется)
PlayerStateДанные конкретного игрока (его счёт, имя)Реплицируется всем

PlayerController подробнее

Контроллер игрока — мост между человеком и миром. Он получает ввод, владеет Pawn'ом и решает, кем сейчас управляет игрок. Важно: контроллер переживает смерть Pawn'а. Если персонаж погиб и возродился, контроллер тот же — поэтому в нём удобно хранить то, что не должно теряться при смерти (например, открытый интерфейс или режим управления).

Полная схема

GameMode (сервер): правила, спавнит игроков
     |
PlayerController (на каждого игрока): ввод -> владеет -> Pawn
     |
Pawn/Character: тело в мире

GameState: счёт матча, таймер   (виден всем)
PlayerState: счёт игрока, имя   (на каждого, виден всем)

Кто что хранит

  • Правила игры (как победить) — GameMode.
  • Ввод и управление — PlayerController.
  • Состояние матча для всех — GameState.
  • Личные данные игрока — PlayerState.
  • Текущее тело — Pawn/Character.

Как работает под капотом

При входе игрока GameMode на сервере создаёт ему PlayerController и PlayerState, затем спавнит Pawn и связывает его с контроллером. GameState создаётся один на матч. В мультиплеере сервер хранит «истину», а клиентам реплицируются их контроллеры, общий GameState и все PlayerState — поэтому каждый видит счёт остальных. Это разделение — фундамент сетевой архитектуры Unreal.

Частые ошибки

  • Хранить данные игрока в Pawn. При смерти тела они потеряются; используйте PlayerController или PlayerState.
  • Логика правил в PlayerController. Правила — дело GameMode, иначе в мультиплеере будет рассинхрон.
  • Общее состояние в GameMode. GameMode есть только на сервере; общее кладут в GameState.

Поток входа игрока в матч

Полезно проследить весь путь появления игрока, чтобы тройка классов уложилась в голове. Игрок подключается — GameMode на сервере получает событие PostLogin и создаёт для него PlayerController и связанный PlayerState. Затем GameMode выбирает точку появления (обычно Actor PlayerStart на уровне) и спавнит Default Pawn, после чего контроллер вселяется в это тело. С этого момента игрок в игре: его ввод идёт через контроллер в Pawn, его личные данные копятся в PlayerState, а общий ход матча отражается в GameState.

Когда персонаж погибает, цепочка частично повторяется: Pawn уничтожается, но контроллер и PlayerState остаются. GameMode решает, спавнить ли новое тело и где. Именно поэтому очки и прогресс кладут в долгоживущие классы — они переживают любое число смертей и возрождений. Увидев эту картину целиком, вы перестаёте путаться, что где должно лежать.

Итоги

  • GameMode — правила (сервер), PlayerController — ввод и владение телом.
  • GameState хранит общее состояние матча, PlayerState — данные игрока.
  • PlayerController переживает смерть Pawn'а — там держат долгоживущие данные.
  • Это разделение — основа сетевой архитектуры Unreal.
Проверьте себя
1. Что переживает смерть Pawn'а и поэтому подходит для хранения данных игрока?
AСам Pawn
BPlayerController
CМатериал
DУровень
2. Где хранить общий счёт матча, видимый всем игрокам?
AВ Pawn
BВ GameState
CВ GameMode
DВ Material
3. Кто отвечает за правила игры и спавн игроков?
APlayerController
BGameMode
CGameState
DHUD