- Game Mode
- Game Mode и базовые классы фреймворка Unreal Engine
- Game Mode Base
- Основная функциональность класса игрового режима
- Game Mode Base
- Game Mode
- Наследование классов
- Как создать Game Mode
- Как подключить GameMode к игровому проекту в Unreal Engine
- Как получить текущий GameMode. Blueprint-функция Get Game Mode.
- Настройки Game Mode (Base) во вкладке Details
- Classes
- Game
- Game Mode
- Переменные Game Mode (Base)
- Game Mode Base
- Game Mode
- Blueprint-функции Game Mode (Base)
- Events (события)
- Override-functions (переопределяемые функции)
- Функции, связанные с уровнем и матчем
- Функции, связанные с игроками
- Функции исключительно класса Game Mode
- Практика в Unreal Engine №1. Переносим данные через уровни с помощью Options String Game Mode
- Передаём значение переменной в параметр Option функции Open Level
- Считываем необходимую информацию из переменной Options String
- Практика в Unreal Engine №2. Game Mode: Выбор точки спавна игрока, функция Choose Player Start
Друзья, приветствую, с Вами Будуев Антон. В этой статье мы обсудим класс Game Mode (Game Mode Base), один из ключевых классов в Unreal Engine (UE5, UE4), который отвечает за обработку правил текущей игры и загрузку основных классов игрового фреймворка.
Вскоре выйдет моя бесплатная книга по Blueprints для Unreal Engine в PDF формате. Как она выйдет, рекомендую её скачать, чтобы Вы детально изучили блюпринты Анрил Энджин.
Game Mode
Game Mode, GameMode (игровой режим) — центральный класс во фреймворке Unreal Engine, отвечающий за правила, структуру и логику протекания игры в рамках текущей карты/уровня. Его основная задача — управлять глобальной логикой игрового процесса: как начинается и завершается игра, из каких этапов она состоит.
Класс используется как в однопользовательских, так и в многопользовательских играх. В последних играет еще более значимую роль, управляя подключениями игроков к многопользовательской игре, определяя, как создаются игроки и их персонажи, кто может подключиться к таким играм, как обрабатываются события входа и выхода игроков и так далее.
Иначе говоря, это центр управления жизненным циклом игры (многопользовательского матча) и всеми аспектами взаимодействия с игроками в рамках уровня. Это центр управления, определяющий такие правила игры, как:
- порядок присоединения игроков к игре;
- возможность приостановки игры;
- правила перехода на следующий уровень;
- подсчет очков игроков;
- контрольные точки, которые определяют состояние игрового процесса;
- количество присутствующих игроков и зрителей, а также их максимально допустимое количество;
- порядок, в котором игроки начинают игру;
- правила выбора места появления игроков или их возрождения;
- условия выигрыша;
- и другие правила игрового мира.
Таким образом, Game Mode служит «руководителем» игровой сессии. Он не отвечает за детали каждого игрока или интерфейса, но определяет общие правила, по которым всё работает. Без него движок не знал бы, какой тип игры запускается, как управлять игроками и как реагировать на сетевые события.
Game Mode и базовые классы фреймворка Unreal Engine
После создания GameMode становится центральным управляющим игровой логикой уровня. Но кроме правил игры, определяемых пользователем, он также отвечает за создание и инициализацию ключевых классов игрового фреймворка Unreal Engine (создание и инициализация которых, выполняются игровым режимом в строго определённые моменты жизненного цикла уровня):
- Player Controller — Актор, представляющий волю игрока, обрабатывающий его ввод и управляющий камерой. Создаётся для каждого подключившегося игрока.
- Default Pawn — игровой персонаж или транспорт, которым управляет игрок. Создаётся при входе в игру или респавне.
- Game State — объект, хранящий общее состояние игры/матча (например, список игроков, фазу игры), и реплицирующий эту информацию на всех клиентов. Создаётся сразу после объекта игрового режима.
- Player State — объект, который содержит уникальную информацию об игроке (имя, счёт, команда, флаги). Создаётся при инициализации игрока и привязывается к Player Controller, сохраняясь даже после смерти или смены Pawn.
- HUD — Актор, отвечающий за отрисовку пользовательского интерфейса, такой как (здоровье, счёт, карта). Игровой режим не создаёт HUD напрямую, но определяет его класс и инициирует создание на клиенте, отправляя команду контроллеру игрока при инициализации.
- Game Session — отвечает за одобрение входа игроков, регистрацию соединений, работу с онлайн-сервисами и управление сессией матча. Создаётся сразу после объекта игрового режима.
- Server Stat Replicator — системный Актор для передачи клиентам статистики сервера (пинг, задержки и т.д.). Создаётся сразу после объекта игрового режима.
- Replay Spectator Player Controller Class — класс Player Controller, используемый при просмотре сетевой записи (реплея).
- Spectator Pawn — специальный подкласс Pawn для наблюдателей, предоставляющий свободное перемещение по карте без взаимодействия с игровым процессом. Создаётся, когда игрок заходит в игру как наблюдатель
Сам же объект Game Mode (Game Mode Base) автоматически создаётся движком Unreal Engine при загрузке уровня, при этом он не сохраняется в .umap-файле этого уровня.
Таким образом, GameMode тесно связан с текущим уровнем и полностью зависит от его состояния — как только уровень выгружается или сменяется, текущий экземпляр игрового режима уничтожается, и при загрузке нового уровня создаётся новый объект GameMode. Это делает GameMode временным управляющим объектом жизненного цикла игры, реализующим центральную логику игрового режима на уровне и задающим правила для конкретной карты.
В многопользовательских играх GameMode существует исключительно на сервере и никогда не реплицируется на клиенты. Если удалённым игрокам действительно необходимо получать обновленную информацию о текущем игровом режиме, то её можно легко синхронизировать, сохраняя всю необходимую информацию в специальном классе Game State (состояние игры), который, в свою очередь, уже реплицируется на все удалённые клиенты.

Game Mode Base
В Unreal Engine существуют 2 вида игровых режимов:
- Game Mode Base;
- Game Mode.
Game Mode Base — базовый класс для определения игрового режима в Unreal Engine. Он содержит минимальную функциональность, необходимую для определения правил игры, управления состоянием игроков, начальной инициализацией игровых объектов (например, Game State, Game Session, Player Controller), а также отвечает за обработку входящих подключений и вход игроков в игру.
В отличие от Game Mode, он не содержит встроенной логики для состояний матча и предназначен для использования в более простых игровых режимах для однопользовательских игр.
Версия Game Mode — это расширенный дочерний класс от версии Base, включающая в себя все функции базовой версии, а также дополнительные возможности для многопользовательского игрового проекта, например, как управление состоянием мультиплеерного матча (Match State) и другие многопользовательские возможности.
Версия GameMode берёт своё начало из многопользовательского шутера от первого лица Unreal Tournament. Именно поэтому этот класс содержит множество функций, предназначенных для мультиплеерных игр. Спустя некоторое время класс GameMode был разделён на два: GameModeBase и GameMode. Base-версия была разработана как упрощённая и облегчённая версия, которая в основном используется в однопользовательских играх.
Перевод официальной справки:
Game Mode Base — определяет текущий игровой режим. Он управляет правилами игры, системой подсчёта очков, тем, какие Акторы могут существовать в этом игровом режиме, а также кто может присоединиться к игре.
Game Mode — это подкласс GameModeBase, который ведёт себя как многопользовательская игра с матчем. Он имеет поведение по умолчанию для выбора точек спавна и управления состоянием матча. Если нужен более простой базис, следует выбирать GameModeBase.
Основная функциональность класса игрового режима
Game Mode Base
- Game Rules — определяет базовые правила игры: кто может подключиться, какие Акторы разрешены, как управляются победа и поражение, а также поведение игроков при входе и выходе.
- Game Framework Classes Spawning — управляет созданием ключевых объектов игрового фреймворка: Player Controller, Pawn, Game State, Game Session, HUD и Spectator Pawn, используя заданные в свойствах классы.
- State Initialization — инициализирует состояние игры: сохраняет параметры из URL, создаёт Game Session, Game State, Server Stat Replicator.
- Player Management — обрабатывает вход (Post Login) и выход (Logout) игроков, управляет их именами (Change Name), отслеживает количество игроков, ботов и наблюдателей.
- Inactive Players — хранит Player State покинувших игроков, чтобы восстановить их при переподключении.
- Seamless Travel — обеспечивает для игроков бесшовную смену уровней.
- Pause System — предоставляет базовый функционал для реализации паузы в игре («разрешающую» логику и сетевую репликацию состояния паузы).
- Match Flow Control — контролирует логику старта и завершения матча.
Game Mode
- Match State — реализует управление состоянием матча (хранящегося в Game State), переходами между фазами игры:
- Entering Map — происходит загрузка карты, Акторы ещё не обновляются.
- Waiting To Start — Акторы уже обновляются (Tick), но матч ещё не начался.
- In Progress — идет нормальный игровой процесс, основное состояние матча.
- Waiting Post Match — матч завершён, игроков новых не принимают, но Акторы продолжают работать.
- Leaving Map — происходит выход с карты для перехода на новое место.
- Aborted — матч прерван из-за проблем, продолжить игру невозможно.
- Match Lifecycle Control — предоставляет возможность для управления жизненным циклом матча.
- Ready Conditions — использует методы для определения условий начала и завершения игры.
- Start & End Events — вызывает специализированные события при изменении состояния, позволяя добавить кастомную логику.
- Replay Support — автоматически начинает и останавливает запись реплеев на Dedicated Server (если включено свойство Handle Dedicated Server Replays).
- Player Count Management — предоставляет возможность обновлять счётчики игроков (Num Players, Num Spectators, Num Travelling Players) при входе, выходе и смене режима.
- Game State Requirement — требует, чтобы Game State Class был производным Game State (а не просто Game State Base), что обеспечивает совместимость с матчевой системой.
- Team Messaging — включает специализированные функции для отправки сообщений конкретным командам.
Наследование классов
Класс Game Mode наследуется от Game Mode Base расширяя его дополнительными мультиплеерными возможностями. Game Mode Base, в свою очередь, наследуется от класса Info, добавляя главным образом функциональность, влияющую на правила игры и созданием ключевых объектов игрового фреймворка. Сам же класс Info наследуется от Actor (базовый класс для объектов, размещаемых на игровом уровне).
* Info — абстрактный класс для Акторов, которые не имеют физического представления в мире и используются для хранения информации и управления игровыми системами.

Как создать Game Mode
Для создания нового игрового режима откройте Content Browser и вызовите контекстное меню, щёлкнув правой кнопкой мыши по пустому месту. В появившемся меню выберите пункт Blueprint Class. В открывшемся окне выбора базового класса (Pick Parent Class) найдите и выберите Game Mode Base. После этого в текущей папке Content Browser будет создан новый Blueprint-ассет на основе базового класса игрового режима.

Как подключить GameMode к игровому проекту в Unreal Engine
После создания и настройки игрового режима (Game Mode) его необходимо подключить к проекту или к конкретному уровню. Для каждого уровня можно назначить свой игровой режим, однако это вовсе не исключает повторного использования одного и того же ассета Game Mode на нескольких уровнях. Если игровые правила одинаковы на разных картах, достаточно указать один и тот же класс игрового режима для всех них.
Более того, вы можете задать общий Game Mode по умолчанию для всего проекта. Это делается в настройках проекта: тогда каждый новый уровень будет использовать этот режим игры автоматически. В случае необходимости на отдельном уровне всегда можно переопределить этот параметр и указать собственный класс игрового режима, подходящий именно для этой карты.
Чтобы назначить Game Mode по умолчанию для всего проекта, перейдите в меню Edit / Project Settings / Maps & Modes, и в поле Default GameMode выберите нужный класс игрового режима. Такой подход значительно упрощает управление режимами игры и их настройку в масштабах всего проекта.

Чтобы назначить пользовательский игровой режим непосредственно для конкретного уровня, откройте этот уровень в редакторе Unreal Engine. Затем перейдите в окно настроек уровня (World Settings). В разделе Game Mode найдите параметр GameMode Override и выберите там созданный ассет игрового режима.
Таким образом можно переопределить глобальные настройки проекта и применить уникальные правила игры именно для этого уровня.

Как получить текущий GameMode. Blueprint-функция Get Game Mode.

В Unreal Engine Blueprint-функция GetGameMode возвращает ссылку на объект базового класса игрового режима — GameModeBase. Если объекта не существует (например, на клиенте в многопользовательской игре), возвращается пустое (Null) значение. Используя эту функцию, можно получить текущий игровой режим из любого пользовательского Blueprint.
Однако поскольку возвращается ссылка именно на базовый класс движка, чтобы получить доступ к специфическим функциям и переменным пользовательского игрового режима, необходимо выполнить приведение типа (Cast) к пользовательскому классу GameMode. Например, через ноду Cast To BP_CustomGameMode можно преобразовать базовый объект в конкретный пользовательский класс игрового режима.
Ниже показан пример Blueprint-кода, в котором с помощью ноды Get Game Mode получаем ссылку на базовый игровой режим, затем кастуем её к объекту пользовательского класса BP_CustomGameMode и сохраняем в переменную As BP Custom Game Mode. После этого через эту переменную будет доступна вся расширенная логика пользовательского игрового режима.
Скриншот
Код на BlueprintUE

Кроме стандартного способа получения пользовательского игрового режима через Cast, существует более продвинутый и гибкий вариант — использование Blueprint Interface (интерфейсов Unreal Engine). Этот метод считается предпочтительным с точки зрения архитектуры, хотя и требует некоторых дополнительных действий.
Суть подхода в том, что необходимо создать собственный Blueprint Interface с функцией, например, Get Custom Game Mode, которую затем реализовать в пользовательском классе игрового режима, например, в BP_CustomGameMode для возврата объекта этого игрового режима. Таким образом, обращаясь к игровому режиму через интерфейс, сокращается зависимость от конкретного класса и упрощается поддержка и расширение проекта, что обеспечивает более чистую архитектуру взаимодействия между объектами.
Скриншот

Код на BlueprintUE

Настройки Game Mode (Base) во вкладке Details
В меню Details содержатся как унаследованные параметры от класса Actor, так и настройки, характерные для разбираемого класса игрового режима. Details для Actor мы уже разбирали в соответствующей статье про класс Акторов. Здесь же сконцентрируемся на настройках Game Mode (Base).
Classes
Настройки Classes во вкладке Details для Game Mode Base и Game Mode (наследует от Base).

- Game Session Class — указывает класс сессии игры (Game Session), который будет использоваться в текущем игровом режиме. Переопределение стандартного класса позволяет добавить пользовательскую логику одобрения входа игроков, ограничений, авторизации и т. д.
- Game State Class — указывает, какой именно класс состояния игры (Game State) будет использоваться в текущем игровом режиме.
- Player Controller Class — указывает, какой именно класс контроллера игрока (Player Controller) будет использоваться при входе игроков в игру.
- Player State Class — указывает, какой именно класс состояния игрока (Player State) будет использоваться для каждого игрока, входящего в игру.
- HUD Class — указывает, какой именно класс пользовательского интерфейса (HUD) будет использоваться в текущем игровом режиме.
- Default Pawn Class — указывает, какой именно класс Пешки (Pawn) будет использоваться по умолчанию для игроков в текущем игровом режиме.
- Spectator Class — указывает, какой именно класс Пешки, унаследованный от Spectator Pawn, будет использоваться для игроков, находящихся в режиме наблюдения.
- Replay Spectator Player Controller Class — указывает, какой именно класс контроллера игрока (Player Controller) будет использоваться, когда игрок находится в режиме просмотра сетевой записи (Replay).
- Server Stat Replicator Class — определяет, какой класс, унаследованный от Server Stat Replicator, будет создан при инициализации игрового режима для репликации статистики сервера на клиенты.
Game
Настройки Game во вкладке Details для Game Mode Base и Game Mode (наследует от Base).

- Default Player Name — определяет имя по умолчанию, присваиваемое игроку, который подключается к серверу без указанного имени.
Game Mode
Настройки Game Mode во вкладке Details для Game Mode Base и Game Mode (наследует от Base).

- Use Seamless Travel — определяет, будет ли игра использовать систему бесшовной смены уровней, при которой новая карта загружается в фоновом режиме без отключения удалённых клиентов. Если свойство включено, игроки остаются в игре, и состояние сохраняется, если выключено — происходит обычная перезагрузка с отключением и повторным подключением.
Seamless Travel — это функционал в Unreal Engine, которая позволяет сохранять сетевые соединения между сервером и клиентами во время загрузки следующего игрового уровня. Она включает в себя загрузку небольшой карты в качестве переходной, что даёт возможность собрать информацию о предыдущем уровне и затем продолжить загрузку следующего уровня. Это помогает предотвратить высокий уровень использования памяти и возможные проблемы с её нехваткой на ограниченных платформах. А также даёт возможность получить ровный бесшовный переход с уровня на уровень для всех сетевых игроков.
- Start Players As Spectators — определяет, должны ли игроки сразу появляться в игре при входе или оставаться в режиме наблюдателя, пока они вручную не запустят своё появление .
- Pauseable — определяет, может ли игра быть приостановлена (выведена на паузу). Если значение равно True, игра поддерживает паузу, если False — игра продолжается без возможности остановки.
- Game Net Driver Replication System — позволяет указать конкретную систему репликации, которая будет использоваться для Game Net Driver, отвечающей за реплицирование объектов, управляемых данным игровым режимом.
Настройки Game Mode во вкладке Details только для класса Game Mode.

- Delayed Start — определяет, должна ли игра начаться немедленно при входе первого игрока или ожидать вручную запущенного старта матча.
- Minimum Respawn Delay — задаёт минимальное время, которое игрок должен подождать после смерти, прежде чем сможет возродиться (респавниться) в игре.
- Inactive Player State Life Span — задаёт время, в течение которого сохраняется состояние игрока (Player State) после его выхода из игры, чтобы при повторном подключении восстановить информацию об этом игроке.
- Max Inactive Players — задаёт максимальное количество неактивных игроков, чьи состояния (Player State) могут храниться в памяти после выхода из игры. Если лимит превышен, самые старые неактивные игроки удаляются из списка, чтобы освободить место.
Переменные Game Mode (Base)
Game Mode Base
Переменные классов Game Mode Base и Game Mode (наследует от Base).

- Options String — хранит строку с параметрами (Options), разделёнными символом «?» и переданными при загрузке уровня (Open Level) или подключении игрока, например: имя игрока, режим игры, настройки сервера и т. д. Данную переменную нужно использовать с осторожностью, если используется механизм Server Travel.
- остальные переменные соответствуют разделу Game Mode вкладки Details.
Game Mode
Переменные только класса Game Mode.

- Num Spectators — хранит текущее количество наблюдателей в игре — то есть игроков, которые не участвуют напрямую в игровом процессе, а наблюдают за происходящим.
- Num Players — хранит текущее количество человек-игроков, активно участвующих в игре (не в режиме наблюдателя).
- Num Bots — хранит текущее количество неигровых персонажей (NPC) или ботов, участвующих в игре как полноценные игроки.
- Num Travelling Players — хранит количество игроков, которые всё ещё находятся в процессе перехода (Seamless Travel) с предыдущей карты на текущую.
- остальные переменные соответствуют разделу Game Mode вкладки Details.
Blueprint-функции Game Mode (Base)
Events (события)

- Event On Logout — событие вызывается, когда Controller (Player Controller или AI Controller), у которого есть Player State, покидает игру.
- Event On Swap Player Controllers — событие вызывается во время бесшовной смены уровней (Seamless Travel), когда старый Player Controller игрока заменяется новым.
- Event Handle Starting New Player — событие вызывается, когда новый Player Controller готов к началу игры, и может использоваться для запуска матча или подготовки игрока к игровому процессу.
- Event Init Start Spot — событие вызывается при появлении игрока на точке спавна через Restart Player At Player Start. Позволяет выполнить инициализацию или настройку стартового объекта (Start Spot) для конкретного игрока прямо в момент его появления.
- Event On Restart Player — событие, вызываемое в конце функции Restart Player, после полного воссоздания или респавна игрока (контроллера) в игре.
- Event On Change Name — событие, вызываемое при попытке изменить имя игрока, либо при установке имени впервые.
- Event On Post Login — событие вызывается после успешного входа игрока в игру (после создания Player Controller и Player State). Используется для инициализации логики, связанной с входом игрока.
Пример ниже демонстрирует Blueprint-код, в котором переопределяется событие On Post Login. В данном случае мы расширяем базовую реализацию этого события, добавляя дополнительную логику: подключённый игрок добавляется в общий массив контроллеров, представляющий текущих активных игроков.
Скриншот

Код на BlueprintUE

Override-functions (переопределяемые функции)

- Can Spectate — определяет, разрешено ли игроку Viewer следить за другим игроком (View Target) в режиме наблюдателя. Также функция используется для переопределения с целью управления политикой наблюдения (например, скрыть врагов, запрещать смотреть чужую команду и т.п.).
- Choose Player Start —вызывается с целью выбрать для игрока (Controller) наиболее подходящую точку спавна (обычно объект Player Start). По умолчанию возвращает случайную незанятую точку, но может быть переопределена для выбора конкретного места старта в зависимости от логики вашей игры.
- Find Player Start — выбирает и возвращает оптимальную стартовую точку (например, Player Start) для игрока, используя запомненную позицию или вызов Choose Player Start, с учётом заданного тега. Переопределение функции позволяет тонко управлять логикой появления игроков: например, реализовать старт по тегу.
Find Player Start всегда вызывается первой и может использовать сохранённую стартовую точку, или точку, возвращаемую Choose Player Start, которая, в свою очередь, реализует «логику выбора» места старта, если подходящее не найдено.
- Get Default Pawn Class For Controller — возвращает класс Pawn, который будет использоваться для создания персонажа игрока с данным контроллером.
- Initialize HUD For Player — вызывается при инициализации (спавне) игрока, чтобы подготовить для него объект HUD (интерфейс). По умолчанию создаёт стандартный HUD, но можно переопределить данное поведение, чтобы присвоить кастомные UI-виджеты, видимость, параметры HUD под конкретного игрока.
- Must Spectate — возвращает значение True, если данному контроллеру разрешено входить на сервер только как наблюдатель (Spectator), а не как активный игрок. Используется для переопределения с целью ограничения входа или контроля количества действующих участников матча.
- Player Can Restart — Проверяет, может ли игрок выполнить респавн. Возвращает True, если для заданного Player Controller разрешено вызывать Restart Player (по умолчанию делегирует проверку в CanRestartPlayer() у контроллера).
- Should Reset — определяет, должен ли для указанного Актора (Actor To Reset) быть вызван его метод Reset при перезапуске уровня или матча. По умолчанию всегда возвращает True, но можно переопределить её для выбора, какие Акторы сбрасывать автоматически, а какие — обрабатывать вручную или не сбрасывать вовсе.
- Spawn Default Pawn At Transform — вызывается при спавне персонажа игрока в заданных координатах (Transform), возвращая созданный Pawn. Функцию можно переопределить для настройки особенностей создания Pawn в момент появления.
- Spawn Default Pawn For — вызывается при спавне игрока на стартовой точке в процессе рестарта или входа, при этом создаёт новый Pawn для контроллера игрока, используя переданную стартовую точку (Start Spot). Функцию можно переопределить для тонкой настройки процесса появления и выбора кастомного Pawn.
Функции, связанные с уровнем и матчем

- Reset Level — вызывается для сброса (Reset) уровня без его перезагрузки, чтобы обновить состояние игры прямо в текущей карте.
- Return To Main Menu Host — вызывается для возвращения сервера (хоста) и всех подключённых игроков в главное меню игры. Она корректно завершает сессию, отключает игроков от сервера и инициирует переход всех клиентов (и сервера) на главный экран.
- Start Play — вызывается для официального начала игрового процесса на карте с целью переключить объект Game State в состояние «игра началась» и инициировать вызов BeginPlay() для всех Акторов, чтобы их игровая логика стартовала.
- Has Match Started — возвращает True, если коллбеки старта матча уже были вызваны и в игре официально начат матч.
- Has Match Ended — возвращает True, если матч можно считать завершённым и были вызваны все обработчики окончания матча.
Функции, связанные с игроками

- Restart Player — пытается возродить (спавнить) Pawn для указанного контроллера игрока (New Player) используя точку старта, возвращённую функцией Find Player Start.
- Restart Player At Player Start — пытается возродить (спавнить) Pawn для контроллера игрока (New Player) на конкретном указанном объекте Start Spot (точке спавна), а не выбирает точку самостоятельно.
- Restart Player At Transform — пытается возродить (спавнить) Pawn для указанного контроллера игрока (New Player) в конкретном месте, заданном с помощью трансформации (Spawn Transform — позиция, вращение, масштаб).
- Change Name — устанавливает новое имя игроку (контроллеру).
- Get Num Players — возвращает текущее количество активных игроков на сервере, исключая любых наблюдателей (Spectator).
- Get Num Spectators — возвращает количество подключённых игроков, которые сейчас находятся в режиме наблюдателя (Spectator), игнорируя обычных игроков.
Функции исключительно класса Game Mode

- Event On Set Match State — событие, которое можно реализовать для реакции на изменение состояния матча. Вызывается каждый раз, когда состояние матча изменяется.
- Ready To Start Match — определяет, можно ли начать матч. Возвращает значение True, если матч готов к началу.
- Ready To End Match — определяет, можно ли завершить матч. Возвращает значение True, если матч готов к завершению.
- End Match — переводит игру из состояния In Progress в Waiting Post Match, завершая игровой матч. Она может быть вызвана вручную или автоматически, когда ReadyToEndMatch() возвращает True.
- Abort Match — вызывается, когда игра сталкивается с непреодолимой проблемой. Сообщает, что матч завершён из-за неисправимой ошибки.
- Get Match State — возвращает текущее состояние матча.
- Is Match In Progress — возвращает значение True, если матч находится в состоянии In Progress или в другом состоянии, считающемся игровым. Используется для проверки, идёт ли в данный момент игровой процесс.
- Restart Game — перезапускает игру, по умолчанию сохраняя текущий уровень.
- Say — отправляет текстовое сообщение всем игрокам в игре.
- Start Match — начинает матч, переводя игру из состояния Waiting To Start в In Progress. Может быть вызвана вручную или автоматически, если ReadyToStartMatch() возвращает True.
Практика в Unreal Engine №1. Переносим данные через уровни с помощью Options String Game Mode
В Unreal Engine существует специальный класс — Game Instance, который работает на протяжении всей сессии игры и не зависит от загрузки уровней. Благодаря этому его используют для сохранения и передачи данных между уровнями, обеспечивая постоянство информации при переходах.
В то же время в классе Game Mode имеется полезный механизм — унаследованная переменная Options String, представляющая собой строку параметров, разделённых знаком вопроса ?. Эти параметры передаются через функцию Open Level, которая используется для загрузки новых уровней. Такой подход позволяет сохранять определённые данные из предыдущего уровня, помещая их в строку параметров при вызове перехода, а при загрузке следующего уровня — восстанавливать эти значения из Options String.
Таким образом, используя переменную Options String и функцию Open Level, можно передавать необходимые параметры между уровнями без дополнительного состояния.
Для лучшего понимания этого процесса рассмотрим конкретный практический пример.
В сетевых играх при вызове Server Travel происходит полное переключение сервера на новый уровень, что включает отсоединение всех клиентов с последующим их переподключением к новому уровню. При этом строка параметров Options из функции Open Level, если она не передана явно и не обработана на уровне сохранения состояния, может быть потеряна, так как Server Travel не гарантирует автоматическую передачу этих параметров всем клиентам.
Использование строки Options String и параметра Options функции Open Level удобно для передачи мелких настроек и параметров, но не гарантирует сохранения данных при Server Travel без дополнительной логики. Для сложных проектов лучше использовать Game Instance и Save Game, чтобы гарантировать сохранность состояния между уровнями.
Задача заключается в следующем: у игрового персонажа есть переменная Points, в которой хранятся набранные игроком очки. Необходимо обеспечить сохранение значения этой переменной при переходе на новый уровень.
Передаём значение переменной в параметр Option функции Open Level
Весь Blueprint-код мы будем писать внутри персонажа BP_ThirdPersonCharacter из стандартного шаблона игры от третьего лица в Unreal Engine 5. Для примера назначим загрузку нового уровня на нажатие клавиши L с помощью функции Open Level. Для простоты в качестве загружаемого уровня выберем тот же самый — ThirdPersonMap.
Особенностью функции Open Level является её параметр Options, в который можно передать произвольную строку с данными для следующего уровня. При загрузке нового уровня эта информация автоматически сохраняется в переменной Options String внутри класса Game Mode. В Unreal Engine данные в этой строке обычно записываются в формате ключ=значение, разделённые знаком вопроса (?). Это позволяет передавать параметры между уровнями через строку вызова загрузки.
Таким образом, используя параметр Options функции Open Level, можно сохранять нужную информацию в момент перехода на следующий уровень, а затем получать её в игровом режиме уже загруженного уровня для настройки игрового процесса или передачи состояния.

Например, у нас иммется переменная Points, значение которой равно 3. Согласно условиям задачи, нам необходимо передать значение этой переменной на новый уровень. Для этого нужно передать информацию в параметр Option в виде пары ключ-значение, то есть в виде строки «Points=3».
Чтобы сформировать строку «Points=3», мы можем воспользоваться функцией Append. Для этого нужно объединить строку «Points=» со значением нашей переменной Points, которая хранит набранные игроком очки.
Скриншот
Код на BlueprintUE

Считываем необходимую информацию из переменной Options String
После загрузки нового уровня мы можем восстановить значение переменной Points. Для этого, когда происходит событие Event BeginPlay, мы обратимся к переменной Options String, которая хранится в движке Unreal Engine в классе GameMode. Именно в эту переменную функция Open Level сохраняет всю информацию, которую мы передавали в параметр Option.
В строке Options String содержится множество параметров, разделённых знаком вопроса (?). Чтобы извлечь нужное значение, необходимо выполнить парсинг этой строки с помощью функции Parse Option. В качестве параметров для функции следует указать саму строку Options String и ключ, значение которого мы хотим получить. В нашем случае это ключ «Points».
Функция Parse Option, получив ключ «Points», вернёт значение 3, которое затем нам необходимо сохранить в переменной Points персонажа BP_ThirdPersonCharacter.
Скриншот
Код на BlueprintUE

Таким образом, используя унаследованную переменную Options String класса Game Mode мы передали необходимую информацию с одного уровня на другой не используя для этого класс Game Instance.
Практика в Unreal Engine №2. Game Mode: Выбор точки спавна игрока, функция Choose Player Start
По умолчанию в Unreal Engine (UE4, UE5), если на игровом уровне имеется несколько точек спавна (Player Start), откуда игрок может начать свой путь, выбор между Акторами Player Start осуществляется случайным образом. Однако, у нас есть возможность настроить правила выбора этих точек по своему усмотрению. Для этого необходимо переопределить функцию Choose Player Start в классе Game Mode.
Задача: необходимо изменить стандартное случайное определение точки старта (Player Start) на пользовательский выбор, основанный на теге 2. Если тег 2 не будет найден среди всех объектов (Player Start), расположенных на уровне, то выбор будет осуществляться в стандартном порядке, то есть случайным образом.
Итак, для начала необходимо открыть функцию Choose Player Start для переопределения. Для этого перейдите в блюпринт GameMode в раздел Function / Override и вызовите функцию Choose Player Start.

Также Актору PlayerStart_2 на игровом уровне нужно добавить тег 2.

Затем нам нужно собрать всех Акторов класса Player Start в один общий массив. Для этого воспользуемся функцией Get All Actor Of Class, в которой в параметре Actor Class укажем значение «Player Start». В итоге эта функция вернёт нам список всех Акторов класса Player Start, присутствующих на игровом уровне.
После чего нужно выполнить цикл For Each Loop, чтобы перебрать все Акторы из массива и проверить, есть ли у каждого из них тег 2. Если такой тег найден, то цикл и функция в целом завершаются с помощью ноды Return Node, в которую передается Актор с найденным тегом. Именно этот Актор будет использоваться для создания игрока при запуске игры.
Если в ходе цикла тэг 2 не будет найден ни у одного из Акторов, то по завершении этого цикла мы активируем родительский функционал Parent: Choose Player Start. В итоге этот функционал выберет Актор Player Start случайным образом.
Скриншот

Код на BlueprintUE

Итак, переопределив функцию Choose Player Start в классе Game Mode, мы смогли настроить выбор места появления игрока (Player Start) в соответствии с нашими правилами. В случае, если ситуация не будет соответствовать установленным условиям, выбор места появления игрока будет осуществляться в стандартном случайном порядке, как это предусмотрено по умолчанию.
Совет. Вскоре выйдет моя бесплатная книга по Blueprints для Unreal Engine в PDF формате. Как она выйдет, рекомендую её скачать, чтобы Вы детально изучили блюпринты Анрил Энджин.
Добрый день! Только начал разбираться в анриале, так что не судите строго, пожалуйста. У меня вопрос по первому заданию. При переносе данных из Get Game Mode в Parse option у меня вызывается функция Get Display Name, Что не похоже на то что в примере. Подскажите пожалуйста как это исправить. И на конце выходит что очки равны нулю (в конце сделал Print String, что-бы выводило сколько очков)
Андрей, здравствуйте.
Get Game Mode не нужно напрямую подсоединять к функции Parse Option. Из Get Game Mode нужно вызвать параметр «Options String», в котором, собственно, и хранится вся информация. Но эту информацию нужно «распарсить» функцией Parse Option. То есть, порядок такой, Get Game Mode -> Options String -> Parse Option
А как из GameMode запустить Event у присоединившегося PlayerCharacter?
Событие OnPostLogin выдаёт только PlayerController.
Получаю GetControlledPawn, присоединяю его к касту на PlayerCharacter.
Так вот этот каст на PlayerCharacter всегда failed.
Евгений, OnPostLogin вызывается когда игрок присоединился к игре. Но под игроком подразумевается Player Controller. А Pawn игрока — это не игрок, это просто пешка, которой владеет игрок. И в момент вызова OnPostLogin, то есть, когда присоединился игрок (Player Controller), то этот Player Controller еще не успевает овладеть пешкой, поэтому каст выдаёт Fail.
Тут либо воспользоваться событием Possessed в самом PlayerCharacter. Это событие вызывается, когда пешка гарантированно начинает управляться контроллером. И в этом событии сделать Cast на Game Mode и в нем вызвать кастомное событие, означающее, что PlayerCharacter точно присоединился. Но это вариант так себе… туда сюда делать вызовы (Пешка делает вызов в Game Mode о том, что она контролируется, чтобы Game Mode, в свою очередь вызвал событие в пешке).
Либо просто в Game Mode после вызова OnPostLogin сделать небольшую задержку (можно даже таймер, который потом удалить) и после задержки сделать Cast на PlayerCharacter. Тогда все будет норм, каст будет успешный.
Просто еще раз хочу подчеркнуть, что OnPostLogin — это событие, вызываемое в момент присоединения игрока (Player Controller), но так как контроллер только присоединился, то в этот конкретный момент времени он еще не владеет пешкой.