Друзья, приветствую, с Вами Будуев Антон. В этой статье мы обсудим Blueprint-класс Game State, который отвечает в движке Unreal Engine (UE4, UE5) за обработку информации о текущей игре и её состоянии.
Unreal Engine Game State
Любая игра строится на правилах, которые определяют её суть. Когда в игре происходят события, связанные с этими правилами, возникает необходимость отслеживать эти события и своевременно сообщать о них всем участникам игрового процесса.
В многопользовательских играх эта задача становится ещё более сложной, поскольку на процесс влияет множество игроков. Всем им требуется актуальная, синхронизированная и одинаковая информация в каждый момент времени.
В Unreal Engine для решения этой задачи существует класс GameState, который отвечает за состояние игры. Он синхронизирует и хранит всю необходимую информацию о её текущем состоянии, а также информирует всех игроков, включая сетевые клиенты, о любых изменениях в игре.
Game State представляет собой абстрактный объект, созданный для отслеживания состояния игры. Существуя как на сервере, так и на всех клиентах, этот класс выполняет важную задачу по репликации всей игровой информации между сервером и всеми подключенными клиентами в рамках сетевого многопользовательского режима.
Состояние игры включает в себя данные и логику, касающиеся всех игроков в игре, такие как:
- результаты команд,
- цели,
- список подключённых игроков,
- оставшееся время текущего раунда,
- и прочее.
Однако следует отметить, что GameState не является оптимальным решением для хранения информации, специфичной для каждого отдельного игрока. Например, такой как его здоровье или количество очков, набранных игроком за команду. Для этой цели в Анрил Энджин предусмотрен отдельный блюпринт-класс PlayerState, который служит хранилищем данных о состоянии конкретного отдельно взятого игрока.
Как создать Game State
В Анрил Энджин существуют 2 вида класса состояния игры:
- Game State Base
- Game State
GameStateBase — это базовая и основная версия класса состояния игры. В большинстве проектов, особенно в однопользовательских, используют именно её. Поскольку она проще, легче и не содержит лишних функций.
Версия Game State — это расширенный дочерний класс от Base. Эта версия включает в себя все функции базовой версии, а также дополнительные возможности для многопользовательского игрового проекта.
На самом деле выбор между GameStateBase или GameState тесно связан с классом игрового режима — GameMode. А именно, если Вы в своем проекте в Unreal Engine используете GameModeBase, то и класс состояния игры также должен быть базовым GameStateBase. В случае же использования обычного GameMode, то и класс состояния также должен быть GameState.
Так как в большинстве проектов используются базовые версии этих классов, рассмотрим, как создать класс состояния игры именно на примере GameStateBase.
Для этого перейдите в Content Browser и вызовите контекстное меню, щелкнув в браузере правой кнопкой мыши по пустому полю. Выберите меню «Blueprint Class». Далее в открывшемся окне «Pick Parent Class» в форме поиска введите «Game State». После чего нажмите «Select». В результате ассет базового класса состояния игры будет создан в текущей папке Content Browser.
Как подключить Game State в Unreal Engine
Чтобы подключить класс состояния игры GameState в Unreal Engine (UE4, UE5), нужен файл GameMode.
Итак, откройте файл GameMode, который используется в Вашем проекте. Перейдите в меню «Class Defaults», далее во вкладку «Details» и в раздел «Classes». В этом разделе найдите настройки «Game State Class» и в выпадающем списке выберите свой класс состояния игры.
Если в Вашем проекте файл GameMode отсутствует, его необходимо создать по аналогии с процессом, описанным выше для класса состояния игры. И после подключить Ваш игровой режим в настройках Вашего проекта: «Edit / Project Settings / Maps & Modes / Default GameMode».
Как получить текущий Game State. Функция Get Game State
Функция «Get Game State» позволяет из любого Blueprint-класса в Unreal Engine (UE4, UE5) получить текущий класс состояния игры. Данныя функция возвращает ссылку на объект базового родительского класса GameStateBase. Если этого объекта не существует, то возвращается пустое значение.
Но так как возвращается ссылка именно на базовый родительский класс движка Unreal Engine, то необходимо данную ссылку при помощи Cast (каста) привести к типу Вашего пользовательского класса состояния игры, чтобы получить доступ ко всем его функциям и переменным.
Ниже представлен код на языке Blueprint, где с помощью ноды «Get Game State» мы получаем ссылку на объект базового класса состояния игры. Затем, используя функцию приведения типов «Cast to BP_CustomGameState», мы преобразуем эту ссылку в наш пользовательский объект «BP_CustomGameState». И, наконец, сохраняем его в переменной «As BP Custom Game State». Таким образом, в этой переменной у нас хранится объект текущего пользовательского класса состояния игры.
Также можно получить доступ к пользовательскому GameState через Blueprint Interface, представляющий собой систему интерфейсов Unreal Engine. Этот вариант более предпочтителен, хотя и немного сложнее. Для этого необходимо создать новый интерфейс «Get Custom Game State» и реализовать его в пользовательском классе состояния игры «BP_CustomGameState».
На этом наша статья завершается. В ней мы обсудили Blueprint-класс, который занимается обработкой информации о текущей игре и её состоянии. А именно GameState, представляющий собой класс состояния игры в Unreal Engine (UE4, UE5). Также рассмотрели небольшой практический пример кода на блюпринтах, демонстрирующий работу функции «Get Game State». С помощью которой Вы можете получить текущий пользовательский класс состояния игры в любом месте Вашего проекта.