- 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» и другими вспомогательными функциями.
Вскоре выйдет моя бесплатная книга по Blueprints для Unreal Engine в PDF формате. Как она выйдет, рекомендую её скачать, чтобы Вы детально изучили блюпринты Анрил Энджин.
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 (глаза и слух ИИ) — Unreal Engine Component (компонент), который наделяет искусственный интеллект человеческими чувствами, такими как слух и зрение.
- 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» в Unreal Engine (UE4, UE5) - Далее выделим на сцене объект «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. А также, разобрали применение контроллера ИИ в Анрил Энджин на практическом примере.
Совет. Вскоре выйдет моя бесплатная книга по Blueprints для Unreal Engine в PDF формате. Как она выйдет, рекомендую её скачать, чтобы Вы детально изучили блюпринты Анрил Энджин.
Здравствуйте Антон!
Прочитал статью и у меня возникло желание реализовать немного другую логику по аналогии с описанной в качестве прикладной задачи. А именно- патрулирование AI со случайной точкой внутри радиуса, так как это показано у Вас, но при этом AI должен убегать от игрока когда он к нему приближается. Хочу использовать для этого событие Actor Begin Overlap. Но мне, как начинающему пока не хватает понимания как это реализовать , в частности не понятно как задать вектор убегающего AI в направлении от игрока и не ясно как чередовать между собой два события patrol/runaway при отдалении/приближении игрока. Как я понял это возможно реализовать внутри дерева поведения, но возможно это также можно сделать внутри обычного Blueprint. Если дадите подсказку буду очень признателен.
Александр, здравствуйте.
Данную логику можно попробовать реализовать как в Blueprint, так и в дереве поведения. В дереве получится более профессионально, ведь оно для этого и создано, но в целом, логика не особо сложная, так что можно обойтись и блюпринтами.
Отслеживание NPC приближения игрока также можно реализовать разными способами. Или при помощи Pawn Sensing, или же как предложили Вы — через события Overlap.
Если через Overlap, то тогда, думаю, на Актор NPC нужно повесить отдельный компонент Sphere Collision и сделать для коллизии достаточный диаметр. И по событию Component Begin Overlap (sphere) — переключать логику NPC на Runaway. А по обратному событию Component End Overlap (sphere), переключать логику NPC обратно на Patrol.
При реализации логики Runaway, Вы правильно заметили, что нужно знать вектор движения игрока, его можно получить из поворота игрока, который, в свою очередь получить из Актора игрока: Player Actor (из Begin Overlap) -> Get Actor Rotation -> Get Forward Vector. Далее отталкиваясь от этого направления, добавить какое-то количество пунктов и назначить для NPC новую цель.
Как работать с Get Forward Vector и как добавить пункты, Вы можете посмотреть в статье про Line Trace, там процесс похожий.
Антон, здравствуйте!
Спасибо за ответ, в целом логика более менее понятна, попробую проработать это в движке. Обязательно отпишусь по результату, думаю теперь всё должно получиться.
Здравствуйте Антон!
В целом получилось решить задачу. NPC (сфера) патрулирует уровень на малой скорости, когда к нему приближается игрок (ThirdPersonCharacter) убегает от него уже на большей скорости. Для патрулирования использовал Сustom Event с нодой AI Move To, примерно как в Вашем примере, но только сделал вызов того же Custom Event после delay. Событие Component End Overlap не пригодилось, поскольку после выхода Player из сферы коллизии автоматически обратно включается режим патрулирования NPC по Custom Event. Вектор направления от игрока к NPC и длину его перемещения Lenght реализовал по формуле NPC Location+(( Normalize(NPC Location — Player Location))XLenght), не вполне разобрался с предложенным способом задания вектора через GetForwardVector, потом ещё попробую. Пробовал сделать логику в AI Controller, не получилось, не понял возможно ли это в принципе. Удалось реализовать решение только в файле Blueprint NPC, сейчас осталась там пара недочётов: периодически дёргается сфера в точке смены направления при патрулировании, примерно раз из пяти (не понятно с чем связано), и остановки сферы возле стен и в углах (это вроде решается с использованием Line Trace, тоже буду разбираться).
Пример кода
Александр, здравствуйте.
Очень рад, что база механики у Вас получилась.
Понравилось мне Ваше решение с изменением скорости, интересно.
На счет того, что сфера дергается — скорее всего это из-за отсутствия анимации. Дело в том, что при изменении направления AI Move To дает команду капсуле Character развернуться. Если для Character не прописана анимация, то разворот происходит мгновенно-резко, что для человеческого восприятия не комфортно. Если для персонажа прописать анимационный блюпринт, тогда разворот происходит плавно, следуя правилам, описанным в анимационном блюпринте.
Почему код не работает в AI Controller, нужно смотреть Ваш файл. Как у Вас произведено подключение контроллера к пешке. Использовали ли Вы в AI Controller для старта логики Event On Posses или же Event Begin. Если Event Begin, то это неправильно, нужно Event On Posses, чтобы логика стартовала только тогда, когда контроллер завладеет пешкой, иначе код может стартовать раньше овладевания, и, соответственно, когда в итоге овладевание наступит, код движения теряет весь смысл относительно пешки.
А так, вообще, конечно правильно такой код описывать именно в AI Controller. Но в Вашем случае код немного сложнее, так как меняется скорость у персонажа. Тут либо необходимо будет из функции Get Controlled Pawn вытаскивать компонент Character Movement и в нем менять скорость, либо, что более правильно, создавать интерфейсную функцию и через интерфейс скорость менять непосредственно в самом Character.
На счет остановки у стен — тут мне не понятна ситуация, тоже нужно файл проекта смотреть. По сути никаких проблем не должно быть, максимум, что может быть, это то, что персонаж возле стены может немного дольше обычного стоять на месте из-а того что AI Move To может заканчивать работу выходом Fail. Не важно, есть стены или нет, движение производится всегда только по зеленому полю Nav Mesh, а оно автоматически от стен всегда отстает. И если рандом высчитает новые координаты за пределами Nav Mesh, то функция AI Move To просто не будет передвигать персонажа, а закончит свою работу выходом Fail.
Антон здравствуйте!
Доработал решение с учётом Ваших комментариев.
Скачал и добавил анимацию, всё стало плавно и ничего не дёргается.
В AI Controller добавил часть кода с патрулированием, скорость задал по схеме Get Controlled Pawn=>Cast to Character=>Target/Character Movement=> Set Max Walk Speed, интерфейсные функции пока не знаю, не использовал ещё. Старт события по Event On Posses, всё работает. Правильно ли я понимаю, что нельзя внутри AI Controller использовать события Component Begin Overlap поскольку нет актора и некуда привязать сферу коллизии.
Проблема остановок NPC у стен действительно была связана с переходом AI Move To в Fail, конечная точка вектора перемещения попадала за пределы Navigation Mesh. Поскольку хотелось чтобы NPC убегали непрерывно я поменял их направление движения при событии Fail, сначала разворот в одну сторону на 90 градусов, если тоже Fail то в другую. Чтобы логика работала более точно добавил ещё две сферы коллизий с разными радиусами.
Вероятно данную задачу можно было решить как то более изящно, но возможно и это решение кому то пригодиться.
Александр, приветствую.
Ооочень здорово получилось! Ниже прилагаю ссылки на Ваши скриншоты кода и итоговое видео для других пользователей.
P.S. Внутри AI Controller напрямую события из Character использовать не получится, но можно попробовать диспетчеры событий.
Видео получившейся игровой механики Александра