AI Controller в Unreal Engine

Друзья, приветствую, с Вами Будуев Антон. В данной статье мы поговорим о классе AI Controller — контроллере искусственного интеллекта (ИИ) в Unreal Engine (UE4, UE5).

Но прежде чем детально изучать контроллер ИИ, рекомендую также ознакомится с общим классом контроллеров: Controller.

Вскоре выйдет моя бесплатная книга по Blueprints для Unreal Engine в PDF формате. Как она выйдет, рекомендую её скачать, чтобы Вы детально изучили блюпринты Анрил Энджин.

AI Controller

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

Перевод официальной справки: AI Controller — является базовым классом для контроллеров, управляющих Pawn, которыми управляет искусственный интеллект. В сетевых играх экземпляры AI Controller существуют только на сервере.

AI Controller — это один из классов контроллеров в Unreal Engine, предназначенный для создания искусственного интеллекта, управляющего неигровыми персонажами (NPC). Для управления игроком существует другой класс контроллера: Player Controller.

ИИ контроллер является наследником класса Controller, который отвечает за общий принцип управления персонажами, будь то игроки или ИИ. Однако AI Controller предоставляет специализированный набор инструментов, необходимых именно для функционирования неигровых персонажей. Это включает в себя навигацию по уровню, восприятие окружающей среды, принятие решений на основе дерева поведения (Behavior Tree) и взаимодействие с системами задач (Gameplay Tasks).

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

Центральной частью AI Controller являются его компоненты и подсистемы:

  • Path Following Component — отвечает за перемещение Pawn по навигационной сетке к заданным точкам или Акторам.
  • Brain Component (реализуемый, например, как Behavior Tree Component) — управляет выполнением дерева поведения, определяющего, как ИИ реагирует на различные стимулы и ситуации.
  • AI Perception Component — позволяет ИИ «видеть» и «слышать» окружающих Акторов, формируя представление об игровом мире.
  • Blackboard Component — представляет собой компонент с ключами и значениями, использующийся для хранения и обмена данными между различными частями ИИ.

Все эти компоненты тесно интегрированы и работают совместно для реализации сложного и адаптивного поведения.

AIController также предоставляет широкий набор функций для программирования логики ИИ. В том числе в Blueprint он включает методы для установки фокуса (точки или Актора, на который ИИ смотрит или стремится переместиться), такие как Set Focus, Set Focal Point и Clear Focus. Для навигации доступны функции Move To Actor и Move To Location, которые инкапсулируют процесс поиска пути и следования по нему. Также реализованы функции проверки видимости (Line Of Sight To), управления задачами (Claim Task Resource, Unclaim Task Resource) и запуска деревьев поведения (Run Behavior Tree). Эти функции позволяют разработчикам описывать сложные поведенческие паттерны, от простого патрулирования до сложной тактической комбинации в зависимости от воспринимаемой ситуации.

Важно отметить, что AI Controller спроектирован как расширяемый базовый класс. Разработчики могут создавать собственные подклассы для добавления уникальной логики, специфичной для конкретного типа персонажа. Это может включать в себя специализированные методы атаки, уникальные реакции на события, или даже собственные компоненты для обработки особых способностей. Таким образом, AI Controller служит прочным фундаментом, на котором строится весь искусственный интеллект в проектах на Unreal Engine, предоставляя стандартный каркас и позволяя при этом гибко адаптировать и расширять его возможности под конкретные задачи.

Ключевая функциональность класса AI Controller

  • Pawn Control — управляет пешкой (Pawn), отдавая ей команды на перемещение и действия.
  • Control Rotation — автоматически обновляет вращение контроллера (Control Rotation) в сторону точки фокуса или, при её отсутствии, в направлении вращения пешки.
  • Movement Requests — предоставляет функции Move To Actor и Move To Location для инициации перемещения к Актору или точке, а также Stop Movement для остановки.
  • Focus Management — управляет собственным фокусом, определяя, на какого Актора или точку в мире он должен быть направлен. Использует функции Set Focus, Set Focal Point, Clear Focus для установки и очистки целей фокуса.
  • Component Architecture — центрально управляет ключевыми компонентами ИИ: Path Following Component, Brain Component, Blackboard Component, AI Perception Component.
  • Navigation — обеспечивает передвижение ИИ по миру с помощью компонента Path Following Component, используя навигационную сетку для поиска путей.
  • Behavior Execution — запускает и управляет логикой ИИ с помощью Brain Component (часто Behavior Tree Component) и функции Run Behavior Tree.
  • Blackboard Usage — работает с Blackboard Component для хранения и обмена данными между различными системами ИИ.
  • Task Management — использует Gameplay Tasks Component и функции Claim Task Resource / Unclaim Task Resource для управления сложными асинхронными задачами и их ресурсами.
  • Perception Integration — взаимодействует с AI Perception Component для получения информации о видимости, слышимости и других стимулах от окружающих Акторов.

Наследование классов

Класс AI Controller наследуется от класса Controller (реализующего базовую логику управления объектами Pawn), добавляя управление поведением ИИ через компоненты навигации, восприятия, Blackboard и дерева поведения для автономного управления Pawn.

Класс AI Controller наследуется от класса Controller добавляя управление поведением ИИ через компоненты навигации, восприятия, Blackboard и дерева поведения для автономного управления Pawn
Класс AI Controller наследуется от класса Controller добавляя управление поведением ИИ через компоненты навигации, восприятия, Blackboard и дерева поведения для автономного управления Pawn

Помимо этого, AI Controller также наследует интерфейсы:

  • AI Perception Listener Interface (IAIPerceptionListenerInterface) — интерфейс, позволяющий объекту получать и реагировать на данные от системы восприятия ИИ (AI Perception Component).
  • Gameplay Task Owner Interface (IGameplayTaskOwnerInterface) — интерфейс, необходимый для владения и управления Gameplay Task, что позволяет ИИ выполнять сложные асинхронные действия.
  • Generic Team Agent Interface (IGenericTeamAgentInterface) — интерфейс для определения принадлежности к команде, используемый системами восприятия и поведения для различения союзников и врагов.
  • Visual Logger Debug Snapshot Interface (IVisualLoggerDebugSnapshotInterface) — интерфейс для интеграции с Visual Logger, позволяющий записывать и отображать отладочную информацию о состоянии ИИ.

Как работает AI Controller

AI Controller можно рассмотреть как «мозг» для неигровых персонажей (NPC), управляющий их поведением и движением.

Сначала контроллер захватывает пешку через функцию Possess. При этом он инициализирует свои ключевые компоненты: настраивает Path Following Component (для навигации) и связывается с Gameplay Tasks Component пешки (для выполнения задач). Если у контроллера уже есть Blackboard Component с привязанным ассетом Blackboard Data, он инициализирует его. Если свойство Start AI Logic On Possess установлено в значение True, то запускает логику ИИ (например, дерево поведения через Brain Component).

Далее каждый кадр вызывается Tick, который, в свою очередь, вызывает внутреннюю функцию UpdateControlRotation(). Эта функция обновляет вращение контроллера (Control Rotation): если установлен фокус (Актор или точка в мире), контроллер поворачивается к нему; если фокуса нет и свойство Set Control Rotation From Pawn Orientation установлено в значение True, Control Rotation копируется из вращения пешки.

После реализуется движение на основе принятия решений. Для перемещения используются функции Move To Actor и Move To Location. Они создают запрос на движение, рассчитывают путь с помощью навигационной системы и передают его Path Following Component для следования. Логика ИИ реализуется, как правило, через Behavior Tree Component (являющийся в контроллере, как Brain Component), который взаимодействует с AI Perception Component (восприятие) и Blackboard Component (хранение данных). При этом сложные асинхронные действия выполняются через систему Gameplay Task, используя Gameplay Tasks Component.

При потере контроля над пешкой (UnPossess) контроллер останавливает движение. Если установлено свойство Stop AI Logic On Unposses, логика ИИ также останавливается. Связь пешки с Gameplay Tasks Component разрывается.

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

Чтобы создать собственный класс контроллера искусственного интеллекта, в панели инструментов Content Browser нажмите правой кнопкой мыши, чтобы открыть контекстное меню, и выберите пункт Blueprint Class. В появившемся окне Pick Parent Class введите в поле поиска AIController, затем выберите этот класс и нажмите кнопку Select. После этого в текущей папке Content Browser появится новый ассет — базовый Blueprint-класс контроллера ИИ, готовый к дальнейшей настройке и расширению.

Создание пользовательского Blueprint-класса AI Controller в Unreal Engine (UE4, UE5)
Создание пользовательского Blueprint-класса AI Controller в Unreal Engine (UE4, UE5)

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

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

Обратите внимание! По умолчанию AI Controller автоматически овладевает объектом Pawn только при ручном размещении этого объекта в игровом мире. Если же Pawn создаётся динамически через функцию Spawn, то автоматическое овладение не произойдёт. Чтобы включить авто овладевание и в этом случае, в тех же настройках Class Defaults / Details / Pawn выберите в параметре Auto Possess AI значение Placed in World or Spawned.

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

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

Настройки Details для AI Controller (class Defaults)
Настройки Details для AI Controller (class Defaults)
  • Start AI Logic On Possess — указывает, должна ли логика ИИ автоматически запускаться при присоединении контроллера к Pawn:
    • TrueAI сразу запускает своё поведение при присоединении.
    • False — требуется запускать логику вручную.
  • Stop AI Logic On Unposses — позволяет настроить, должна ли логика AI контроллера завершаться автоматически при потере управления над Pawn, или оставаться активной.
    • True — при утрате контроля над Pawn логика ИИ автоматически останавливается.
    • False — логика ИИ будет продолжать работать даже после того, как контроллер перестал владеть Pawn.
  • Skip Extra LOS Checks — в классе Controller имеется функция Line Of Sight To, которая проверяет, видит ли контроллер другого Актора. Обычно функция делает несколько проверок: одна до центра Актора, другая до верха. Если текущее свойство Skip Extra LOS Checks установлено в значение True, ИИ пропустит дополнительные проверки до крайних точек (например, верха или сторон) цели, полагаясь только на основную проверку для повышения производительности.
  • Allow Strafe — определяет, разрешено ли ИИ двигаться боком (стрейфить) во время выполнения задачи перемещения. Это может быть полезно, например, если ИИ должен идти вбок, чтобы продолжать смотреть на цель.
  • Wants Player State — указывает, нужен ли этому контроллеру ИИ стандартный объект Player State, используемый для хранения информации о игроке (очки, состояние и т.д.). Хотя ИИ не является игроком, иногда удобно использовать Player State и для них.
  • Set Control Rotation From Pawn Orientation — если ИИ не сфокусирован на какой-либо точке или Акторе, это свойство определяет, будет ли вращение контроллера (Control Rotation) автоматически копироваться из текущего вращения его пешки (Pawn).
  • Default Navigation Filter Class — задаёт класс фильтра навигации по умолчанию. Фильтры навигации влияют на то, как ИИ воспринимает навигационную сетку (например, может игнорировать определенные области или предпочитать определенные типы поверхностей). Если при вызове функций Move To Actor / Move To Location не указан конкретный фильтр, будет использоваться фильтр, заданный этим свойством.

Blueprint-функции класса AI Controller

Внимание! Рекомендую ознакомится со всеми функциями класса Controller, так как контроллер ИИ все эти функции наследует, в том числе и такие важные, как Possess, Un Possess: события и функции класса Controller.

Управление фокусом (Focus Management)

Функции управления фокусом (Focus)
Функции управления фокусом (Focus)
  • Set Focus — устанавливает указанный Актор как фокус ИИ и автоматически обновляет точку фокуса на позицию этого Актора.
  • Set Focal Point — устанавливает конкретную позицию в мире как цель взгляда ИИ (без привязки к Актору).
  • Clear Focus — очищает текущий фокус ИИ, включая точку фокуса.
  • Get Focus Actor — возвращает Актор, который в данный момент является фокусом ИИ с наивысшим приоритетом.
  • Get Focal Point — возвращает текущую точку фокуса ИИ с наивысшим приоритетом (точка, куда ИИ «смотрит» или стремится переместиться).
  • Get Focal Point On Actor — возвращает точку на указанном Акторе, которая используется как фокус для контроллера.
Функции навигации и перемещения (Navigation & Movement)
Функции навигации и перемещения (Navigation & Movement)
  • Move To Actor — инициирует перемещении ИИ к указанному Актору. Прерывает любое активное следование по пути (Path Following).
  • Move To Location — инициирует перемещении ИИ к указанной позиции в мире. Прерывает любое активное следование по пути (Path Following).
  • Get Move Status — возвращает текущий статус следования по пути (Path Following):
    • Idle — без движения,
    • Waiting — ожидание,
    • Paused — пауза,
    • Moving движение.
  • Get Immediate Move Destination — возвращает конечную точку текущего сегмента пути (следующую точку, к которой движется ИИ).
  • Has Partial Path — возвращает значение True, если текущий путь Path Following Component является частичным (не достигает желаемой цели).
  • Set Move Block Detection — включает / выключает автоматическое обнаружение блокировок движения.

Компоненты ИИ (AI Components)

Функции доступа к AI компонентам
Функции доступа к AI компонентам
  • Get Path Following Component — возвращает компонент, отвечающий за движение ИИ по пути (Path Following Component).
  • Set Path Following Component — позволяет установить другой компонент следования по пути для этого контроллера ИИ.
  • Get AI Perception Component — возвращает компонент (AI Perception Component), отвечающий за восприятие ИИ (зрение, слух и т.д.).

Поведение и задачи ИИ (AI Behavior & Tasks)

Функции поведения и задач ИИ (AI Behavior & Tasks)
Функции поведения и задач ИИ (AI Behavior & Tasks)
  • Run Behavior Tree — запускает выполнение заданного дерева поведения (Behavior Tree) для этого контроллера ИИ.
  • Use Blackboard — настраивает контроллер ИИ для использования указанного ассета Blackboard, создавая компонент Blackboard Component, если такой еще не существует.
  • Claim Task Resource — резервирует указанный игровой ресурс (Gameplay Task Resource) для выполнения задач ИИ, предотвращая одновременный конфликт доступа к этому ресурсу разными задачами.
  • Unclaim Task Resource — освобождает ранее зарезервированный тип ресурса задач геймплея (Gameplay Task Resource)
  • On Using BlackboardBlueprint-событие, вызываемое, когда компонент Blackboard Component успешно инициализирован и связан с ассетом Blackboard.

Практика в Unreal Engine. Разрабатываем базовый функционал AI Controller для передвижения NPC

Автоследование NPC за игроком

Задача: создать в AIController базовую систему автоследования NPC за передвижением игрока.

Весь код мы будем писать в Event Graph пользовательского класса AI Controller. В качестве проекта возьмём стандартный проект от третьего лица в Unreal Engine. Итак, пойдём по пунктам.

  1. Создадим свой пользовательский класс CustomAIController.
  2. Подключим CustomAIController к персонажу BP_ThirdPersonCharacter (как подключать контроллер ИИ к персонажу описывалось выше в статье) и установим настройку Auto Possess AI в значение Placed in World or Spawned, чтобы для размещённого вручную в мире персонажа сработало автоовладевание ИИ контроллером.
  3. Переместим один объект персонажа BP_ThirdPersonCharacter на игровой уровень. При старте игры на уровне появятся два объекта этого класса: один — для NPC, тот, который мы разместили вручную и владеть им будет ИИ контроллер; второй — для игрока, созданный движком автоматически, так как BP_ThirdPersonCharacter указан в качестве Default Pawn в Game Mode и владеть им будет Player Controller. Для удобства я покрасил костюм персонажа NPC в красный цвет.
  4. Чтобы 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 в Unreal Engine (UE4, UE5)
  5. Далее выделим на сцене объект Nav Mesh Bounds Volume и растянем его по всей площади игрового уровня. Опустим его до уровня пола и нажмём клавишу P. Это приведёт к тому, что навигационная сетка окрасится в зелёный цвет, наглядно демонстрируя пространство для перемещения NPC.

    Рабочая область «Nav Mesh Bounds Volume»
    Рабочая область «Nav Mesh Bounds Volume»
  6. После завершения всех подготовительных работ мы можем приступить к написанию кода в Event Graph AI Controller. Весь код мы разместим в событии Event On Possess. В принципе, можно воспользоваться стандартным событием Event Begin Play, чтобы запуск кода происходил с началом игры, однако в AI Controller лучше использовать именно Event On Possess. Это событие возникает, когда контроллер ИИ получает контроль над персонажем (Pawn). Для ИИ это событие будет означать старт всего процесса.
  7. Ключевой функцией нашего кода является нода AI Move To, отвечающая за перемещение нужного нам Pawn в заданные координаты. Эта нода имеет три выходных пина, из которых нам понадобятся два: On Success (успешное достижение цели перемещения) и On Fail (неудачное перемещение). В выходных пинах успеха и неудачи вызовем ноду Delay с настройкой Duration = 1, которая обеспечит задержку выполнения кода на одну секунду. После задержки передадим процесс снова в функцию AI Move To, тем самым создав постоянный цикл.

    Функция AI Move To в Unreal Engine выполняет задачу по перемещению Pawn с помощью AI Controller в заданное расчётное место.

  8. Далее настроим входные параметры для функции AI Move To. Первым параметром является Pawn. В этот параметр нужно передать объект, который мы хотим переместить, а это текущий контролируемый Pawn. Для получения информации о нём, воспользуемся нодой Get Controlled Pawn. Она вернёт объект нашего контролируемого Pawn.
  9. Параметр Target Actor — это объект, к которому должен быть направлен Pawn. Напоминаю, наша задача — автоматически вести NPC за игроком. Поэтому в этот параметр необходимо передать именно объект игрока. Для этого воспользуемся нодой Get Player Character, которая вернёт Актор игрока. Затем подключим его к Target Actor.
  10. И наконец, последний аспект, который необходимо настроить, — это расстояние, на котором цель будет считаться достигнутой. Мы же не хотим, чтобы NPC постоянно находился рядом с игроком. Достаточно, чтобы он подходил на определённое расстояние и останавливался. Это расстояние определяется параметром Acceptance Radius. Давайте установим его на уровне 150 пунктов.

Скриншот

Практика в Unreal Engine AI Controller: Базовая система автоследования NPC за игроком
Практика в Unreal Engine AI Controller: Базовая система автоследования NPC за игроком

Код на BlueprintUE

Если код отображается без связей, нажмите сверху кода на кнопку «Graph» Если код отображается без связей, нажмите сверху кода на кнопку "Graph"


Таким образом, функция AI Move To, расположенная внутри AI Controller, будет перемещать управляемый Pawn вслед за игроком. С помощью этого простого кода мы создали основу для базовой системы автоследования. В дальнейшем эту систему можно будет усложнять, добавляя новые условия, задачи и проверки.

Система патрулирования территории для NPC

Задача: создать основу ИИ для базовой системы патрулирования NPC в UE5 (UE4).

Практически все шаги, необходимые для решения данной задачи (18), будут такими же, как и в предыдущем коде, за исключением последних двух (9 и 10). Весь код, отвечающий за патрулирование NPC, будет также реализован в AI Controller с использованием функции AI Move To.

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

  1. Итак, первым шагом в этом коде будет получение текущего Pawn, подконтрольного AI Controller. Как мы уже знаем из приведенного выше примера, это можно осуществить с помощью ноды Get Controlled Pawn.
  2. Далее получим координаты этого Pawn нодой Get Actor Location.
  3. И наконец, чтобы рассчитать случайные координаты для перемещения NPC, воспользуемся нодой Get Random Reachable Point in Radius. Во входящий параметр Origin этой ноды мы передадим координаты location, полученные в пункте 2. Как я уже упоминал, это текущие координаты NPC. От этих координат Get Random Reachable Point in Radius будет рассчитывать новые координаты, но в пределах заданного радиуса, который мы устанавливаем во втором параметре Radius. В нашем случае радиус будет составлять 1000 пунктов.

Скриншот

Практика в Unreal Engine AI Controller: Базовая система патрулирования территории NPC
Практика в Unreal Engine AI Controller: Базовая система патрулирования территории NPC

Код на BlueprintUE

Если код отображается без связей, нажмите сверху кода на кнопку «Graph» Если код отображается без связей, нажмите сверху кода на кнопку "Graph"



Таким образом, функция AI Move To, которая находится внутри AI Controller, будет случайным образом перемещать управляемый Pawn каждый раз в новые координаты, но в пределах радиуса 1000 единиц от текущего местоположения. В дальнейшем эту систему можно будет усложнять, добавляя новые условия, задачи и проверки.

Совет. Вскоре выйдет моя бесплатная книга по Blueprints для Unreal Engine в PDF формате. Как она выйдет, рекомендую её скачать, чтобы Вы детально изучили блюпринты Анрил Энджин.


наш Телеграм канал

Оцените статью
( 6 оценок, среднее 5 из 5 )
Поделитесь этой статьей со своими знакомыми в социальных сетях, возможно, эта статья кому-то будет полезна
Unreal Engine - это просто
Добавить комментарий

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

  1. Александр

    Здравствуйте Антон!

    Прочитал статью и у меня возникло желание реализовать немного другую логику по аналогии с описанной в качестве прикладной задачи. А именно- патрулирование AI со случайной точкой внутри радиуса, так как это показано у Вас, но при этом AI должен убегать от игрока когда он к нему приближается. Хочу использовать для этого событие Actor Begin Overlap. Но мне, как начинающему пока не хватает понимания как это реализовать , в частности не понятно как задать вектор убегающего AI в направлении от игрока и не ясно как чередовать между собой два события patrol/runaway при отдалении/приближении игрока. Как я понял это возможно реализовать внутри дерева поведения, но возможно это также можно сделать внутри обычного Blueprint. Если дадите подсказку буду очень признателен.

    Ответить
    1. Будуев Антон автор

      Александр, здравствуйте.

      Данную логику можно попробовать реализовать как в 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, там процесс похожий.

      Ответить
      1. Александр

        Антон, здравствуйте!

        Спасибо за ответ, в целом логика более менее понятна, попробую проработать это в движке. Обязательно отпишусь по результату, думаю теперь всё должно получиться.

        Ответить
      2. Александр

        Здравствуйте Антон!
        В целом получилось решить задачу. 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, тоже буду разбираться).

        Пример кода

        Ответить
        1. Будуев Антон автор

          Александр, здравствуйте.

          Очень рад, что база механики у Вас получилась.

          Понравилось мне Ваше решение с изменением скорости, интересно.

          На счет того, что сфера дергается — скорее всего это из-за отсутствия анимации. Дело в том, что при изменении направления 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.

          Ответить
          1. Александр

            Антон здравствуйте!

            Доработал решение с учётом Ваших комментариев.
            Скачал и добавил анимацию, всё стало плавно и ничего не дёргается.
            В 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 то в другую. Чтобы логика работала более точно добавил ещё две сферы коллизий с разными радиусами.
            Вероятно данную задачу можно было решить как то более изящно, но возможно и это решение кому то пригодиться.

          2. Будуев Антон автор

            Александр, приветствую.

            Ооочень здорово получилось! Ниже прилагаю ссылки на Ваши скриншоты кода и итоговое видео для других пользователей.

            P.S. Внутри AI Controller напрямую события из Character использовать не получится, но можно попробовать диспетчеры событий.

            Видео получившейся игровой механики Александра

            Реализация ИИ в AI Controller

            Реализация ИИ в классе Character