Добавить в корзинуПозвонить
Найти в Дзене

Создание NPC в Unreal Engine 5.4.4

Приветствую! Если вы давно мечтали оживить свой игровой мир в Unreal Engine, добавив в него NPC (неигрового персонажа), который будет перемещаться по карте или даже преследовать игрока, то вы попали по адресу! В этой статье я подробно расскажу, как шаг за шагом создать такого персонажа: от настройки базового AI до реализации логики преследования. Неважно, новичок вы в Unreal Engine или уже имеете опыт, этот гайд поможет вам разобраться в основах работы с искусственным интеллектом и создании интерактивных NPC. Ну что, поехали🚀 Идём на сайт: www.mixamo.com , регистрируемся. Теперь переходим к его скачиванию. Далее нам нужны анимации для нашего персонажа. И первая анимация - это бег. Для этого идём на страницу Animations сайта www.mixamo.com и в поисковой строке пишем "Run". В открывшемся окне скачивания выбираем такие параметры, как "60 FPS" и "Without Skin". Где значение FPS (от англ. frame per second) - это количество кадров, сменяющих друг друга за одну секунду. А Without Skin - бе

Приветствую!

Если вы давно мечтали оживить свой игровой мир в Unreal Engine, добавив в него NPC (неигрового персонажа), который будет перемещаться по карте или даже преследовать игрока, то вы попали по адресу! В этой статье я подробно расскажу, как шаг за шагом создать такого персонажа: от настройки базового AI до реализации логики преследования.

Неважно, новичок вы в Unreal Engine или уже имеете опыт, этот гайд поможет вам разобраться в основах работы с искусственным интеллектом и создании интерактивных NPC. Ну что, поехали🚀

И так.

Идём на сайт: www.mixamo.com , регистрируемся.

 И в разделе Characters выбираем себе понравившегося персонажа. Жмём кнопку Download
И в разделе Characters выбираем себе понравившегося персонажа. Жмём кнопку Download

Теперь переходим к его скачиванию.

Скачиваем обязательно в формате "FBX" и "T-pose". FBX (расширение .fbx) — формат, который используется для обмена данными о трёхмерной геометрии и анимации. А T-pose  — это стандартная поза в 3D-моделировании и анимации, в которой персонаж стоит прямо, а руки вытянуты горизонтально в стороны и образуют букву «Т»
Скачиваем обязательно в формате "FBX" и "T-pose". FBX (расширение .fbx) — формат, который используется для обмена данными о трёхмерной геометрии и анимации. А T-pose — это стандартная поза в 3D-моделировании и анимации, в которой персонаж стоит прямо, а руки вытянуты горизонтально в стороны и образуют букву «Т»

Далее нам нужны анимации для нашего персонажа. И первая анимация - это бег. Для этого идём на страницу Animations сайта www.mixamo.com и в поисковой строке пишем "Run".

Жмём кнопку Download.
Жмём кнопку Download.

В открывшемся окне скачивания выбираем такие параметры, как "60 FPS" и "Without Skin".

Где значение FPS (от англ. frame per second) - это количество кадров, сменяющих друг друга за одну секунду. А Without Skin - без текстуры. В последнем, всё потому что мы уже скачали персонажа с текстурами, и нам нужна лишь анимация под конкретный скелет.

Конечно жмём кнопку Download.
Конечно жмём кнопку Download.

Теперь выберем анимацию "Idle" для нашего персонажа. Это тип анимации, которая будет срабатывать, когда наш персонаж ничего не делает. Другими словами анимация по умолчанию.

-5

Повторяем все те действия, что и при скачивании анимации бега.

-6

Теперь запускаем нашу программу Unreal Engine версии 5.4.4. Открываем нужный проект и в каталоге ресурсов создаём папку для нашего персонажа.

Старайтесь всегда грамотно структурировать все свои файлы в нужных папках.
Старайтесь всегда грамотно структурировать все свои файлы в нужных папках.

В папке персонажа создадим новую папку, отвечающую за модель нашего персонажа, которую так и назовём "Model"

-8

Помните, чтобы не возникало ошибок в будущих проектах, никогда не используйте в названиях файлов кириллицу.

Перейдём к импорту модели нашего персонажа в необходимую папку. Для этого откроем в пуске компьютера папку, где скачен наш персонаж в T-pose и через ЛКМ (левый клик мыши) перенесём в программу Unreal папку Model

Жмём кнопку импорт всего.
Жмём кнопку импорт всего.

После успешного импорта должны появится файлы разного формата.

Некоторые персонажи могут некорректно импортироваться, так как возможно не будет хватать костей, или текстур. Что требует отдельного внимания. Но данная тема не об этом 😁
Некоторые персонажи могут некорректно импортироваться, так как возможно не будет хватать костей, или текстур. Что требует отдельного внимания. Но данная тема не об этом 😁

Теперь в папке нашего персонажа создадим папку отвечающую за все анимации. Назовём её соответственно Animations.

-11

Повторяем все те же действия с импортом файлов анимации как и в случае переноса самого персонажа. Однако совершаем с привязкой к основном скелету персонажа.

-12

Т.е. в появившемся окне импорта, в разделе "Skeleton" выбираем скелет нашего персонажа, который уже был загружен в Unreal.

-13

Ниже, в разделе "Animations Length" выбираем параметр "Animated Time" и жмём "Импорт всего".

Animated Time и Exported Time — это опции в окне импорта анимаций FBX в Unreal Engine. Exported Time позволяет импортировать кадры анимации на основе данных, определённых во время экспорта.
Animated Time и Exported Time — это опции в окне импорта анимаций FBX в Unreal Engine. Exported Time позволяет импортировать кадры анимации на основе данных, определённых во время экспорта.
Animated Time, в свою очередь, импортирует диапазон кадров с анимацией. Этот вариант может быть полезен, если экспортированный диапазон длиннее, чем фактическая анимация в файле FBX. Простыми словами: у нас 60 кадров в секунду, и Animated Time нам для этого идеально подходит.
Animated Time, в свою очередь, импортирует диапазон кадров с анимацией. Этот вариант может быть полезен, если экспортированный диапазон длиннее, чем фактическая анимация в файле FBX. Простыми словами: у нас 60 кадров в секунду, и Animated Time нам для этого идеально подходит.

Повторяем действия для анимации стояния, она же "Idle" (по умолчанию) и жмём "Импорт всего".

-16

Теперь перейдём к созданию "Bluerprint". Краткая теоретическая информация.

Blueprint (или блюпринт) — система визуального программирования в Unreal Engine. Она позволяет создавать игровые объекты и логические последовательности без написания кода.

Через ПКМ (правую кнопку мыши) в папке вашего персонажа создаём "Класс Bluerprint"

-17

В открывшемся окне выбираем третью позицию под названием "Character".

Character Blueprint в Unreal Engine — это специализированный класс Blueprint, предназначенный для создания и управления персонажами, управляемыми игроком, и NPC. Т.е. как раз он нам и нужен.

-18

Обязательно даём название. В моём случае этот файл будет называться "NPC_DeD"

-19

Открываем созданный нами файл, раздел окно просмотра (по умолчанию), значения класса по умолчанию. Справой стороны, сведения, сетка, строка "Skeletal Mesh Asset" и выбираем в выпадающем меню скелет нашего персонажа (T-pose).

Если боковое меню сведений у вас не открыто, проверьте, левую часть меню, "Компоненты" и активируйте через ЛКМ объект вашего персонажа.
Если боковое меню сведений у вас не открыто, проверьте, левую часть меню, "Компоненты" и активируйте через ЛКМ объект вашего персонажа.

Далее необходимо нашего персонажа разместить в "Capsule".

Capsule в Unreal Engine — это простая коллизия (Simple Collision) в виде куба, сферы или капсулы. Она используется для обнаружения столкновений с другими объектами.

Нажмём клавишу "E" (англ.), после чего у нас активируется вращение нашего персонажа. Повернём его в сторону направления стрелки капсулы (Capsule).

Обратите внимание, что поворачиваем именно "Mesh" персонажа.
Обратите внимание, что поворачиваем именно "Mesh" персонажа.

Жмём клавишу "W" (англ.) - она отвечает за перемещение объектов по трём осям: X, Y и Z. И подвинем наш объект по необходимой высоте.

Если ваш персонаж выходит за пределы "Capsule", то вы всегда можете изменить размер самой капсулы в её настройках, либо изменить персонажа в размере, активировав клавишу "R" - отвечает за масштабирование объекта.
Если ваш персонаж выходит за пределы "Capsule", то вы всегда можете изменить размер самой капсулы в её настройках, либо изменить персонажа в размере, активировав клавишу "R" - отвечает за масштабирование объекта.

Вернёмся в папку нашего персонажа и создадим следующий файл класса Blueprint, который находится в разделе все классы.

-23

Нам необходим файл, класса Blueprint, "Ai Controller"

— это особый тип контроллера, который используется для управления персонажами с помощью искусственного интеллекта.
-24

Переименовываем файл на "NPC_AI"

-25

Вернёмся к файлу персонажа, перейдём в раздел "Значения класса по умолчанию", в поисковой строке "Сведения" пишем слово "Controller". Ниже находим строку "Пешка". И в разделе "AI Controller Class" выберем наш созданный контроллер (NPC_AI). Проще говоря, в будущем этим персонажем будет управлять именно этот файл.

-26

Откроем файл "NPS_AI" (Наш будущий искусственный интеллект персонажа) и перейдём в раздел "Event Graph".

Event Graph — основное пространство, где происходит сборка кода. В нашем случае это место, где создаётся основная логика работы конкретного блюпринта.
Event Graph — основное пространство, где происходит сборка кода. В нашем случае это место, где создаётся основная логика работы конкретного блюпринта.

Создадим первую ноду. Сначала разберемся, что такое нода. По сути их огромное количество, и они все базируются для выполнения тех или иных условий. Активируют событие, текстуры, звуки, отвечают за логику поведения, физику объектов и много чего ещё.

Ноды — это узлы, которые используются для выполнения определённых задач или вычислений.

И первая нода, которая присутствует у нас на Event Graph называется "Event Begin Play"

"Event Begin Play" — это событие, которое срабатывает при старте уровня. Также оно может вызываться внутри вызванного на сцену блупринта, например, при спауне персонажа.

Так вот, от "Event Begin Play" создаём ноду "Run Behavior Tree", она же нода отвечающая за запуск дерева поведения.

Нода "Event Begin Play" отрабатывает один раз при запуске игровой сессии, и до следующего запуска с этим блоком игровой логики больше ничего не произойдёт. А "Run Behavior Tree"  —нода, которая позволяет запускать другое дерево поведения (Behavior Tree).
Нода "Event Begin Play" отрабатывает один раз при запуске игровой сессии, и до следующего запуска с этим блоком игровой логики больше ничего не произойдёт. А "Run Behavior Tree" —нода, которая позволяет запускать другое дерево поведения (Behavior Tree).

Вернемся в папку с нашим персонажем и создадим то самое дерево поведения. Для этого через ПКМ откроем контекстное меню создания файлов, перейдём в раздел "Искусственный интеллект", из выпадающего меню выберем "Дерево поведения".

Behavior Tree — это система определения поведения, используемого искусственным интеллектом (ИИ).
Behavior Tree — это система определения поведения, используемого искусственным интеллектом (ИИ).

Дадим название файлу "NPC_BT".

Почему именно это название? И в целом, где логика названий файлов? Всё просто. Чтобы не запутаться в дальнейшем. "NPC" - это то что относится к нашему основному персонажу, ибо в программе Unreal вам может выпасть в поиске огромное количество файлов подобного типа. А "BT" - это сокращенное "Behavior Tree" (Дерево поведения)
Почему именно это название? И в целом, где логика названий файлов? Всё просто. Чтобы не запутаться в дальнейшем. "NPC" - это то что относится к нашему основному персонажу, ибо в программе Unreal вам может выпасть в поиске огромное количество файлов подобного типа. А "BT" - это сокращенное "Behavior Tree" (Дерево поведения)

Для полноценной работы нашего "Behavior Tree" необходим ещё один файл. Находится он в том же разделе, что и дерево поведения, в называется "Информационная доска" (Blackboard Data). Создаём.

Blackboard Data — это контейнер данных для дерева поведения, который используется для принятия решений. В нём можно хранить различные типы данных, такие как булевы, объекты, поплавки, строки и другие.
Blackboard Data — это контейнер данных для дерева поведения, который используется для принятия решений. В нём можно хранить различные типы данных, такие как булевы, объекты, поплавки, строки и другие.

Даём название "BB_NPC"

-32

Откроем вновь файл "NPC_AI", перейдём в "Event Graph" и в ноде "Run Behavior Tree", в выпадающем меню выберем наше дерево поведения созданное ранее "BB_NPC".

Отныне, при активации ноды запуска дерева поведения, активируется собственно наше дерево.
Отныне, при активации ноды запуска дерева поведения, активируется собственно наше дерево.

Дерево в свою очередь для своих действий будет брать информацию (ключи) с контейнера данных (Информационной доски). Для этого её необходимо подключить. Откроем файл отвечающий за наше дерево, "NPC_BT". Раздел сведения, Behavior Tree, Blackboard Asset и в выпадающем меню выберем нашу информационную доску "BB_NPC"

-34

Открываем файл "BB_NPC", создаём новый ключ типа "Vector", даём имя "Run Location"

Vector-ключ в Blackboard Data — это ключ, который используется для хранения точек в трёхмерном пространстве.
Обратите внимание, что информационную доску можно открыть двумя способами. Первым, когда зайдем в папку с персонажем и откроем непосредственно сам файл. Второй способ - в правом верхнем углу файла дерева поведения нажмём иконку "Информационная доска"
Обратите внимание, что информационную доску можно открыть двумя способами. Первым, когда зайдем в папку с персонажем и откроем непосредственно сам файл. Второй способ - в правом верхнем углу файла дерева поведения нажмём иконку "Информационная доска"

Возвращаемся в наше дерево поведения и через удерживание ЛКМ создадим первую ноду "Sequence" (секвенцию) от "ROOT".

Root (корень) в дереве поведения (Behavior Tree) для NPC — это узел, который автоматически добавляется при создании Behavior Tree. Он используется для настройки свойств дерева поведения и назначения актива Blackboard.
А Root — начальная точка дерева поведения. С её помощью можно добавлять различные узлы, которые определяют поведение NPC.
-36

Создадим следующую ноду от "ROOT" под названием "Move To"

Move To — это нода в дереве поведения для NPC, которая позволяет перемещать персонажа к указанной точке или актору.
-37

Нажмём на ноду "Move To" и сведениях перейдём в раздел "Blackboard Key", выберем из выпадающего меню параметр "Run Location", т.е. выберем ключ отвечающий за перемещение в пространстве.

-38

Теперь создадим новую задачу для нашего дерева поведения. Для это обратимся к левой верхней панели рабочего пространства и нажмём "Новая задача". В появившемся окне пока ничего не меняем и просто жмём "Сохранить"

-39

Откроем созданный файл. Перейдём в раздел "Графы", ниже "Функции", выпадающее меню "Переопределитель", и выберем функцию "Receive Execute AI". После проделанных манипуляций она должна появиться на нашем "Event Graph".

Receive Execute AI — это событие, которое вызывается, когда задача начинает выполняться. С помощью Receive Execute AI можно получить доступ к боту (AI), к Blackboard и нужным переменным, чтобы сразу начать «атаковать» или запускать нужную логику.
-40

От ноды «Receive Execute AI» создаём ноду «Set Blackboard Value as Vector»

Set Blackboard Value as Vector  — это функция, которая задаёт ключу blackboard значение случайной точки.
Если не получается найти необходимую ноду, включите параметр в поиске "контекстно-зависимые"
Если не получается найти необходимую ноду, включите параметр в поиске "контекстно-зависимые"

В левой панели нашей схемы создаём новую переменную, даём имя "Blackboard" и в значение булево меняем на "Blackboard Key Selector".

"Blackboard Key Selector" — это структура, которая помогает определить типы разрешённых записей в blackboard. Иными словами, с помощью Blackboard Key Selector можно, например, определить, какие записи могут храниться в blackboard: только точки или объекты, полученные из класса актора.
В конце наших манипуляций можно нажать на значок "Глаза", чтобы проще было найти.
В конце наших манипуляций можно нажать на значок "Глаза", чтобы проще было найти.

От "Controlled Pawn" создаём ноду "Get Actor Location". С помощью этой ноды можно получить координаты.

-43

Теперь создадим ноду, которая будет вычислять новые координаты для персонажа, исходя из его текущего местоположения, но в пределах заданного радиуса, называется "Get Random Reachable PointlnRadius". Выставим этот радиус в пределах 1000.

Чем меньше радиус, тем выше шанс столкнуться с ошибкой достижения конкретной точки.
Чем меньше радиус, тем выше шанс столкнуться с ошибкой достижения конкретной точки.

Нашу ранее созданную переменную "Blackboard" подключим в "Key" ноды "Set Blackboard Value as Vector" перетянув из левого меню через ЛКМ прямо в необходимое место.

-45

"Random Location" ноды "Get Random Reachable PointlnRadius" подключим узел к "Value" ноды "Set Blackboard Value as Vector"

Теперь наш ИИ сможет принимать решение, исходя из точек. задаваемых данной нодой.
Теперь наш ИИ сможет принимать решение, исходя из точек. задаваемых данной нодой.

И завершим нодой, которая будет сообщать нашему дереву, что задача выполнена успешно. Для этого от "Set Blackboard Value as Vector" создадим ноду "Finish Execute".

-47

Чтобы происходила проверка условий успешного завершения задачи, из "Return Value" ноды "Get Random Reachable PointlnRadius" подключим узел к "Success" ноды "Finish Execute".

-48

В панели ресурсов найдём файл, созданный нами ранее, отвечающий за новую задачу. Его название примерно такое: "BTTask_BluprintBase_New". Переименуем его в "Run Task" и вернемся в файл нашего дерева.

Да, название файла можно задать изначально при сохранении. Но ничего страшного, сделаем это сейчас.
Да, название файла можно задать изначально при сохранении. Но ничего страшного, сделаем это сейчас.

И теперь перед "Move To" создадим последовательный узел "Run Task".

-50

Нажмём на него и в боковой панели слева (сведения) выберем параметр "Run Location"

-51

Следующий последовательный узел будет отвечать за анимацию, которая будет запускаться при движении нашего NPC по локации. Создаём секвенцию "Play Animation".

-52

Переходим в раздел сведения, "Animation to Play" и выбираем анимацию бега.

Looping — это циклическая анимация, то есть анимация, которая повторяется. Non Blocking — это нециклическая анимация, то есть анимация, которая не повторяется.
Looping — это циклическая анимация, то есть анимация, которая повторяется. Non Blocking — это нециклическая анимация, то есть анимация, которая не повторяется.

Далее, аналогичным способом создадим анимацию "стояния", когда NPC достигнет определенной точки. Другими словами, чтобы он останавливался и наслаждался местными красотами.

-54

Завершим последним последовательным узлом нашего дерево ИИ секвенцией "Wait"

Wait — узел, который позволяет дереву ждать до завершения указанного времени ожидания (Wait Time).
С помощью этого узла можно, например, сделать так, чтобы персонаж не бегал постоянно, а подождал определённое количество секунд.
-55

В итоге, нашего дерево поведения NPC должно в конце выглядеть примерно таким образом.

-56

Перейдём в наш мир и создадим собственно карту передвижения NPC. Для этого в расстановке акторов найдём "Nav Mesh Bounds Volume". Он и определит зону передвижения, которая будет использоваться искусственным интеллектом для навигации.

-57

Добавим его в нашу сцену.

-58

Увеличим площадь (и высоту по необходимости) данного актора.

Горячая клавиша "P" (англ.) поможет увидеть границы будущего перемещения NPC.
Горячая клавиша "P" (англ.) поможет увидеть границы будущего перемещения NPC.

Жмём на "Play" в верхнем разделе меню и наслаждаемся своей проделанной работой. (Тестовый пример)

-60

Отлично, теперь сделаем так, чтобы NPC преследовал нашего игрока. Для этого откроем файл "BB_NPC" и создадим новый ключ, категории Key Type Object, даём имя "NPC_Target". В "Key Type" данного ключа выбираем базовый класс "Actor".

Key Type Object — это тип ключа, который позволяет хранить ссылку на объект конкретного типа (в нашем случае, Character)
-61

Далее перейдём в файл "NPC_AI" и от ноды "Run Behavior Tree" создадим ноду "Set Value as Object", т.е. добавим функцию, которая позволяет установить значение как объект.

-62

А нода "Get Player Character" позволяет получить тот самый объект (актор). Следовательно подключим её к области переменной "Object", хранящей в себе отсылку к определённому объекту.

-63

В свободном месте "Event Graph" через ПКМ создадим ноду "Get Blackboard" и подключим к ноде "Set Value as Object" в раздел "Target".

В данной ситуации основная цель Blackboard — обеспечить коммуникацию между разными частями дерева поведения, чтобы они могли обмениваться информацией и принимать обоснованные решения.
-64

В раздел "Key Name" ноды "Set Value as Object" подключим созданную ноду "Make Literal Name" и в поле "Value" даём имя "NPC_Target"

Make Literal Name — позволяет указать имя ключа переменной из Blackboard.
Благодаря этой схеме отныне NPC сможет приследовать нашего игрока
Благодаря этой схеме отныне NPC сможет приследовать нашего игрока

Сверимся с конечной схемой и перейдём к последнему этапу.

-66

В нашем дереве поведения NPC, в секвенции "Move To" нам осталось поменять ключ информационной доски вместо "Run Location" (бег по территории) на "NPC_Target" (преследование игрока), который и будет отвечать за данный тип поведения. Запускаем симуляцию. (Тестовый пример преследования)

-67
Не забываем всё сохранять и компилировать на протяжении всей нашей работы.

Здесь мы подошли к финалу этой непростой, но интересной темы. В завершении, можно поэкспериментировать с NPC и построить ему невероятную локацию с препятствиями. Заодно и проверить, как он справится со сложным маршрутом.