Контроллеры в Unreal Engine (UE4, UE5): Player Controller, AI Controller. Функции Possess, Un Possess и Get Controller

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

Unreal Engine controller

Итак, что же это такое? Unreal Engine controller — это субъект, не представленный «визуально-физически» в игровом мире, но, в то же время, присутствующий там и управляющий игровыми объектами класса Pawn. Или другими дочерними от него классами, например, Character.

Управление объектом возможно только после того, как Controller «овладеет» им либо с помощью специальной Blueprint-функции «Possess», либо же через настройки класса GameMode, либо же через специальные настройки класса самого объекта. Это управление будет продолжаться до тех пор, пока для текущего контроллера не сработает обратная функция «Un Possess» (отказ от управления). Либо же пока он не «овладеет» каким-то другим объектом игрового мира.

Blueprint-функции Possess и Un Possess в Unreal Engine
Blueprint-функции Possess и Un Possess в Unreal Engine

Controller получает уведомления от движка Анрил Энджин о различных событиях, происходящих в игре с Pawn (Character), которыми он управляет. Это позволяет ему реагировать на эти события, перехватывая их и заменяя стандартное поведение управляемого персонажа на другое, заранее определенное разработчиками игры.

По умолчанию у Controller в Unreal Engine может быть только один управляемый персонаж. Это значит, что в каждый момент времени он владеет одним конкретным объектом. Кстати, данное ограничение можно обойти. Но все же создатели игрового движка не рекомендуют это делать и менять их концепцию. Эта же концепция относится и к объекту. В конкретный момент времени у него может быть только один контроллер.

Иерархия классов Controller в Unreal EngineВ UE5 (UE4) применяются два типа Blueprint класса управляющих менеджеров: Player Controller (контроллер игрока) и AI Controller (контроллер искусственного интеллекта). Оба эти класса являются дочерними от базового Controller, который, в свою очередь унаследован от Actor.

Давайте рассмотрим эти классы чуть подробнее.

Player Controller Unreal Engine (UE4, UE5)

Blueprint class PlayerController — это класс-менеджер в Unreal Engine, который обрабатывает ввод данных (Input Action) с клавиатуры, мышки, джойстика от человека-игрока. И на основе этих данных управляет передвижением и поведением персонажа (аватара этого игрока) в игровом мире. Это своеобразный интерфейс между Pawn (Character) и игроком, управляющим этим объектом. По сути, он представляет волю игрока-человека.

При настройке класса PlayerController в блюпринтах следует учитывать, какую функциональность Вы разместите в нем, и какую в классе Pawn (Character).

Идея создателей движка Unreal Engine заключается в том, что Pawn и Player Controller должны работать вместе, дополняя друг друга. Они оба представляют игрока в игре. Pawn — это физический образ персонажа в игровом мире, а Player Controller — его воля. Поэтому, обычно в персонаже (Pawn) описываются его свойства, 3D-модель и анимации, а в контроллере обрабатывается ввод данных (Input Action).

Но несмотря на это, управление персонажем (ввод данных) также можно реализовать и в классе Pawn. Возникает вопрос: зачем тогда нужен PlayerController?

Дело в том, что в игровом мире объекты классов Pawn и Character могут меняться. Например, сначала игрок управляет персонажем (класс Character), который является главным героем. Затем персонаж садится в машину, и игрок начинает управлять объектом класса Pawn — машиной. После этого игрок может переключиться на управление другим персонажем, например, другом того, кто сел в машину. Этот персонаж также будет относиться к классу Character, но уже другому, для второго персонажа.

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

На помощь приходит класс PlayerController в Unreal Engine. Если описать всю логику управления персонажами именно в нём, то не придётся повторять код в разных классах. Когда игрок меняет своего игрового персонажа, нужно лишь переназначить управление у контроллера на другие объекты с помощью Blueprint-функций «Possess» и «Un Possess».

Чтобы в Unreal Engine у контроллера произвести смену управляемого персонажа через Blueprint, используйте в Event Graph этого контроллера ноду «Possess» (овладеть). Во входном параметре которой In Pawn») присоедините ссылку на новый объект персонажа.

Также нужно знать, что Player Controller — это один из основных компонентов сетевого взаимодействия в многопользовательских играх движка Unreal Engine. Когда в игре участвуют несколько игроков, на сервере создаётся отдельный экземпляр контроллера для каждого из них. Это необходимо для того, чтобы он мог выполнять сетевые функции, связанные с каждым игроком. При этом каждый сетевой клиент получает свой собственный игровой контроллер, который предназначен только для него. Он может использовать его для связи с сервером и взаимодействия с другими игроками.

Настройки Details для PlayerController (class Defaults)

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

Настройки Player Controller в меню Details в Unreal Engine
Настройки Player Controller в меню Details в Unreal Engine

Player Controller:

  • Player Camera Manager Class (по умолчанию значение None, при этом используется стандартный класс Engine.PlayerCameraManager). Определяет, какой класс CameraManager будет создан при инициализации Player Controller. Позволяет выбрать свой пользовательский класс Player Camera.
  • Auto Manage Active Camera Target (bool, по умолчанию = True). Автоматический выбор цели для активной камеры. True — разрешить контроллеру управлять целью камеры (обычно это подконтрольный Pawn). False — ручной пользовательский выбор цели для камеры.
  • Smooth Target View Rotation Speed (float, по умолчанию = 20). Скорость плавного вращения прицела.
  • Should Perform Full Tick when Paused (bool, по умолчанию = False). Исполнять ли функцию Tick, когда игра поставлена на паузу.

Cheat Manager:

  • Cheat Class (по умолчанию используется стандартный класс CheatManager). Позволяет выбрать свой пользовательский класс менеджера читов. Cheat Manager выполняет тестирование и отладку кода в Unreal Engine, а также другие необходимые действия, не включаемые в итоговую сборку игры.

Mouse Interface:

  • Show Mouse Cursor (bool, по умолчанию = False). Отображать курсор мыши или нет.
  • Enable Click Events (bool, по умолчанию = False). Генерировать или нет события клика по актору/компоненту.
  • Enable Touch Events (bool, по умолчанию = True). Генерировать или нет события касания по актору/компоненту.
  • Enable Mouse Over Events (bool, по умолчанию = False). Генерировать или нет события наведения курсора мыши на актор/компонент.
  • Enable Touch Over Events (bool, по умолчанию = False). Генерировать или нет события касания с наведением на актор/компонент.
  • Click Event Keys (по умолчанию неактивный, активируется при Enable Click Events = True). Список клавиш для обработки события (по умолчанию левая кнопка мыши).
  • Default Mouse Cursor (по умолчанию Default). Тип курсора мыши.
  • Default Click Trace Channel (по умолчанию Visibility). Канал трассировки по умолчанию, используемый для определения нажатого объекта. Для выбора предлагаются стандартные каналы трассировки (World Static, World Dynamic, Pawn, Visibility, Camera, Physics Body, Vehicle, Destructible).
  • Trace Distance (float, по умолчанию = 100000). Расстояние для трассировки при вычислении событий нажатия.

Game / Feedback:

  • Force Feedback Enabled (bool, по умолчанию = True). Включить принудительную обратную связь.

Controller / Transform:

  • Attach to Pawn (bool, по умолчанию = False). Прикрепить Player Controller к Pawn. True — местоположение контроллера будет соответствовать местоположению подконтрольного ему Pawn. False — местоположение обновляться не будет. При этом, в любом случае, вращение (rotation) будет соответствовать значениям настроек Control Rotation.

Как получить Player Controller персонажа в UE5. Функция Get Player Controller

Функция Get Player Controller в Unreal Engine (UE4, UE5)

Получить контроллер игрока для персонажа мы можем при помощи Blueprint-функции «Get Player Controller».

В Unreal Engine функция «Get Player Controller» возвращает ссылку на объект базового родительского класса PlayerController для указанного игрока. Поскольку игроков может быть несколько, то функция производит поиск как среди локальных, так и среди доступных удаленных игроков. Если функция отрабатывает на сетевом клиенте, то поиск осуществляется только локально.

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

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

  • Player Index (Int, по умолчанию 0) — индекс в списке контроллеров игрока (сначала идут локальные, а затем доступные удаленные).

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

Ниже представлен Blueprint-код, в котором с помощью ноды «Get Player Controller» мы получаем ссылку на объект базового контроллера игрока. Затем, используя функцию приведения типов «Cast to BP_MyPlayerController», преобразуем эту ссылку в наш пользовательский объект «BP_MyPlayerController». И сохраняем его в переменной «As BP My Player Controller». Таким образом, в этой переменной мы получили объект контроллера игрока для текущего персонажа в UE5 (UE4).

Функция «Get PlayerController»: получаем текущий «BP_MyPlayerController» с использованием каста «Cast to BP_MyPlayerController»
Функция «Get PlayerController»: получаем текущий «BP_MyPlayerController» с использованием каста «Cast to BP_MyPlayerController»

Также есть возможность получить пользовательский PlayerController через Blueprint Interface (интерфейсы Unreal Engine). Этот вариант предпочтительнее, но немного сложнее. В этом случае необходимо дополнительно создать свой интерфейс «Get Custom PlayerController» и реализовать его в пользовательском классе контроллера игрока «BP_CustomPlayerController».

Функция «Get PlayerController»: получаем текущий «BP_MyPlayerController» с использованием пользовательского интерфейса «Get Custom PlayerController»
Функция «Get PlayerController»: получаем текущий «BP_MyPlayerController» с использованием пользовательского интерфейса «Get Custom PlayerController»

Смена персонажа у PlayerController через Blueprint. Функции Possess и Un Possess

Blueprint-функции Possess и Un Possess в Unreal Engine
Blueprint-функции Possess и Un Possess в Unreal Engine

Чтобы произвести в Unreal Engine смену персонажа у контроллера через код Blueprints нужно использовать ноды «Possess» и «Un Possess».

Blueprint-функция «Possess» присоединяет PlayerController к указанному во входных параметрах новому Pawn (Character). Она запускается только на сервере (если функция HasAuthority() возвращает значение True). При смене контроллером находящегося во владении Pawn, оба Pawn’а получают соответствующие уведомления о произошедшей смене. А именно, у них вызываются события «Event Possessed» и «Event Unpossessed».

Blueprint-функция «Un Possess» отсоединяет указанный PlayerController от управляемого им Pawn.

Входящие значения:

  • Target (ссылка на объект контроллера, по умолчанию self) — в этом параметре нужно указать PlayerController, для которого функция «Possess» будет устанавливать контроль над новым Pawn. А «Un Possess» — отсоединять контролируемый Pawn.
  • In Pawn (ссылка на объект Pawn) — в этом параметре нужно указать новый Pawn, которым будет управлять контроллер.

Ниже представлен Blueprint-код, в котором при помощи ноды «Possess» мы у PlayerController меняем управляемых персонажей. Сами персонажи представлены в игровом мире двумя объектами одного и того же класса «BP_ThirdPersonCharacter».

Смена персонажей вызывается в EventGraph контроллера игрока по нажатию на клавиатуре клавиши «C». Далее нодой «Get Player Character» мы получаем текущего персонажа класса Character. При помощи каста приводим тип Character к нашему пользовательскому классу «BP_ThirdPersonCharacter». Далее удаляем этот объект из массива акторов класса «BP_ThirdPersonCharacter», который предварительно вернула нода «Get All Actor Of Class».

Поскольку мы удалили из массива текущий Pawn, которым владеет PlayerController, то теперь в этом массиве можно свободно выбрать Pawn под номером 0. И, используя функцию «Possess», прикрепить его к PlayerController, тем самым меняя его владение.

Пример Blueprint-кода «Смена персонажа у PlayerController при помощи функции Possess»
Пример Blueprint-кода «Смена персонажа у PlayerController при помощи функции Possess»

AI Controller Unreal Engine (UE4, UE5)

Blueprint class AIController в UE5 (UE4) — это базовый класс-менеджер для Pawn, если разработчиком не подключен иной. Он управляет неигровыми персонажами (NPC) с помощью искусственного интеллекта (ИИ). Задача AI Controller — следить за тем, что происходит вокруг и реагировать на данные, поступающие из игрового мира. В итоге, принимая решения на основе ИИ, управлять NPC без непосредственного участия игрока.

Все реакции искусственного интеллекта на события в игровом мире при этом, естественно, заранее настраиваются разработчиками при помощи специальных AI-инструментов в Unreal Engine:

  • Behavior Tree (дерево поведения ИИ);
  • Pawn Sensing (глаза и слух ИИ);
  • Nav Mesh Bounds Volume (навигация ИИ).

В сетевых играх, в отличии от Player Controller, для безопасности данных AIController существует только на серверах.

Настройки Details для AIController (class Defaults)

В меню Details содержатся как унаследованные параметры от класса Actor, так и настройки, характерные для разбираемого класса AIController. Параметры для Actor мы уже разбирали в соответствующей статье про класс акторов. Сейчас же сконцентрируемся только на настройках AI контроллера в Анрил Энджин.

Настройки AI Controller в меню Details в Unreal Engine
Настройки AI Controller в меню Details в Unreal Engine

AI:

  • Start AILogic on Possess (bool, по умолчанию = False). Запуск логики ИИ, когда Pawn находится под управлением AI Controller. True — логика ИИ запускается сразу. False (по умолчанию) — логика ИИ остается не запущенной.
  • Stop AILogic on Unposses (bool, по умолчанию = True). Остановка логики ИИ, когда AI Controller перестал управлять Pawn. True (по умолчанию) — логика ИИ останавливается сразу. False — логика ИИ не останавливается и продолжает действовать.
  • Skip Extra LOSChecks (bool, по умолчанию = True). Игнорировать дополнительные проверки трассировки линии видимости (до крайних точек проверяемой цели).
  • Allow Strafe (bool, по умолчанию = False). Разрешить стрейфинг. В видеоиграх стрейф — это движение, при котором персонаж или объект перемещаются вбок относительно направления движения.
  • Wants Player State (bool, по умолчанию = False). Указывает, использует ли данный ИИ собственный класс PlayerState.
  • Set control Rotation from Pawn Orientation (bool, по умолчанию = True). При отсутствии фокусировки установить поворот (Control Rotation) в зависимости от ориентации Pawn.
  • Default Navigation Filter Class (по умолчанию None). Выбор класса фильтра навигации.

Component Tick:

  • Start with Tick Enabled (bool, по умолчанию = True). Начать работу контроллера с включенным событием Event Tick (Tick также можно включить/выключить позже из кода Blueprint).
  • Tick Interval (float, по умолчанию 0,0 сек). Частота срабатывания Event Tick (в секундах). Если значение отрицательное или равно 0, то Tick срабатывает каждый кадр.

Component Tick / Advanced:

  • Tick Even when Paused (bool, по умолчанию = False). Включить срабатывание Event Tick, когда игра стоит на паузе.
  • Allow Tick on Dedicated Server (bool, по умолчанию = True). Разрешить работу Event Tick на выделенном сервере.
  • Tick Group (по умолчанию During Physics). Определяет группу порядка срабатывания Tick при обновлении кадра. Возможные варианты групп: Pre Physics (перед симуляцией физики), During Physics (во время симуляции физики), Post Physics (после симуляции физики), Post Update Work (после работы).

Tags:

  • Component Tags. Массив тэгов для группировки и категоризации в Unreal Engine. Доступ к ним также можно получить из кода Blueprint.

Component Replication:

  • Component Replication (bool, по умолчанию = False). Включить репликацию в мультиплеерных играх.

Activation:

  • Auto Activate (bool, по умолчанию = True). Включить автоматическую активацию контроллера.

Variable:

  • Editable when Inherited (bool, по умолчанию = True). Включить возможность редактирования при наследовании.

Controller / Transform:

  • Attach to Pawn (bool, по умолчанию = False). Прикрепить контроллер к Pawn. True — местоположение контроллера будет соответствовать местоположению подконтрольного ему Pawn. False — местоположение обновляться не будет. При этом, в любом случае, вращение (rotation) будет соответствовать значениям настроек Control Rotation.

Asset User Data / Advanced:

  • Asset User Data. Массив пользовательских данных.
  • Asset User Data Editor Only. Массив пользовательских данных, используемых только в редакторе.

Navigation / Advanced:

  • Can Ever Affect Navigation (bool, по умолчанию = False). Включить возможность изменять навигацию.

Как получить AI Controller у Pawn (Character). Функция Get AI Controller

Blueprint-функция "Get AIController" в Unreal EngineBlueprint-функция «Get AIController» позволяет получить в Анрил Энджин AIController, который управляет Pawn (Character).

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

  • Controlled Actor — ссылка на объект класса Actor.

Если Actor, поданный во входящие параметры функции, принадлежит к классу Pawn (Character), то «Get AIController» возвращает ссылку на объект базового родительского класса AIController, который управляет Pawn’ом. Соответственно, необходимо данную ссылку при помощи Cast (каста) привести к типу пользовательского класса AI контроллера, чтобы получить доступ ко всем его функциям и переменным.

Ниже представлен Blueprint-код, в котором с помощью ноды «Get AIController» мы получаем ссылку на объект базового родительского класса AI контроллера для актора, который пересек коллизию игрока. Затем, используя функцию приведения типов «Cast to BP_CustomAIController», преобразуем эту ссылку в наш пользовательский объект «BP_CustomAIController». И далее сохраняем его в переменной «As BP_CustomAIController». Таким образом, в этой переменной мы получили пользовательский AI контроллер объекта, который пересекся с игроком.

Функция «Get AIController»: получаем текущий «BP_CustomAIController» с использованием каста «Cast to BP_CustomAIController»
Функция «Get AIController»: получаем текущий «BP_CustomAIController» с использованием каста «Cast to BP_CustomAIController»

Также есть возможность получить пользовательский AIController через Blueprint Interface (интерфейсы Unreal Engine). Этот вариант предпочтительнее, но немного сложнее. В этом случае необходимо дополнительно создать свой интерфейс «Get Custom AIController» и реализовать его в пользовательском классе AI контроллера «BP_CustomAIController».

Функция «Get AIController»: получаем текущий «BP_CustomAIController» с использованием интерфейса «Get Custom AIController»
Функция «Get AIController»: получаем текущий «BP_CustomAIController» с использованием интерфейса «Get Custom AIController»

Создание и подключение контроллеров

Создать собственные классы контроллеров достаточно легко. Для этого нужно в «Content Drawer» вызвать контекстное меню через правую клавишу мышки и перейти в пункт «Blueprint Class». Далее в окне «Pick Parent Class» выбрать класс Player Controller или в поиске найти AI Controller.

Для создания классов контроллеров откройте окно «Pick Parent Class».
Для создания классов контроллеров откройте окно «Pick Parent Class».

Но важный вопрос на самом деле не в том, как создать классы контроллеров, а в том, как их подключить к объектам Pawn и Character.

Как подключить или сменить Player Controller персонажа

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

Итак, откройте файл GameMode, который используется в Вашем проекте. Перейдите в меню «Class Defaults», далее во вкладку «Details» и в раздел «Classes». В этом разделе найдите настройки «Player Controller Class» и в выпадающем списке выберите свой класс контроллера. Таким образом можно получить Player Controller для персонажа в UE5 (UE4).

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

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

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

Как подключить свой класс AI Controller

AI Controller можно назначить абсолютно для любого объекта класса Pawn или Character. Причем для каждого объекта можно подключить контроллер именно его личный, с настройками ИИ под этот конкретный объект. Поэтому подключение этого контроллера производится в каждом отдельном блюпринте. А именно, в настройках «Class Defaults / Details / Pawn / AI Controller Class»:

Подключение AI Controller к Pawn
Подключение AI Controller к Pawn

Будьте внимательны! По умолчанию AI Controller автоматически овладевает объектом только при ручном размещении этого объекта в игровом мире.

Если объект спавнить (Spawn) через Blueprint, то авто овладевания не будет. Чтобы это изменить, нужно в тех же настройках, только пунктом выше, а именно в «Auto Possess AI», заменить значение на «Placed in World or Spawned».

На этом наша статья заканчивается. Мы рассмотрели контроллеры в Unreal Engine, а именно Player Controller и AI Controller. Узнали, как они работают, ознакомились с их настройками класса по умолчанию. А также обсудили как создать их и подключить к управляемым объектам.

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

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