- AI Controller Unreal Engine (UE4, UE5)
- Как создать и подключить свой класс AI Controller
- Настройки Details для AIController (class Defaults)
- Как получить AI Controller у Pawn (Character). Функция Get AI Controller
- Практика в Unreal Engine. Разрабатываем базовый функционал AI Controller для передвижения NPC
- Автоследование NPC за игроком
- Система патрулирования территории для NPC
Друзья, приветствую, с Вами Будуев Антон. В данной статье мы поговорим о контроллере искусственного интеллекта (ИИ) в движке Unreal Engine (UE4, UE5), а именно, о классе AI Controller.
Обсудим, для чего предназначен данный класс, настройки, как его создать и подключить к подконтрольному Pawn. И, наконец, займёмся практическим применением контроллера ИИ в Анрил Энджин. А именно, создадим базовую систему ИИ для автоследования NPC за игроком, а также систему ИИ для патрулирования территории NPC.
В целом же, в данной статье на практике мы будем работать со следующими функциями и событиями, которые так или иначе связаны с AI Controller в Unreal Engine: «Get AI Controller», «Get Controlled Pawn», «Event On Possess», «AI Move To», «Get Random Reachable Point in Radius» и другими вспомогательными функциями.
AI Controller Unreal Engine (UE4, UE5)
В большинстве игр, помимо персонажа, которым управляет игрок, есть и так называемые «боты» или NPC (Non-Player Characters). Это могут быть как враги, так и напарники, а также персонажи, добавленные на уровень для создания массовки или атмосферы. NPC — это неигровые персонажи, управляемые компьютером на основе заранее заданного искусственного интеллекта. Для управления этим интеллектом в Unreal Engine существует специальный класс — AI Controller (Artificial Intelligence Controller).
Итак, Blueprint class AIController в Анрил Энджин — это базовый класс-менеджер для объектов Pawn (Character), если разработчиком не подключен иной. Он управляет неигровыми персонажами (NPC) с помощью искусственного интеллекта (ИИ).
Задача AI Controller — следить за тем, что происходит вокруг и реагировать на данные, поступающие из игрового мира. В итоге, принимая решения на основе ИИ, управлять NPC без непосредственного участия игрока.
Конечно, все реакции искусственного интеллекта на события в игровом мире программируются заранее. Если логика действий простая, её можно описать на языке C++ или с помощью блюпринтов. Для создания более сложных систем искусственного интеллекта в Unreal Engine предусмотрены специальные AI-инструменты:
- Behavior Tree (дерево поведения ИИ) — система для создания разветвлённых алгоритмов поведения NPC в игре, основанная на решениях, которые принимает искусственный интеллект.
- Pawn Sensing (глаза и слух ИИ) — компонент, который наделяет искусственный интеллект человеческими чувствами, такими как слух и зрение.
- Nav Mesh Bounds Volume (навигационная сетка для ИИ) — инструмент для определения зоны передвижения, которая будет использоваться искусственным интеллектом для навигации. Иными словами, объекты этого класса позволяют указать искусственному интеллекту, в пределах каких границ игрового мира может передвигаться управляемый искусственным интеллектом объект.
* Примечание. В сетевых играх, в отличие от Player Controller, для безопасности данных AI Controller существует только на серверах.
Как создать и подключить свой класс AI Controller
Создать свой собственный класс контроллера искусственного интеллекта (ИИ) не составит труда. Для этого в панели инструментов «Content Browser» необходимо вызвать контекстное меню, нажав правую клавишу мыши, и выбрать пункт «Blueprint Class». В появившемся окне «Pick Parent Class» следует ввести в строку поиска «ai controller», после чего выбрать класс «AIController» и нажать кнопку «Select». В результате в текущей папке Content Browser будет создан ассет, представляющий базовый класс контроллера ИИ.
AI Controller можно назначить абсолютно для любого объекта класса Pawn или Character. Причем для каждого объекта можно подключить контроллер именно его личный, с настройками ИИ под этот конкретный объект. Поэтому подключение пользовательского класса AI Controller производится в каждом отдельном блюпринте Pawn (Character). А именно, в их настройках «Class Defaults / Details / Pawn / AI Controller Class»:
Будьте внимательны! По умолчанию AI Controller автоматически овладевает объектом Pawn только при ручном размещении этого объекта в игровом мире.
Если объект спавнить (Spawn) через Blueprint, то авто овладевания не будет. Чтобы это изменить, нужно в тех же настройках «Class Defaults / Details / Pawn», в пункте «Auto Possess AI», заменить стандартное значение на «Placed in World or Spawned».
Настройки Details для AIController (class Defaults)
В меню Details содержатся как унаследованные параметры от класса Actor, так и настройки, характерные для разбираемого класса AIController. Параметры для Actor мы уже разбирали в соответствующей статье про класс акторов. Сейчас же сконцентрируемся только на настройках AI контроллера в Анрил Энджин.
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). При отсутствии фокусировки установить вращение контроллера на основе ориентации 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). Этот параметр отвечает за то, будут ли изменения в настройках блюпринта отображаться на его экземпляре. Если для него установлено значение False, то изменения в блюпринте будут сохраняться и в размещённом экземпляре. В противном случае, если значение равно 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» позволяет получить в Анрил Энджин 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 контроллер объекта, который пересекся с игроком.
Скриншот
Код на BlueprintUE
Также есть возможность получить пользовательский AIController через Blueprint Interface (интерфейсы Unreal Engine). Этот вариант предпочтительнее, но немного сложнее. В этом случае необходимо дополнительно создать свою интерфейсную функцию «Get Custom AIController» и реализовать её в пользовательском классе AI контроллера «BP_CustomAIController».
Скриншот
Код на BlueprintUE
Практика в Unreal Engine. Разрабатываем базовый функционал AI Controller для передвижения NPC
Автоследование NPC за игроком
Задача: создать в AIController базовую систему автоследования NPC за передвижением игрока.
Весь код мы будем писать в Event Graph пользовательского класса AI Controller. В качестве проекта возьмём стандартный проект от третьего лица в Unreal Engine. Итак, пойдём по пунктам.
- Создадим свой пользовательский класс «CustomAIController».
- Подключим «CustomAIController» к персонажу «BP_ThirdPersonCharacter» (как подключать контроллер ИИ к персонажу, я уже описывал выше в статье).
- Переместим объект персонажа «BP_ThirdPersonCharacter» на игровой уровень. В результате на уровне появятся два объекта этого класса: один — для игрока, а другой — для NPC. Для удобства я покрасил костюм персонажа NPC в красный цвет. Поскольку в настройках класса мы подключили свой контроллер ИИ, то по умолчанию именно ИИ будет управлять этими персонажами, в частности и нашим NPC. Однако с персонажем игрока ситуация несколько иная. Поскольку контроллер игрока имеет приоритет над контроллером ИИ, то именно он перехватит управление персонажем, и в итоге объектом будет управлять не ИИ, а игрок.
- Чтобы NPC могли свободно перемещаться по игровому миру, используя искусственный интеллект, необходимо обозначить на карте зону, в пределах которой они могут свободно перемещаться. Для этого мы используем инструмент сетки навигации «Nav Mesh Bounds Volume». Чтобы воспользоваться этим инструментом, перейдите в Unreal Editor. В верхней части экрана найдите меню «Quickly add to the Project», затем выберите раздел «Volumes» и найдите пункт «Nav Mesh Bounds Volume».
- Далее выделим на сцене объект «Nav Mesh Bounds Volume» и растянем его по всей площади игрового уровня. Опустим его до уровня пола и нажмём клавишу «P». Это приведёт к тому, что навигационная сетка окрасится в зелёный цвет, наглядно демонстрируя пространство для перемещения NPC.
- После завершения всех подготовительных работ мы можем приступить к написанию кода в Event Graph AI Controller. Весь код мы разместим в событии «Event On Possess». В принципе, можно воспользоваться стандартным событием «Event Begin Play», чтобы запуск кода происходил с началом игры, однако в AI Controller лучше использовать именно «Event On Possess». Это событие возникает, когда контроллер ИИ получает контроль над персонажем (Pawn). Для ИИ это событие будет означать старт всего процесса.
- Ключевой функцией нашего кода является нода «AI Move To», отвечающая за перемещение нужного нам Pawn в заданные координаты. Эта нода имеет три выходных пина, из которых нам понадобятся два: «On Success» (успешное достижение цели перемещения) и «On Fail» (неудачное перемещение). В выходных пинах успеха и неудачи вызовем ноду «Delay» с настройкой «Duration = 1», которая обеспечит задержку выполнения кода на одну секунду. После задержки передадим процесс снова в функцию «AI Move To», тем самым создав постоянный цикл.
Функция «AI Move To» в Unreal Engine выполняет перемещение Pawn с помощью AI Controller в заданное расчётное место.
- Далее настроим входные параметры для функции «AI Move To». Первым параметром является Pawn. В этот параметр нужно передать объект, который мы хотим переместить, а это текущий контролируемый Pawn. Для получения информации о нём, воспользуемся нодой «Get Controlled Pawn». Она вернёт объект нашего контролируемого Pawn’а.
- Параметр Target Actor — это объект, к которому должен быть направлен Pawn. Напоминаю, наша задача — автоматически вести NPC за игроком. Поэтому в этот параметр необходимо передать именно объект игрока. Для этого воспользуемся нодой «Get Player Character», которая вернёт актор игрока. Затем подключим его к Target Actor.
- И наконец, последний аспект, который необходимо настроить, — это расстояние, на котором цель будет считаться достигнутой. Мы же не хотим, чтобы NPC постоянно находился рядом с игроком. Достаточно, чтобы он подходил на определённое расстояние и останавливался. Это расстояние определяется параметром «Acceptance Radius». Давайте установим его на уровне 150 пунктов.
Скриншот
Код на BlueprintUE
Таким образом, функция AI Move To, расположенная внутри AI Controller, будет перемещать управляемый Pawn вслед за игроком. С помощью этого простого кода мы создали основу для базовой системы автоследования. В дальнейшем эту систему можно будет усложнять, добавляя новые условия и задачи.
Система патрулирования территории для NPC
Задача: создать основу ИИ для базовой системы патрулирования NPC в UE5 (UE4).
Практически все шаги, необходимые для решения данной задачи (1-8), будут такими же, как и в предыдущем коде, за исключением последних двух (9 и 10). Весь код, отвечающий за патрулирование NPC, будет также реализован в AI Controller с использованием функции «AI Move To».
Единственное отличие заключается в том, как будут рассчитываться координаты для перемещения Pawn. В предыдущем примере мы выбирали цель для перемещения по указанию на игрока. В этом же примере мы будем самостоятельно определять координаты цели, генерируя их случайным образом в пределах определённого радиуса от текущего местоположения NPC.
- Итак, первым шагом в этом коде будет получение текущего Pawn, подконтрольного AI Controller. Как мы уже знаем из приведенного выше примера, это можно осуществить с помощью ноды «Get Controlled Pawn».
- Далее получим координаты этого Pawn нодой «Get Actor Location».
- И наконец, чтобы рассчитать случайные координаты для перемещения NPC, воспользуемся нодой «Get Random Reachable Point in Radius». Во входящий параметр «Origin» этой ноды мы передадим координаты location, полученные в пункте 2. Как я уже упоминал, это текущие координаты NPC. От этих координат «Get Random Reachable Point in Radius» будет рассчитывать новые координаты, но в пределах заданного радиуса, который мы устанавливаем во втором параметре «Radius». В нашем случае радиус будет составлять 1000 пунктов.
Скриншот
Код на BlueprintUE
Таким образом, функция AI Move To, которая находится внутри AI Controller, будет случайным образом перемещать управляемый Pawn каждый раз в новые координаты, но в пределах радиуса 1000 единиц от текущего местоположения.
На этом наша статья заканчивается. Мы рассмотрели контроллер искусственного интеллекта в Unreal Engine, а именно класс AI Controller. Обсудили для чего предназначен данный класс, настройки, как его создать и подключить к подконтрольному Pawn. А также, разобрали применение контроллера ИИ в Анрил Энджин на практическом примере.