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.