- Unreal Engine Player State
- Как получить текущий Player State в Unreal Engine (UE4, UE5)
- Функция Get Player State
- Player State Object Reference
- Player Array
- Практика в Unreal Engine № 1: получаем пользовательский класс Player State
- Практика в Unreal Engine № 2: получаем список ID всех сетевых игроков
- Override functions. Переопределение событий в Player State
- Практика в Unreal Engine № 3. Копирование информации из старого Player State в новый при переходе на другой уровень. События «Event Copy Properties» и «Event Override With»
- Как создать и подключить PlayerState в Unreal Engine
Друзья, приветствую, с Вами Будуев Антон. В данной статье мы обсудим Blueprint-класс Player State, отвечающий в движке Unreal Engine (UE4, UE5) за хранение информации о состоянии конкретного отдельно взятого игрока.
Обсудим, для чего предназначен данный класс, настройки, как его создать и подключить к своему проекту. А также, займёмся практическим применением класса состояния игрока в Анрил Энджин. А именно, выведем список ID всех сетевых игроков и произведём копирование информации из старого Player State в новый при бесшовном переходе игрока с уровня на уровень или при его переподключении.
В целом же, в данной статье на практике мы будем работать со следующими функциями и событиями, которые так или иначе связаны с Player State в Unreal Engine: «Get PlayerState», «Player Array», «Get Player ID», «Event Copy Properties», «Event Override With» и другими вспомогательными функциями.
Unreal Engine Player State
В игровом движке Анрил Энджин (UE4 и UE5) класс Player State представляет собой состояние конкретного игрока, которым может быть как человек-игрок, так и игровой бот.
Хотя этот класс можно использовать и в однопользовательских играх, но в основном он предназначен для мультиплеерных проектов. Это специальный блюпринт-класс, хранящий всю важную информацию об игроке, доступную не только ему самому, но и другим сетевым клиентам, участвующим в многопользовательской игре.
Как и в случае с классом GameState, класс PlayerState доступен для всех сетевых клиентов, что значительно упрощает процесс обмена информацией между ними. Например, Вы можете использовать этот класс для отображения информации на общем табло с результатами игры.
Также важно отметить, что в многопользовательских играх PlayerState всех игроков хранится на всех клиентах и может быть синхронизирован с помощью механизма репликации данных с сервера на клиент. Это отличается от PlayerController, который существует только на компьютере конкретного игрока. Проще говоря, PlayerController находится на сервере и только на клиенте конкретного сетевого игрока, тогда как PlayerState конкретного игрока хранится как на его собственном клиенте, так и синхронизируется на других клиентских компьютерах в сети.
Вообще в 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
Функция «Get Player State» позволяет из любого Blueprint-класса в Unreal Engine (UE4, UE5) получить текущий класс состояния игрока.
Данныя функция возвращает ссылку на объект базового родительского класса PlayerState. Работает как на клиенте, так и на сервере. При этом индекс остаётся неизменным.
Входящее параметры:
- Player State Index (int, по умолчанию 0) — индекс PlayerState в PlayerArray (массив игроков, доступный в классе GameState).
Player State Object Reference
«Player State Object Reference» — переменная, возвращающая ссылку на объект базового родительского класса PlayerState. Доступна только в классах Pawn (Character) и PlayerController.
Если данная переменная вызывается в Pawn, то она возвращает ссылку на объект PlayerState только тогда, когда этот Pawn находится под контролем PlayerController. Применяется для сетевой игры, поскольку контроллеры не реплицируются на удалённых клиентов.
Если переменная вызывается в PlayerController, то она возвращает ссылку на объект PlayerState, содержащий реплицированную информацию об игроке, использующем данный контроллер (доступно только для игроков, не для NPC).
Player Array
«Player Array» — переменная, содержащая массив всех доступных в текущий момент PlayerState на сервере и клиентах. Сам массив возвращает ссылки на объекты базового родительского класса PlayerState.
Player Array вызывается только из класса GameState.
* Массив «Player Array» мы будем использовать в практическом примере №2 ниже в этой статье.
Практика в Unreal Engine № 1: получаем пользовательский класс Player State
Так как ноды «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».
Скриншот
Код на BlueprintUE
Также можно получить доступ к пользовательскому PlayerState через Blueprint Interface. Этот вариант более предпочтителен, хотя несколько сложнее. Для этого необходимо создать интерфейсную функцию «Get Custom Player State» и реализовать её в пользовательском классе состояния игры «BP_CustomPlayerState».
Скриншот
Код на BlueprintUE
Практика в Unreal Engine № 2: получаем список ID всех сетевых игроков
В данном практическом примере мы используем 2 ноды, связанные с рассматриваемым в данной статье классом Player State в Unreal Engine. А именно, ноду «Player Array», с помощью которой мы получим список всех PlayerState, доступных в текущей сетевой игре. И ноду «Get Player ID», возвращающую идентификационный номер игрока.
Задача: в сетевой игре, нажав на клавиатуре клавишу «C», игрок должен получить список всех идентификаторов игроков, которые в данный момент находятся в игре.
Итак, Blueprint-код решения данной задачи я буду прописывать в Event Graph в персонаже «BP_ThirdPersonCharacter».
Чтобы код выполнялся исключительно на сервере, создадим Custom Event (пользовательское событие) «Get ALL Player ID». И в настройках «Details» этого события укажем, что оно должно запускаться только на сервере. То есть для свойства Replicates укажем значение «Run on Server».
После чего запустим это событие по нажатию на клавишу «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».
Скриншот
Код на BlueprintUE
Таким образом, перебрав в цикле «For Each Loop» все доступные в массиве объекты PlayerState, мы на каждом повторе цикла по каждому этому объекту выводим его ID на экран ПК.
Override functions. Переопределение событий в Player State
Класс Player State в Unreal Engine также используется для сохранения данных во время бесшовных переходов с уровня на уровень (Seamless travel) или непредвиденных проблем с подключением. Достигается это путём копирования информации из старого объекта PlayerState в новый при помощи двух переопределяемых событий:
- Event Copy Properties
Переопределяемое событие «Event Copy Properties» используется для копирования свойств из старого состояния игрока в новое при бесшовном переходе с уровня на уровень (при Seamless travel). Вызывается в старом PlayerState.
Входящие параметры:
New Player State — новый объект состояния игрока, куда необходимо скопировать информацию.
- Event Override With
Переопределяемое событие «Event Override With» используется для копирования свойств из старого состояния игрока в новое при повторном подключении игрока. Вызывается в новом PlayerState.
Входящие параметры:
Old Player State — старый объект состояния игрока, откуда необходимо скопировать информацию.
Практика в Unreal Engine № 3. Копирование информации из старого Player State в новый при переходе на другой уровень. События «Event Copy Properties» и «Event Override With»
Для примера рассмотрим блюпринт-код копирования информации переменной «Count Score» из старого объекта Player State в новый при переходе на другой игровой уровень. Данный код будет находится в Event Graph в пользовательском классе «BP_ CustomPlayerState».
1. «Event Copy Properties»
1.1. Итак, для копирования информации при бесшовном переходе с уровня на уровень, воспользуемся переопределением события «Event Copy Properties». При вызове данного события во выходном пине возвратится объект нового Player State из нового уровня. Само же событие будет вызвано еще в старом Player State до перехода на следующий уровень.
1.2. Далее, так как мы переопределяем это событие, чтобы воспользоваться всем его функционалом из родительского класса, подсоединим ноду «Parent: CopyProperties», вызвав её через правую клавишу мыши, кликнув по «Event Copy Properties».
1.3. Затем с помощью каста преобразуем возвращаемый параметр «New Player State» из «Event Copy Properties» в объект пользовательского класса «BP_CustomPlayerState», который вернёт нам новый пользовательский объект PlayerState. Далее в нём с помощью функции SET установим значение переменной «Count Score», передав туда значение «Count Score» из текущего (старого) PlayerState.
2. «Event Override With»
2.1. Для копирования информации при повторном подключении игрока воспользуемся переопределением события «Event Override With». При вызове данного события во выходном пине возвратится объект старого Player State из предыдущего уровня. Само же событие будет вызвано уже в новом Player State уже после повторного подключения игрока.
2.2. Далее, по аналогии с предыдущим 1 пунктом, подключим к событию ноду «Parent: Override With».
2.3. Затем с помощью каста преобразуем возвращаемый параметр «Old Player State» из «Event Override With» в объект пользовательского класса «BP_CustomPlayerState», который вернёт нам старый пользовательский объект PlayerState. Далее из него с помощью функции GET извлечём значение переменной «Count Score». И наконец, передадим это значение в «Count Score» текущего (нового) PlayerState.
Скриншот
Код на BlueprintUE
Как создать и подключить PlayerState в Unreal Engine
Чтобы создать свой собственный пользовательский класс состояния игрока, откройте Content Browser и щелкните правой кнопкой мыши по пустому полю. В появившемся контекстном меню выберите пункт «Blueprint Class». Затем в открывшемся окне «Pick Parent Class» введите в поисковую строку «Player State». Далее выделите класс «PlayerState» и нажмите «Select». В результате в текущей папке Content Browser будет создан ассет базового класса состояния игрока.
Чтобы подключить класс состояния игрока PlayerState в Unreal Engine (UE4, UE5), нужен файл GameMode.
Итак, откройте файл GameMode, который используется в Вашем проекте. Перейдите в меню «Class Defaults», далее во вкладку «Details» и в раздел «Classes». В этом разделе найдите настройки «Player State Class». И в выпадающем списке выберите свой класс состояния игрока.
На этом наша статья заканчивается. В статье мы рассмотрели PlayerState — класс состояния игрока в Unreal Engine (UE4, UE5). А также блюпринт-ноды «Get Player State», «Player State Object Reference» и «Player Array», которые позволяют в том или ином месте кода получить текущее состояния игрока. Ну и отработали взаимодействие с этим классом на нескольких практических примерах.