Mass AI
April 30

Ваши первые 60 минут с Mass AI

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

Настройка плагина

В этом руководстве используются многие плагины Mass для создания агентов ИИ с помощью Mass и их перемещения по уровню. В редакторе Unreal Editor выберите Edit→Plugins в строке меню. Включите следующие плагины:

  • MassEntity
  • MassGameplay
  • MassAI
  • MassCrowd
  • ZoneGraph (Для навигации)
  • StateTree

После включения любого из плагинов редактор предложит перезапустить его, но лучше всего подождать, пока все плагины будут включены, чтобы потребовался только один перезапуск. Как только все плагины будут включены, перезапустите редактор.

Обзор концепций Mass

Синопсис Mass Framework

Mass - это ориентированный на данные фреймворк, предназначенный для высокопроизводительных вычислений над большим количеством сущностей. В Unreal Engine обычный рабочий процесс состоит из акторов и компонентов. Хотя такой дизайн очень гибок с точки зрения создания логики для акторов, он часто приводит к несогласованности данных, что приводит к промахам кэша процессора, а это довольно дорого. Вместо этого Mass использует ориентированную на данные структуру проектирования Entities и Fragments , которая обеспечивает альтернативный способ хранения данных, отделяющий их от логики обработки. Сущность Entity - это один экземпляр группы фрагментов со связанным с ним идентификатором. Сущности не имеют посторонних фрагментов. Фрагменты одинаково составленных сущностей хранятся в смежной памяти. Более подробное описание MassEntity можно найти в официальной документации по MassEntity.

Ключевая Терминология Mass

  • Сущность (Entity)- это базовый класс Mass, который содержит указатели на все его фрагменты.
  • Фрагмент (Fragment)- хранит данные/состояние сущности в виде плотно упакованных массивов (например, трансформация, скорость, текущий LOD и т. д.).
  • Архетип (Arhetype)- сущности с идентичным составом фрагментов, которые группируются вместе. Состав сущностей может меняться во время выполнения, что приводит к миграции архетипов
  • Признак (Trait)- группирует фрагменты вместе и обычно представляет характеристики сущности (например, движение, навигация ZoneGraph, пользователь SmartObject).
  • Теги (Tag) - фрагменты на уровне архетипов, не содержащие данных, которые могут использоваться запросами для фильтрации архетипов на основе их наличия или отсутствия
  • Chunk Fragment - фрагменты, которые применяются к подмножеству сущностей в архетипе, а не непосредственно к одной сущности.
  • Shared Fragment - Фрагменты с данными, которые совместно используются несколькими сущностями для оптимизации памяти.
  • Процессор - место массового выполнения логики. Процессоры могут изменять значения фрагмента, а также состав сущностей (добавлять или удалять).
  • Entity Query - запрос, используемый процессорами, который фильтрует архетипы на основе требований к фрагментам и/или тегам. Запрос EntityQuery возвращает группы фрагментов без учета идентификаторов отдельных сущностей.
  • Mass Spawner - система для добавления сущностей на уровень во время выполнения.
  • Mass Entity Config - ассет, определяющий массового агента для порождения путем указания признаков сущности.

Поток выполнения процессора Mass

Хотя может показаться, что процессоры Mass проходят все сущности за один раз, на самом деле процессоры охватывают часть сущностей в архетипе. Шаги выглядят следующим образом:

  1. Каждый процессор начинает с конфигурирования запроса сущности, который добавляет требования к сущности, такие как теги, фрагменты, общие фрагменты, фрагменты чанков и даже подсистемы.
  2. Затем процессоры выполняют пакетные обновления для куска сущностей, вызывая ForEachEntityChunk. Здесь используются фрагменты чанков, и один фрагмент чанка может быть использован для всех сущностей в чанке.
  3. MassEntityQuery сопоставляет требования с архетипами и может отфильтровывать фрагменты совпадающих архетипов на основе фильтров фрагментов. Хотя требования обычно заключаются в том, чтобы теги или фрагменты присутствовали в архетипе, их можно использовать для выбора архетипов без указанных тегов и фрагментов.
  4. После фильтрации Mass Entity Query запускает функцию для каждого куска сущностей, а доступ к отдельным сущностям куска можно получить через FMassExecutionContext. Большая часть кода плагина использует лямбда-выражения при выполнении ForEachEntityChunk.

Обзор плагина Mass

Готовность к производству по состоянию на 5.2

  • MassEntity - основной плагин для фреймворка Mass. Он необходим для любого проекта, желающего использовать Mass.

Экспериментальная версия 5.2

  • MassGameplay - Этот плагин содержит специализированный контент для взаимодействия с миром, репликации, LOD, движения и визуализации сущностей в мире. В плагин также включена поддержка сущностей, представленных в виде агентов, а также некоторые утилиты для предотвращения "топтания" данных, если актор или масса хотят изменить данные агента.
  • MassAI - Содержит логику для таких действий, как запуск деревьев состояний, навигация по миру с помощью ZoneGraph, избегание других массовых агентов и репликация ИИ.
  • MassCrowd - Содержит специализированные классы для создания толп сущностей Mass со специальными процессорами визуализации и навигации. Он широко использовался в City Sample и был построен поверх других плагинов Mass.

Создание первого Entity

Создание MassEntityConfig

Чтобы создать MassEntityConfig, нажмите кнопку 'Add' в браузере содержимого и выберите Miscellaneous->Data Asset из меню. Найдите 'MassEntityConfigAsset', затем нажмите 'Select'. Назовите конфигурацию 'MassNPCEntityConfig'. Откройте только что созданный конфиг. В окне редактора должна появиться панель 'Details' с разделом 'Entity Config', в котором прямо под заголовком есть кнопка с надписью 'Validate Entity Config'.

Начальная MassEntityConfig для NPC

Добавление признаков в конфигурацию сущности

Если щелкнуть на выпадающем списке 'Index [0]', появится длинный список опций. Это признаки, которые поставляются с включенными плагинами MassEntity. Признаки по умолчанию, поставляемые плагинами, охватывают некоторые стандартные поведения, которые можно ожидать от соответствующих плагинов, такие как ZoneGraphNavigation, Avoidance или SmartObject User. Дополнительные признаки можно добавить в конфигурацию, нажав клавишу '+' или щелкнув по нисходящему значку рядом с выпадающим признаком и выбрав 'Insert'. Будьте осторожны с нажатием на значок мусорной корзины в верхней части списка признаков, так как это приведет к удалению всех признаков из конфигурации сущности.

Начните с добавления признака Debug Visualization в конфигурацию сущности. После добавления трейта рядом с Index[0] появится тумблер расширения. Разверните признак и для поля mesh выберите из списка Shape Cone. Установите для поля Visual Near Cull Distance значение 0, а для Visual Far Cull Distance - 25000. Это позволит отладить отрисовку статической сетки для данного архетипа сущности. Сохраните конфигурацию сущности.

MassEntityConfig для конуса

Настройка MassSpawner

Создайте новый уровень на основе шаблона Basic. Добавьте MassSpawner на уровень через Place Actors. На вкладке Details для MassSpawner раскройте раздел с надписью Spawn. Нажмите кнопку '+' рядом с Entity Types и выберите из выпадающего списка MassNPCEntityConfig ассет. Поле Count - это количество сущностей, которые будет генерировать данный породитель. Вы можете изменить пропорцию каждой отдельной сущности в конфигурации. Пропорции типов сущностей для порождения нормализуются среди всех типов сущностей, связанных с породителем. Это позволяет избежать странных результатов от пропорций, которые превышают 1 или не достигают 1.

Затем добавьте запись в раздел Генераторы данных порождения в породителе и разверните новый генератор. Выберите EQS Spawn Points Generator из выпадающего списка. Создайте запрос EQS под названием EQS_SpawnEntitiesInDonut. Откройте новый запрос окружения и перетащите корневой узел, выбрав Points: Donut из списка. Установите следующие параметры для генератора:

  • Inner Radius = 1000
  • Outer Radius = 3000
  • Number of Rings = 5
  • Points Per Ring = 12
EnvQuery used for MassEQSSpawnPointsGenerator

Сохраните запрос окружения. Вернитесь на уровень и снова выберите MassSpawner. В разделе Generator Instance выберите новый запрос окружения. Сохраните уровень и нажмите Simulate для PIE. Вокруг MassSpawner должно появиться 25 конусов. Это основные принципы добавления массовых сущностей на уровень.

**Ошибка MassProcessor в 5.2**

Это было исправлено в обновлении 5.2.1. Если вы используете версию 5.2.1 или более позднюю, вам не нужно использовать приведенные ниже обходные пути.

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

Вы также можете обойти эту проблему, добавив флаг Editor в CDO процессора внутри Project Settings->Mass->Mass Entity. Это необходимо сделать для следующих процессоров:

  • DebugVisLocationProcessor
  • MassProcessor_UpdateDebugVis
  • MassStateTreeActivationProcessor
  • MassStateTreeProcessor
  • MassUpdateISMProcessor
  • MassVisualizationLODProcessor
  • MassVisualizationProcessor
Example of the Execution Flag setup for the Processor CDO
Cone entities spawned by Mass

Создание более сложных объектов

Улучшение конфигурации сущности

Хотя стационарные конусы, конечно, могут быть интересными, следующим шагом будет добавление большей глубины сущностям через конфигурацию сущности. Во-первых, измените признак Debug Visualization на признак Visualization в конфигурации сущности. Признак Visualization позволяет получить более тонкое визуальное представление сущностей за счет возможности поставлять шаблонные акторы высокого разрешения, шаблонные акторы низкого разрешения и статические экземпляры сетки для более высоких LOD.

Развернув раздел Params, вы сможете выбрать, какой шаблонный актер будет использоваться с каждым уровнем LOD. Этот раздел также содержит опции, позволяющие отключить актеров Low Res Actors, если они представлены в виде статичной сетки. Флаг Keep Actor Extra Frame служит для помощи в рендеринге при переходе между LODами в случае, если запрос окклюзии запоздал на один кадр.

Раздел LOD Params позволяет задать расстояние, на котором действует диапазон LOD, с отдельными значениями для необработанного расстояния и расстояния при видимости. LOD Max Count содержит настройки того, сколько каждого представления может быть активно в одном LOD.

Установите High Res Actor Template в Visualization trait, чтобы использовать шаблон персонажа проекта или любого персонажа, у которого есть компонент капсулы и скелетная сетка всего тела. Вы можете импортировать содержимое шаблона Third Person, чтобы получить готового персонажа для использования. Установите Low Res Actor Template, чтобы использовать того же персонажа, что и High Res Actor Template. Для Static Mesh Instance Desc добавьте сетку в Meshes коллизию и установите для нее использование Shape_NarrowCapsule. Измените для сетки Min LODSignificance на 3,0.

Entity Config with updated Visualization trait

Добавление фрагментов к сущности

Поскольку конфиг сущности был обновлен, нажмите кнопку Validate Entity Config в левом верхнем углу. БЕЗ ПАНИКИ! В правом нижнем углу должно появиться всплывающее окно, объясняющее, что некоторым сущностям не хватает фрагментов, которые они требуют. Чтобы найти недостающие фрагменты и любые другие детали проверки конфигурации, загляните в Output Log, где красным цветом будут выделены все найденные проблемы. Для трейта Visualization требуется 3 фрагмента: MassViewerInfoFragment, TransformFragment и MassActorFragment. Чтобы добавить эти фрагменты в сущность, добавьте еще один признак в конфигурацию сущности и выберите Assorted Fragments из выпадающего списка.

Признак Assorted Fragments позволяет указать массив фрагментов, которые могут потребоваться различным признакам. Можно добавить больше фрагментов, чем нужно сущности, поэтому следует позаботиться о проверке конфигурации при каждом ее изменении. Создание дубликатов фрагментов также является проблемой при использовании трейта Assorted Fragments. Добавьте в массив 3 фрагмента и установите их в MassViewerInfoFragment, TransformFragment и MassActorFragment.

Assorted Fragments trait

Вот краткое объяснение добавленных фрагментов:

  • MassViewerInfoFragment - этот фрагмент хранит рассчитанное расстояние до зрителей, которое будет использоваться при расчете уровня LOD
  • TransformFragment - этот фрагмент хранит преобразование мира для сущности
  • MassActorFragment - этот фрагмент содержит указатель на AActor в мире, который используется для представления сущности с признаком визуализации

Теперь, когда фрагменты добавлены, снова нажмите Validate Entity Config. В правом нижнем углу должно появиться всплывающее окно, но на этот раз оно должно сообщить, что ошибок валидации не было. Сохраните конфигурацию еще раз.

Включить автоматическую регистрацию процессора

Прежде чем вы начнете PIE, текущая форма Mass требует, чтобы у нескольких процессоров был включен флаг Auto Register With Processing Phases в настройках Mass. Без установки этого флага сущности Mass не будут видны в игре. Вы можете увидеть, что сущности по-прежнему порождаются с помощью инструментов Gameplay Debugger или Visual Logger, но у них нет никакого AActor-представления. Более подробно отладка Mass будет рассмотрена позже.

Включить флаг Auto Register с фазами обработки можно двумя способами. Первый - открыть в редакторе Настройки проекта и выбрать Mass в разделе Engine. Разверните раздел Module Settings в разделе Mass. Разверните раздел Mass Entity и снова Processor CDOs. Далее найдите в массиве процессоров MassLODCollectorProcessor, MassRepresentationProcessor и MassVisualizationLODProcessor. Разверните процессоры и вручную включите флаг Auto Register with Processor Phases для каждого процессора.

Регистрация массовых процессоров

Второй способ включить флаг Auto Register with Processing Phases заключается в том, чтобы добавить следующее в DefaultMass.ini проекта:

[/Script/MassRepresentation.MassRepresentationProcessor]

bAutoRegisterWithProcessingPhases=True

[/Script/MassRepresentation.MassVisualizationLODProcessor]

bAutoRegisterWithProcessingPhases=True

[/Script/MassLOD.MassLODCollectorProcessor]

bAutoRegisterWithProcessingPhases=True

Файл DefaultMass.ini должен находиться в папке Config в основании каталога проекта.

Причина необходимости вручную включать эти процессоры заключается в конфликте с визуализацией Crowd. Процессоры визуализации по умолчанию все равно забирают сущности Crowd, поэтому они были отключены для City Sample. В будущем планируется решить эту проблему, но сроки пока не определены. Если конфигурации сущностей были изменены для использования Визуализации толпы, необходимо обновить включенные процессоры, а также фрагменты визуализации. Процессоры, которые нужны визуализации Crowd, следующие:

  • MassCrowdLODCollectorProcessor
  • MassCrowdVisualizationProcessor
  • MassCrowdVisualizationLODProcessor

Исправление визуализации

Теперь, когда процессоры включены, пришло время PIE, чтобы увидеть, что сущности теперь имеют полные скелетные сетки. Если вы используете полноценного персонажа для шаблона High Res Actor, он может выглядеть примерно так: сущности наполовину скрыты под полом.

Entities that are halfway through the floor

Это связано с тем, что в UE5 компонент капсулы персонажа рассчитывается таким образом, что локально он центрируется вокруг (0, 0, 0). Чтобы компенсировать это, добавьте Post Projection Vertical Offset в запрос EQS, чтобы каждая возвращаемая позиция имела значение Z, увеличенное на эту величину. При значении 90.0 (равном половине высоты капсулы) визуализация персонажа должна быть полностью над землей. В качестве альтернативы это можно исправить с помощью синхронизации сущности и ее представителя-актера, как это делается далее в руководстве в Обновление массового актера BP.

Mass entities properly spawned above the floor

Внедрение LOD для массовых организаций

Создание шаблона актера низкого разрешения

Несмотря на то, что полноценные актеры High Res работают в этой небольшой выборке, затраты на их использование могут быстро увеличиться. Именно в этом случае шаблон актера низкого разрешения может помочь, используя более легкого актера для представления сущности. Это позволяет разместить на экране больше сущностей, не жертвуя производительностью Mass.

Для актера низкого разрешения создайте новый чертеж Actor Blueprint под названием BP_MassLowResActor. Откройте чертеж и добавьте компонент Skeletal Mesh Component. Установите Skeletal Mesh Asset для использования SKM_Manny_Simple и Anim Class для использования ABP_Manny. Использование манекена из другого движка для актера с низким разрешением позволяет легче увидеть, когда LOD сущности меняется в PIE.

Настройка LowResActor

Также задайте Трансформацию скелетной сетки, чтобы Значение расположения Z было -90,0 и Вращение по оси Z было 270,0. Трансформация должна отражать трансформацию актера высокого разрешения и учитывать смещение в запросе EQS. Скомпилируйте чертеж и сохраните его.

Настройки преобразования для LowResActor Transform

Откройте конфигурацию сущности массы. В разделе Visualization trait установите Low Res Template Actor для использования BP_MassLowResActor. Разверните раздел Params и в разделе LODRepresentation установите Medium LOD для использования Low Res Template Actor. Разверните раздел LODParams и раздел LODMax Count. Установите общее число 10 для параметра High LOD Max Count.

EntityConfig Visualization values after changes

Добавление информации LOD к массовым объектам

Для настройки между уровнями LOD в конфигурации сущности потребуется новый признак: LODCollector. Процессор LODCollector определяет LOD, который должен иметь данный объект, основываясь на его расстоянии до зрителей и фрустра камеры. Подсистема MassLODSubsystem отвечает за сбор и синхронизацию всех контроллеров игроков в TMap, а LOD Collector затем использует эту TMap при определении LOD для сущностей.

Добавьте LODCollector признак в MassNPCEntityConfig. Если на этом этапе конфиг будет проверен, редактор выдаст ошибку о том, что фрагмент был добавлен несколько раз. Это связано с тем, что признак LODCollector добавляет фрагмент MassViewerInfoFragment в своем методе BuildTemplate , а в текущем конфиге сущности он также добавляется признаком Assorted Fragments. Удалите запись для Mass Viewer Info Fragment из Assorted Fragments, щелкнув по нисходящему каре рядом с выпадающим списком фрагмента. Не нажимайте НЕ на значок мусорной корзины для массива Фрагменты, так как это приведет к удалению всех записей в массиве. Проверьте конфигурацию сущности и сохраните ее. На данный момент конфигурация сущности должна выглядеть следующим образом:

Entity Config with LOD trait

Запустите PIE и перемещайтесь по уровню, чтобы увидеть, как актеры высокого разрешения (использующие скелет Квина) меняются на актеров низкого разрешения (использующих скелет Мэнни) по мере удаления от камеры, а актеры низкого разрешения должны меняться на актеров высокого разрешения, когда они приближаются к камере.

Closer entities use Quinn, but further/background entities use Manny

Создание объектов с движущейся массой

Настройка ZoneGraph

Добавьте Профиль полосы в раздел 'Настройки проекта->График зоны'. Добавьте 2 полосы в профиль полосы с тегами по умолчанию, одну вперед и одну назад. Добавьте на уровень ZoneShapes, чтобы создать замкнутую сеть дорожек. Постройте граф зон и сохраните уровень. Дополнительные ресурсы по настройке ZoneGraph можно найти здесь: ZoneGraph Quick Start Guide

Simple ZoneGraph setup in level

Порождение объектов на ZoneGraph

Помимо использования ZoneGraph для навигации, Mass также включает в себя спаунер для порождения сущностей вдоль ZoneGraph. Выберите MassSpawner из Outliner на уровне. В разделе Mass->Spawn->Spawn Data Generators измените Generator Instance на ZoneGraph Spawn Points Generator. Установите фильтр Any Tags Filter на использование тега Default , используемого с профилями полос ZoneShape.

MassSpawner settings with ZoneGraph points generator

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

Добавление навигации и движения в конфигурацию сущности

Откройте конфигурацию Mass entity. Для правильной работы движения и навигации требуется несколько трейтов и фрагментов. Поскольку черты Mass представляют возможности, начните с добавления базовых черт движения: Движение, Направление, Плавная ориентация и Наведение. Вот высокоуровневое представление о том, что делают эти черты:

  • Movement - Позволяет задать параметры движения для сущности. Параметрами могут быть различные скорости и режимы движения. Параметры можно добавлять и удалять в Настройки проекта->Масса->Движение массы.
  • Steering - Позволяет задавать параметры, управляющие поведением рулевого, такие как время реакции, порог скорости и время ожидания выбора цели движения.
  • Smooth Orientation - Позволяет задать направление движения с помощью весов, определяющих, как быстро он должен поворачивать и насколько сильно он хочет сохранять направление при движении.
  • Avoidance - Позволяет агентам избегать препятствий. Параметры, связанные с этим, включают расстояние для обнаружения препятствий, величину просвета для обхода препятствий и время, в течение которого нужно смотреть вперед для обхода.

Внутри трейта Movement добавьте стиль Default movement в массив Movement Styles. Остальные черты используют значения по умолчанию. Для Avoidance требуется добавить фрагмент Agent Radius Fragment с помощью трейта Assorted Fragments.

Помимо возможности передвигаться, сущности должны перемещаться по уровню с помощью ZoneGraph. Для этого добавьте признаки ZoneGraph Navigation и Navigation Obstacle. ZoneGraph Navigation позволяет сущности перемещаться и запрашивать данные ZoneGraph для интеллектуального перемещения по уровню. Навигационное препятствие устанавливает сущность как препятствие, которое нужно обойти, чтобы сущности не столкнулись друг с другом во время движения.

Раскройте все поля для признака ZoneGraph Navigation. В Lane Filter добавьте тег Default в поле Any Tags. Установите для параметра Радиус запроса значение 5000,0 см. У Navigation Obstacle нет полей, заданных в конфигурации сущности.

EntityConfig with the movement related traits added

Наделите сущность мозгами с помощью StateTree

Далее сущность должна иметь возможность найти место для перемещения. Это делается с помощью трейта StateTree , который позволяет назначать сущностям дерево StateTree, сконфигурированное со схемой Mass Behavior. Добавьте трейт StateTree в конфигурацию сущности.

Создайте новый актив StateTree либо в браузере содержимого, либо в выпадающем списке для трейта StateTree. Выберите схему Mass Behavior и назовите StateTree ST_MassNPC. В активе нажмите Add State и назовите его Wander. Добавьте еще одно состояние и назовите его Idle.

Для состояния Wander добавьте задачу ZG Find Wander Target и установите для раздела Allowed Annotation Tags значение Default для раздела Any Tags. Добавьте задачу ZG Path Follow в состояние Wander . Для ZG Path Follow привяжите Target Location к Wander Target Location задачи ZG Find Wander Target. Установите Стиль перемещения на По умолчанию. Добавьте переход, который по завершении состояния будет переходить в состояние Idle .

Wander state's configured tasks and transitions

В состоянии Idle добавьте задачу ZG Stand. Установите Длительность для задачи равной 1,5. Добавьте переход к состоянию, который переходит к корню, когда состояние завершается. Это очень базовое дерево StateTree для перемещения, а более продвинутые, функциональные и полные примеры можно найти в проекте City Sample.

Простое дерево состояний, которое бродит по ZoneGraph

В конфигурации сущности установите StateTree trait на использование ST_MassNPC asset. Проверьте и сохраните конфигурацию сущности.

Создание анимационного блупринта для Mass

Для анимации актеров, связанных с массой, создайте Animation Blueprint на основе скелета SK_Mannequin под названием ABP_Mass. Откройте блупринт и перетащите анимацию MF_Walk_Fwd из правого нижнего Asset Browser. Подключите выход анимации к выходной позе. Установите анимацию на цикл. Скомпилируйте и сохраните актив. Откройте BP персонажа, используемого для High Res Actor в Mass. Установите Anim Class для использования ABP_Mass. Это просто для того, чтобы в данном руководстве была анимация. Правильные чертежи анимации очень сложны и выходят за рамки данного руководства. Примеры полных чертежей анимации для Mass можно найти в проекте CitySample.

Обновление BP актера Mass

Внутри чертежа High Res Actor Blueprint добавьте к актеру компонент MassAgent . Чтобы актер мог правильно двигаться, информация о нем должна быть синхронизирована с Mass. Для этого необходимо создать новый конфиг сущности. Создайте новый конфиг сущности Mass и назовите его MassPuppetEntityConfig. В конфигурацию добавьте трейты для Agent Movement Sync и Agent Feet Location Sync. Установите Направление синхронизации для Agent Movement Sync на Mass to Actor, так как Mass будет обеспечивать движение сущности. Для Agent Feet Location Sync установите Sync Direction в Actor to Mass. Использование направления синхронизации Actor to Mass позволяет Mass реагировать на окружающий мир, влияющий на местоположение агента. В качестве примера можно привести столкновение агента с другими агентами или его перемещение под действием физики, например, на платформе лифта.

Mass puppet Entity Config

Признаки синхронизации поддерживают сущности Mass и их акторов в синхронизации и позволяют задавать направления синхронизации, чтобы любая из систем могла быть контролирующей. По умолчанию каждая система синхронизируется с другой, и ни одна из них не рассматривается как единственный источник истины. К другим признакам синхронизации относятся столкновение и ориентация капсулы. Все эти признаки являются частью секции MassActor плагина MassGameplay.

В панели Details компонента Mass Agent установите конфиг сущности на MassPuppetEntityConfig. Это позволит свойствам Sync работать с сущностью, порожденной для Mass.

Обновление визуализации массовой сущности

В конфигурации сущности разверните признак Visualization и установите Low Res Template Actor, чтобы теперь он использовал тот же BP, что и High Res Template Actor. Это необходимо, потому что признак Agent Movement Sync ожидает фрагмент обертки Character Movement Component. Сохраните конфиг сущности. запустите PIE, и сущности будут бродить по ZoneGraph с воспроизведением анимации.

Окончательный вид MassNPCEntityConfig с его признаками

Сделать массу осведомленной об игроке

Создание конфигурации сущности игрока

Создайте новый ассет Mass Entity Config Asset и назовите его MassPlayerEntityConfig. В конфигурацию добавьте следующие свойства: Navigation Obstacle и Agent Capsule Collision Sync. Поскольку игрок будет управлять актором, установите Направление синхронизации в Actor to Mass для признака Agent Capsule Collision Sync. Проверьте и сохраните конфигурацию сущности.

The player MassEntityConfig

Настройка персонажа игрока для использования с массой

Чтобы Mass работал с игроками и актерами, не порожденными MassRepresentation, к актерам должен быть добавлен компонент Mass Agent. Откройте блупринт, используемый для игрока по умолчанию. Добавьте к персонажу компонент Mass Agent. Установите Entity Config компонента Mass Agent на использование MassPlayerEntityConfig. Скомпилируйте и сохраните БП.

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

The NPCs wandering around the level with GameplayDebugger active