GameState в Unreal Engine. Разбираем Blueprint-класс состояния игры. Функции «Get Game State», «Player Array».

Друзья, приветствую, с Вами Будуев Антон. В этой статье мы обсудим Blueprint-класс Game State, который отвечает в движке Unreal Engine (UE4, UE5) за обработку информации о текущей игре и её состоянии.

Обсудим предназначение данного класса, а также отработаем взаимодействие с Game State на практике, описав код для двух задач: подсчёт общего количества игроков, подключённых к игре; и создание системы отслеживания счета для нескольких команд многопользовательской игры.

В целом же, в данной статье на практике мы будем работать со следующими функциями, которые так или иначе связаны с GameState в Unreal Engine: «Get Game State», «Player Array» и другими вспомогательными функциями.

Unreal Engine Game State

Любая игра строится на правилах, которые определяют её суть. Когда в игре происходят события, связанные с этими правилами, возникает необходимость отслеживать эти события и своевременно сообщать о них всем участникам игрового процесса.

В многопользовательских играх эта задача становится ещё более сложной, поскольку на процесс влияет множество игроков. Всем им требуется актуальная, синхронизированная и одинаковая информация в каждый момент времени.

В Unreal Engine для решения этой задачи существует класс GameState, который отвечает за состояние игры. Он синхронизирует и хранит всю необходимую информацию о её текущем состоянии, а также информирует всех игроков, включая сетевые клиенты, о любых изменениях в игре.

Game State представляет собой абстрактный объект, созданный для отслеживания состояния игры. Существуя как на сервере, так и на всех клиентах, этот класс выполняет важную задачу по репликации всей игровой информации между сервером и всеми подключенными клиентами в рамках сетевого многопользовательского режима.

Таблица распределения классов фреймфорка Unreal Engine (UE4, UE5) по тому, где существует объект этого класса. В данном случае Game State существует как на сервере, так и на всех клиентах.
Таблица распределения классов фреймфорка Unreal Engine (UE4, UE5) по тому, где существует объект этого класса. В данном случае Game State существует как на сервере, так и на всех клиентах.

Состояние игры включает в себя данные и логику, касающиеся всех игроков в игре, такие как:

  • результаты команд,
  • цели,
  • список подключённых игроков,
  • оставшееся время текущего раунда,
  • и прочее.

Однако следует отметить, что GameState не является оптимальным решением для хранения информации, специфичной для каждого отдельного игрока. Например, такой как его здоровье или количество очков, набранных игроком за команду. Для этой цели в Анрил Энджин предусмотрен отдельный блюпринт-класс PlayerState, который служит хранилищем данных о состоянии конкретного отдельно взятого игрока.

Как создать Game State Base и его отличие от GameState

В Анрил Энджин существуют 2 вида класса состояния игры:

  • Game State Base
  • Game State

Начиная с версии Unreal Engine 4.14, класс GameState был разделён на два: GameStateBase и GameState.

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.

Создание blueprint класса Game State Base в Unreal Engine (UE4, UE5)
Создание blueprint класса Game State Base в Unreal Engine (UE4, UE5)

Как подключить Game State в Unreal Engine

Чтобы подключить класс состояния игры GameState в Unreal Engine (UE4, UE5), нужен файл GameMode.

Итак, откройте файл GameMode, который используется в Вашем проекте. Перейдите в меню «Class Defaults», далее во вкладку «Details» и в раздел «Classes». В этом разделе найдите настройки «Game State Class» и в выпадающем списке выберите свой класс состояния игры.

Установка пользовательского класса GameState в GameMode
Установка пользовательского класса GameState в GameMode

Если в Вашем проекте файл GameMode отсутствует, его необходимо создать по аналогии с процессом, описанным выше для класса состояния игры. И после подключить Ваш игровой режим в настройках Вашего проекта: «Edit / Project Settings / Maps & Modes / Default GameMode».

Подключение пользовательского класса GameMode
Подключение пользовательского класса GameMode

Inherited variables. Унаследованные переменные в GameState

В Game State имеется список важных унаследованных переменных, которые Вы можете использовать в своей работе в Unreal Engine.

Унаследованные переменные в GameState

  • Game Mode Class — возвращает класс GameMode, который подключен на сервере.
  • Authority Game Mode — возвращает текущий объект базового класса GameModeBase. Работает только на сервере. Если переменная будет вызвана на клиенте, то она возвратит значение NULL.
  • Spectator Class — возвращает Spectator класс, подключённый в GameModeBase.
  • Player Array — переменная, содержащая массив всех доступных на текущий момент PlayerState на сервере и клиентах (массив подключённых к игре игроков). Сам массив возвращает ссылки на объекты базового родительского класса PlayerState.

* Массив «Player Array» мы будем использовать в практическом примере №1 ниже в этой статье.

Как в Unreal Engine получить текущий Game State. Функция Get Game State

Blueprint-функция "Get GameState" в Unreal Engine (UE4, UE5)Функция «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». Таким образом, в этой переменной у нас хранится объект текущего пользовательского класса состояния игры.

Скриншот

Получаем текущий «BP_CustomGameState» с использованием каста «Cast to BP_CustomGameState»
Получаем текущий «BP_CustomGameState» с использованием каста «Cast to BP_CustomGameState»

Код на BlueprintUE

Если код отображается без связей, нажмите сверху кода на кнопку «Graph» Если код отображается без связей, нажмите сверху кода на кнопку "Graph"


Также можно получить доступ к пользовательскому GameState через Blueprint Interface, представляющий собой систему интерфейсов Unreal Engine. Этот вариант более предпочтителен, хотя и немного сложнее. Для этого необходимо создать интерфейсную функцию «Get Custom Game State» и реализовать её в пользовательском классе состояния игры «BP_CustomGameState».

Скриншот

Получаем текущий «BP_CustomGameState» с использованием пользовательского интерфейса «Get Custom Game State»
Получаем текущий «BP_CustomGameState» с использованием пользовательского интерфейса «Get Custom Game State»

Код на BlueprintUE

Если код отображается без связей, нажмите сверху кода на кнопку «Graph» Если код отображается без связей, нажмите сверху кода на кнопку "Graph"


Практика в Unreal Engine №1. Подсчёт общего количества игроков, подключённых к игре. Массив «Player Array».

Задача: при подключении очередного игрока к многопользовательской игре вывести общее количество игроков, подключённых к игре.

Задача в Unreal Engine: вывести общее количество игроков, подключённых к игре.
Задача в Unreal Engine: вывести общее количество игроков, подключённых к игре.
  1. Весь код решения данной задачи мы будем описывать в Event Graph пользовательского класса игрового режима «CustomGameMode». Так как в этом классе имеется событие «Event OnPostLogin», которое вызывается в момент подключения нового игрока к текущей игре. А это именно то, что нам и нужно. Ведь по условию задачи необходимо подсчитать количество игроков именно в момент подключения нового игрока. Итак, весь код мы будем запускать при вызове события «Event OnPostLogin».
  2. В классе Game State, который мы рассматриваем в данной статье, имеется специальный массив «Player Array». Этот массив содержит актуальные объекты Player State, каждый из которых представляет отдельного подключённого игрока. Подсчитав количество элементов в данном массиве, мы сможем определить количество текущих игроков в игре.
  3. Итак, получим доступ к объекту класса Game State через функцию «Get Game State».
  4. Далее, из возвращённого объекта GameState получим массив PlayerState, вызвав функцию «Get Player Array».
  5. Подсчитаем количество элементов в данном массиве функцией «LENGTH».
  6. Ну и на последнем шаге напечатаем на экране функцией «Print String» количество элементов массива. А это будет не что иное, как количество текущих игроков. И благодаря событию «Event OnPostLogin» данный текст будет выводиться на экран только тогда, когда к игре подключится очередной новый игрок.

Скриншот

Практика в Unreal Engine №1. Подсчёт общего количества игроков, подключённых к игре. Массив «Player Array»
Практика в Unreal Engine №1. Подсчёт общего количества игроков, подключённых к игре. Массив «Player Array»

Код на BlueprintUE

Если код отображается без связей, нажмите сверху кода на кнопку «Graph» Если код отображается без связей, нажмите сверху кода на кнопку "Graph"


Практика в Unreal Engine №2. Система отслеживания счета в Game State для нескольких команд многопользовательской игры.

Задача: создать систему, позволяющую отслеживать счёт, сохранять очки и обновлять их для нескольких команд в многопользовательской командной игре.

Согласно условиям задачи, у нас есть несколько команд, и для каждой из них ведётся счёт. Эту информацию необходимо где-то сохранять и обрабатывать. Наиболее подходящим решением для этого является класс Game State (состояние игры), так как счёт каждой команды напрямую отражает текущее состояние игры.

Поэтому далее будем реализовывать код в Event Graph, используя пользовательский класс «CustomGameState».

  1. Поскольку в игре может быть несколько команд, то удобнее всего хранить счет (Score) в массиве. Для этого создадим целочисленный массив «ScoreTeam», где каждый элемент будет представлять собой текущий счет для соответствующей команды. Порядковый номер элемента массива при этом будет соответствовать номеру команды. Таким образом, в массиве «ScoreTeam» текущий счет для команды с номером 0 будет храниться под индексом [0].Массив "ScoreTeam"
  2. Создадим пользовательское событие «Add Score», которое будет активироваться в момент начисления очков конкретной команде. В качестве параметров для этого события определим два целочисленных значения: Number Team (int) — номер команды (0, 1, 2 и так далее)Count Points (int) — количество начисляемых очков.
  3. Затем воспользуемся нодой «Switch Has Authority», чтобы продолжить процесс только через выходной пин «Authority». Таким образом код будет отрабатывать только на сервере. Если же событие инициируется на клиенте, то код выполнен не будет.
  4. При помощи функции «Set Array Elem» внесём новое значение счёта для определённой команды в массив «ScoreTeam». Чтобы это сделать, необходимо передать номер этой команды («Number Team») в качестве параметра Index.
  5. Теперь осталось только вычислить новое значение счёта. Для этого воспользуемся нодой «GET» из массива «ScoreTeam», передав в эту ноду номер команды. Таким образом, нода «GET» возвратит текущий счёт для команды под номером «Number Team».
  6. Далее добавим к текущему счету количество очков, переданное в параметре «Count Points» события «Add Score». Затем отправим полученное новое значение счета для команды «Number Team» в параметр «Item» функции «Set Array Elem». Где она, в свою очередь, перезапишет этот счёт в массиве «ScoreTeam».

Скриншот

Практика в Unreal Engine №2. Система отслеживания счета для нескольких команд в многопользовательской игре.
Практика в Unreal Engine №2. Система отслеживания счета для нескольких команд в многопользовательской игре.

Код на BlueprintUE

Если код отображается без связей, нажмите сверху кода на кнопку «Graph» Если код отображается без связей, нажмите сверху кода на кнопку "Graph"


Таким образом, в классе GameState мы создали систему, которая позволяет отслеживать счёт, сохранять очки и обновлять их для нескольких команд в многопользовательской командной игре.

На этом наша статья завершается. В ней мы обсудили Blueprint-класс, который занимается обработкой информации о текущей игре и её состоянии. А именно GameState, представляющий собой класс состояния игры в Unreal Engine (UE4, UE5). Также рассмотрели небольшие практические примеры для лучшего понимания Вами данного блюпринт класса и того, как с ним работать.

Оцените статью
( 4 оценки, среднее 5 из 5 )
Unreal Engine - это просто
Добавить комментарий

Нажимая на кнопку "Отправить комментарий", я даю согласие на обработку персональных данных и принимаю политику конфиденциальности.