Player State: класс состояния игрока в Unreal Engine. Функция Get PlayerState

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

Unreal Engine Player State

В игровом движке Анрил Энджин (UE4 и UE5) класс Player State представляет собой состояние конкретного игрока, которым может быть как человек-игрок, так и игровой бот.

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

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

Также важно отметить, что в многопользовательских играх PlayerState всех игроков хранится на всех клиентах и может быть синхронизирован с помощью механизма репликации данных с сервера на клиент. Это отличается от PlayerController, который существует только на компьютере конкретного игрока. Проще говоря, PlayerController находится на сервере и только на клиенте конкретного сетевого игрока, тогда как PlayerState конкретного игрока хранится как на его собственном клиенте, так и синхронизируется на других клиентских компьютерах в сети.

Вообще в Player State можно хранить следующего вида информацию, которая будет видна абсолютна всем:

  • счет игрока,
  • его имя,
  • здоровье,
  • количество боеприпасов,
  • инвентарь,
  • и прочее.

Unreal Engine Player State - встроенные по умолчанию свойстваТакже в данном классе уже по умолчанию определены несколько системных свойств, доступных нам из любого места кода для получения специфичных сетевых характеристик игрока:

  • Score (счет),
  • PlayerID (уникальный идентификатор игрока в сети),
  • Compressed Ping (пинг игрока в сети),
  • Is Spectator (является ли зрителем),
  • Is A Bot (является ли ботом),
  • Pawn Private (Pawn/Character к которому относится текущий Player State).

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

Как получить текущий Player State в Unreal Engine (UE4, UE5)

Функция Get Player State

Unreal Engine функция Get Player StateФункция «Get Player State» позволяет из любого Blueprint-класса в Unreal Engine (UE4, UE5) получить текущий класс состояния игрока.

Данныя функция возвращает ссылку на объект базового родительского класса PlayerState по заданному индексу в PlayerArray в классе GameState (состояние игры). Работает как на клиенте, так и на сервере. При этом индекс остаётся неизменным.

Входящее параметры:

  • Player State Index (int, по умолчанию 0) — индекс PlayerState в PlayerArray (массив игроков, доступный в классе GameState).

Player State Object Reference

Player State Object Reference«Player State Object Reference» — переменная, возвращающая ссылку на объект базового родительского класса PlayerState. Доступна только в классах Pawn (Character) и PlayerController.

Если данная переменная вызывается в Pawn, то она возвращает ссылку на объект PlayerState только тогда, когда этот Pawn находится под контролем PlayerController. Применяется для сетевой игры, поскольку контроллеры не реплицируются на удалённых клиентов.

Если переменная вызывается в PlayerController, то она возвращает ссылку на объект PlayerState, содержащий реплицированную информацию об игроке, использующем данный контроллер (доступно только для игроков, не для NPC).

Player Array

Массив PlayerArray в Unreal Engine«Player Array» — переменная, содержащая массив всех доступных в текущий момент PlayerState на сервере и клиентах. Сам массив возвращает ссылки на объекты базового родительского класса PlayerState.

Player Array вызывается только из класса GameState.

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

Практический пример 1: получаем пользовательский класс PlayerState

Так как ноды «Get Player State» и «Player State Object Reference» возвращают ссылку на объект именно базового родительского класса движка Unreal Engine, необходимо данную ссылку при помощи Cast (каста) привести к типу Вашего пользовательского класса состояния игрока, чтобы получить доступ ко всем его функциям и переменным.

Рассмотрим пример приведения типов с использованием функции «Get PlayerState».

В приведенном ниже коде на языке Blueprint мы используем ноду «Get Player State», чтобы получить ссылку на объект базового класса состояния игрока. Затем, с помощью функции приведения типов «Cast to BP_CustomPlayerState», преобразуем эту ссылку в наш пользовательский объект «BP_CustomPlayerState». И после сохраняем его в переменной «As BP Custom Player State».

Получаем текущий пользовательский объект состояния игрока «BP_CustomPlayerState» с использованием каста «Cast to BP_CustomPlayerState»
Получаем текущий пользовательский объект состояния игрока «BP_CustomPlayerState» с использованием каста «Cast to BP_CustomPlayerState»

Также можно получить доступ к пользовательскому PlayerState через Blueprint Interface. Этот вариант более предпочтителен, хотя несколько сложнее. Для этого необходимо создать новый интерфейс «Get Custom Player State» и реализовать его в пользовательском классе состояния игры «BP_CustomPlayerState».

Получаем текущий пользовательский объект состояния игрока «BP_CustomPlayerState» с использованием пользовательского интерфейса «Get Custom Player State»
Получаем текущий пользовательский объект состояния игрока «BP_CustomPlayerState» с использованием пользовательского интерфейса «Get Custom Player State»

Практический пример 2: получаем список ID всех сетевых игроков

В данном практическом примере мы используем 2 ноды, связанные с рассматриваемым в данной статье классом Player State в Unreal Engine. А именно, ноду «Player Array», с помощью которой мы получим список всех PlayerState, доступных в текущей сетевой игре. И ноду «Get Player ID», возвращающую идентификационный номер игрока.

Задача: в сетевой игре, нажав на клавиатуре клавишу «C», игрок должен получить список всех идентификаторов игроков, которые в данный момент находятся в игре.

Задача в Unreal Engine: получить список ID всех сетевых игроков
Задача в Unreal Engine: получить список ID всех сетевых игроков

Итак, Blueprint-код решения данной задачи я буду прописывать в Event Graph в персонаже «BP_ThirdPersonCharacter».

Чтобы код выполнялся исключительно на сервере, создадим Custom Event (пользовательское событие) «Get ALL Player ID». И в настройках «Details» этого события укажем, что оно должно запускаться только на сервере. То есть для свойства Replicates укажем значение «Run on Server».

Событие «Get ALL Player ID»: свойство Replicates выставляем на «Run on Server»
Событие «Get ALL Player ID»: свойство Replicates выставляем на «Run on Server»

После чего запустим это событие по нажатию на клавишу «C».

Запускаем пользовательское событие «Get All Player Id» по нажатию на клавишу «C»
Запускаем пользовательское событие «Get All Player Id» по нажатию на клавишу «C»

Далее опишем функциональность нашего пользовательского события «Get ALL Player ID».

Итак, с помощью ноды «Get Game State» мы получим доступ к базовому классу GameState. В этом классе мы сможем вызвать переменную «Player Array». Она вернёт нам массив всех состояний игроков, присутствующих на сервере и клиентах. Чтобы получить доступ к конкретному состоянию игрока, мы можем перебрать весь массив с помощью цикла «For Each Loop». На выходе «Array Element» у этого цикла мы получим ссылку на объект состояния конкретного игрока.

В статье выше я писал, что в классе PlayerState разработчиками Unreal Engine уже определены ряд свойств, характеризующих сетевых игроков. Среди них есть необходимое нам свойство «Player ID». Чтобы получить доступ к этому значению, мы можем вызвать метод «Get Player ID» из объекта PlayerState, который возвращает цикл. Затем нам остаётся лишь вывести полученный ID игрока с помощью ноды «Print String».

Практический пример на Unreal Engine: получаем список ID всех сетевых игроков. Функции «Get Game State», «Player Array» и «Get Player ID»
Практический пример на Unreal Engine: получаем список ID всех сетевых игроков. Функции «Get Game State», «Player Array» и «Get Player ID»

Таким образом, перебрав в цикле «For Each Loop» все доступные в массиве объекты PlayerState, мы на каждом повторе цикла по каждому этому объекту выводим его ID на экран ПК.

Как создать и подключить PlayerState в Unreal Engine

Чтобы создать свой собственный пользовательский класс состояния игрока, откройте Content Browser и щелкните правой кнопкой мыши по пустому полю. В появившемся контекстном меню выберите пункт «Blueprint Class». Затем в открывшемся окне «Pick Parent Class» введите в поисковую строку «Player State». Далее выделите класс «PlayerState» и нажмите «Select». В результате в текущей папке Content Browser будет создан ассет базового класса состояния игрока.

Создание пользовательского blueprint класса Player State в Unreal Engine (UE4, UE5)
Создание пользовательского blueprint класса Player State в Unreal Engine (UE4, UE5)

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

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

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

На этом наша статья заканчивается. В статье мы рассмотрели PlayerState — класс состояния игрока в Unreal Engine (UE4, UE5). А также блюпринт-ноды «Get Player State», «Player State Object Reference» и «Player Array», которые позволяют в том или ином месте кода получить текущий класс состояния игрока.

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

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