Друзья, приветствую, с Вами Будуев Антон. В данной статье мы обсудим Blueprint-функцию AI Move To, выполняющую в Unreal Engine перемещение Pawn с помощью AI Controller в заданное расчётное место.
Вскоре выйдет моя бесплатная книга по Blueprints для Unreal Engine в PDF формате. Как она выйдет, рекомендую её скачать, чтобы Вы детально изучили блюпринты Анрил Энджин.
AI Move To

Blueprint-функция AI Move To в Unreal Engine, являясь задачей (Task) для AI-контроллера, заставляет контроллер перемещать управляемого персонажа (Pawn или Character) к заданной цели — точке в мире (Destination) или другому Актору (Target Actor) в пределах навигационной сетки (NavMesh), прерывая текущее активное следование по пути и прокладывая новый путь для AI-персонажа (ИИ-Агента). При этом, если цель движется, перемещаемый ИИ-Агент также будет автоматически следовать за ней, обновляя свой путь.
Функция AI Move To используется только во вкладке Event Graph в классах AI Controller, Pawn или Character в составе логических цепочек каких-либо событий или пользовательского события Custom Event. Внутри пользовательских функций она недоступна.
AI Move To выполняет следующие основные действия:
- поиск пути — функция использует систему навигации Unreal Engine для поиска оптимального пути от текущего местоположения ИИ-Агента до указанного местоположения назначения;
- управление движением — после нахождения пути, функция управляет движением ИИ-Агента, чтобы он следовал по этому пути. Она использует его компоненты движения для установки скорости, ускорения и направления движения;
- обработка препятствий — функция учитывает препятствия на пути и пытается их обойти;
- остановка у цели — функция останавливает ИИ-Агента, когда он достигает местоположения назначения, либо достаточно близко к нему;
- возвращение результата — функция возвращает результат перемещения, указывающий, успешно ли было достигнуто местоположение назначения, или произошла ошибка (например, путь не найден, или цель недостижима).
Параметры функции AI Move To
- Pawn (Pawn Object) — ссылка на перемещаемый объект ИИ-Агента (Pawn или Character, которыми управляет AI Controller). Если функция используется внутри Pawn или Character, а не внутри контроллера, то в качестве ссылки используется Self.
- Destination (Vector) — координаты в мировом пространстве, куда нужно переместить ИИ-Агента. Используется, если цель — фиксированная точка.
- Target Actor (Actor Object) — ссылка на Актор (например, игрок или другой объект), к которому должен идти ИИ-Агент. Если задан этот параметр, Destination игнорируется.
- Acceptance Radius (float) — радиус в единицах Unreal Engine, в пределах которого цель считается достигнутой. Если ИИ-Агент находится ближе этого расстояния к цели, движение считается завершённым.
- Stop on Overlap (bool) — если значение параметра задано True, то движение прекратится, как только ИИ-Агент начнёт пересекаться с целью (например, при столкновении с Target Actor), что позволяет избежать наложения и застревания.
- Output (Exec) — исходящий исполнительный пин. Передаёт поток выполнения процесса следующим функциям сразу, после запуска работы AI Move To.
- On Success (Exec) — исполнительный пин, который срабатывает, если ИИ-Агент успешно достиг цели (учитывая Acceptance Radius и Stop on Overlap).
- On Fail (Exec) — исполнительный пин, который срабатывает, если AI Move To не сможет переместить ИИ-Агента до цели (например, из-за отсутствия пути или препятствий).
- Movement Result (Enum) — перечисление, которое указывает результат попытки перемещения:
— Success: перемещение успешно завершено. Объект достиг цели (учитывая Acceptance Radius и Stop on Overlap);
— Blocked: перемещение было заблокировано. Объект не смог продолжить движение из-за препятствия или столкновения;
— Off Path: объект отклонился от пути. Например, потерял навигационный маршрут или вышел за пределы NavMesh;
— Aborted: перемещение было прервано. Операция была отменена программно или из-за внешних условий;
— Invalid: перемещение не было выполнено. Например, из-за некорректных входных данных (невалидный Pawn или цель).
Зависимость от других Unreal-элементов
Для работы функции AI Move To в обязательном порядке требуются несколько других элементов движка Unreal Engine, без которых она просто не будет функционировать:
- Требуется AI Controller — функция AI Move To на самом деле является задачей (Task) для AI-контроллера, который уже, в свою очередь, управляет перемещением ИИ-Агента;
- Требуются компоненты Floating Pawn Movement или Character Movement — именно они отвечают за функциональность передвижения Актора-владельца.
- Требуется навигационная сетка NavMesh — в пределах этой сетки производится поиск пути для движения ИИ-Агента.
Если с контроллером ИИ всё достаточно просто, так как по умолчанию к любому Pawn уже всегда подключен стандартный класс AI Controller, то вот с NavMesh ситуация уже другая. Навигационную сетку нужно добавлять на уровень вручную. И, казалось бы, добавить её просто, но многие просто забывают про неё и потом ищут ошибки, ведь AI Move To просто отказывается работать.
Итак, чтобы добавить на уровень навигационную сетку, необходимо воспользоваться специальным инструментом Nav Mesh Bounds Volume, который находится в Unreal Editor в меню Quickly add to the Project / Volumes.

После чего Nav Mesh Bounds Volume можно растянуть по той территории уровня, по которой необходимо организовать движение AI-персонажа. При этом для визуального удобства на клавиатуре можно нажать клавишу P (при выделенном NavMesh), чтобы навигационная сетка окрасилась в зелёный цвет, наглядно демонстрируя пространство для перемещения.

Практика в Unreal Engine
Простейшее передвижение ИИ-Агента
В качестве небольшой практики настройки функции AI Move To рассмотрим пример передвижения ИИ-Агента к цели.
- Добавим на игровой уровень NavMesh, увеличив его масштаб по осям X и Y, и разместив его по уровню пола.
- Добавим на уровень простейший Актор в виде куба, который будет являться целью при движении ИИ-Агента. Внимание, размещать данный Актор нужно так, чтобы он не рвал зелёный NavMesh. То есть навигационная сетка должна быть целой под размещённым кубом. Если же сетка будет вокруг него отсутствовать, то AI Move To просто не сможет использовать данный Актор в качестве цели.

- Создадим ИИ-Агента. Для этого в Content Browser создадим блюпринт класса Pawn и дадим ему название BP_AIAgent. Внутри которого добавим компонент сферы для визуального наблюдения за ИИ-Агентом и компонент Floating Pawn Movement для придания функциональности передвижения (в настройках этого компонента уменьшим скорость Max Speed до 500). Напомню, без компонента движения функция AI Move To просто не сможет перемещать ИИ-Агента. При этом беспокоиться за прикрепление AI Controller не нужно, так как по умолчанию у любого Pawn он уже подключен.

- Перейдем во вкладку Event Graph блюпринта BP_AIAgent. Весь последующий код будем вызывать по событию Event Begin Play. Но для начала создадим переменную Target, тип которой установим Actor Object Reference. В данной переменной у нас будет находиться цель для передвижения.

- Также у переменной Target установим свойство Instance Editable в значение True, чтобы мы смогли заполнить переменную значением непосредственно находясь на уровне в Unreal Editor.

- Переместим блюпринт BP_AIAgent на уровень. Внимание, размещать данный Актор нужно так, чтобы он не рвал зелёный NavMesh, иначе BP_AIAgent просто окажется вне навигационной сетки и не сможет начать движение.

- Заполним переменную Target значением. Для этого выделим на сцене BP_AIAgent, перейдём в настройки Details и в разделе Default напротив переменной Target воспользуемся инструментом «Пипетка». Этой пипеткой необходимо кликнуть по Актору цели, который мы размещали в пункте 2. Таким образом в переменной Target будет храниться ссылка на Актор куба, который является целью для передвижения ИИ-Агента BP_AIAgent.

- Итак, весь код в BP_AIAgent мы будем описывать по вызову события Event Begin Play. Но перед тем, как размещать в этой логике функцию AI Move To, чтобы избежать ошибок, нодой Is Valid необходимо проверить, есть ли ссылка на Актор в переменной Target.

- И вот теперь, на выходе Is Valid, когда переменная Target валидна (имеет внутри себя ссылку на Актор), разместим функцию AI Move To. В качестве цели Target Actor которой подадим нашу переменную Target. Напоминаю, в этой переменной у нас находится ссылка на Актор куба из пункта 2.
- Также установим параметр Stop On Overlap в значение True, чтобы ИИ-Агент остановился при соприкосновении с целью.
- Ну и последнее, в AI Move To осталось заполнить параметр Pawn, указав тот объект, который нам нужно переместить. А это сам блюпринт BP_AIAgent, внутри которого мы и пишем логику. Поэтому просто воспользуемся нодой Get a reference to Self, которая возвратит ссылку на сам объект BP_AIAgent, внутри которого мы и находимся.
Скриншот
Код на BlueprintUE

Другие практические уроки
В качестве большей практики в Blueprints по работе с функцией AI Move To Вы можете изучить дополнительные уроки:
- Автоследование NPC за игроком. Перейти к практике >>
- Система патрулирования территории для NPC. Перейти к практике >>
Совет. Вскоре выйдет моя бесплатная книга по Blueprints для Unreal Engine в PDF формате. Как она выйдет, рекомендую её скачать, чтобы Вы детально изучили блюпринты Анрил Энджин.