Unreal engine 5
May 1

Обзор Smart Objects в Unreal Engine

Смарт-объекты представляют собой набор действий на уровне, который можно использовать через систему бронирования.

Обзор

Умные объекты (Smart Objects) - это объекты, размещенные на уровне, с которыми могут взаимодействовать агенты ИИ и игроки. Эти объекты содержат всю информацию, необходимую для взаимодействия. Смарт-объекты являются частью глобальной базы данных и используют структуру пространственного разделения. Это означает, что их можно запрашивать во время выполнения игры, используя такие фильтры, как область поиска вокруг агента и игровые теги (gameplay tag).

На высоком уровне Smart Objects представляют собой набор действий на уровне, который может быть использован через систему бронирования.

Важно отметить, что смарт-объекты не содержат логики выполнения. Вместо этого они предоставляют интерактору всю необходимую информацию для выполнения взаимодействия, в зависимости от его реализации. Каждый интерактор (агент или игрок) выполняет свою собственную логику реализации смарт-объекта.

Элементы смарт-объектов

Подсистема SmartObject

Подсистема SmartObject отвечает за отслеживание всех Smart Objects, доступных на уровне. Смарт-объекты автоматически регистрируются в подсистеме для доступа и отслеживания.

Эта подсистема автоматически создается в мире, когда активен плагин Smart Objects.

SmartObject Persistent Collection

SmartObject Persistent Collection - это размещаемый на уровне Актор, содержащий список смарт-объектов, которые всегда будут частью симуляции, независимо от того, загружены они или выгружены во время выполнения.

Обратите внимание, что на уровне может быть несколько SmartObject Persistent Collection или вообще ни одной. Коллекция влияет только на время жизни SmartObject'а, а не на то, будет ли он использоваться системой.

SmartObject Container

Контейнер SmartObject Container отслеживает группу смарт-объектов. Подсистема Smart Object Subsystem и постоянная коллекция Smart Object Persistent Collection используют его для выполнения определенных операций над SmartObject'ами.

Частым примером является объединение групп SmartObjects при добавлении постоянной коллекции в подсистему SmartObject Subsystem.

Компонент SmartObject

Компонент SmartObject можно добавить к любому Актору, чтобы отметить его как Смарт-объект на уровне. Компонент указывает на актив Smart Object Definition, в котором хранится конфигурация данного шаблона Smart Object.

Актор, содержащий компонент SmartObject, может быть загружен и выгружен во время выполнения с помощью Streaming. Если компонент SmartObject включен в любую из загруженных постоянных коллекций Smart Object, экземпляр во время выполнения будет оставаться активным в памяти и будет считаться частью симуляции независимо от состояния потоковой передачи компонента.

Если Actor, содержащий компонент SmartObject, порожден во время выполнения, то после выгрузки он не останется активным в памяти. Это происходит потому, что компонент не входит ни в одну из постоянных коллекций SmartObject.

Smart Object Definition

Определение смарт-объекта - Smart Object Definition - это ассет данных, который содержит неизменяемые данные, разделяемые между несколькими экземплярами времени выполнения смарт-объекта. Определение смарт-объекта хранит информацию о фильтрации, такую как требуемые пользователем теги, теги активности, теги активации объекта и стандартный набор определений поведения, которые могут быть использованы для взаимодействия со смарт-объектом.

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

Smart Object Behaviors Definition

Определения поведения умных объектов - Smart Object Behaviors Definition - содержат данные, необходимые агенту или игроку для определенного взаимодействия. В настоящее время доступны следующие типы определений поведения:

  • Mass Entity Behavior - содержит данные, используемые для настройки смарт-объектов, которые могут использоваться объектами Mass AI.
  • Gameplay Behavior - содержит данные, используемые для настройки смарт-объектов, которые могут быть использованы плагином Gameplay Behavior.

Течение выполнения

В этом разделе вы узнаете, как агенты взаимодействуют со смарт-объектом на уровне.

Данные агента

Для поиска смарт-объектов агент может использовать одну или несколько игровых тегов - gameplay tag, а также запрос меток (Activity Requirements), содержащий нужные теги на объекте. Эта информация будет использоваться при поиске подходящих смарт-объектов на уровне.

Данные интеллектуального объекта

Определения смарт-объектов (Smart Object Definition) могут содержать один или несколько тегов активности, которые используются для описания объекта. Они также могут содержать запрос тегов со списком желаемых тегов. Запрос тегов - это выражение, используемое для определения того, разрешено ли пользователю, запрашивающему использование смарт-объекта, взаимодействовать с ним.

Определение смарт-объекта содержит список определений поведения по умолчанию, которые будут использоваться для всех слотов. Если для слота назначено определенное определение поведения, то оно будет переопределять поведение по умолчанию.

Searching for a Smart Object

  1. Агент выполняет поиск близлежащих смарт-объектов с заданным интервалом. Агент выполняет поиск, вызывая метод FindSmartObjects в подсистеме Smart Object. Этот метод содержит пользовательские теги, теги активности, класс определения поведения и область поиска.
  2. Подсистема Smart Object находит все Smart Objects в области поиска, которые соответствуют всем заданным фильтрам.
  3. Подсистема Smart Object возвращает агенту результаты Smart Object Results. Результаты Smart Object Results представляют собой структурный массив, содержащий все совпадающие хэндлы Smart Object и их свободные слоты. На изображении выше вы можете видеть Smart Object автомобиля с одним свободным слотом, обозначенным кольцом зеленого цвета.

Утверждение смарт-объекта

  1. Агент выбирает нужный результат Smart Object Result и вызывает метод ClaimSmartObject в подсистеме Smart Object. В этом методе будет предпринята попытка заявить слот из смарт-объекта.
  2. Подсистема Smart Object пытается получить слот от Smart Object.
  3. Доступный слот занят в смарт-объекте, и его состояние установлено на Claimed.
  4. Подсистема Smart Object возвращает агенту Claim Handle.
  5. Агент проверяет, действителен ли Claim Handle. Если он действителен, то попытка утверждения была успешной, и он может перейти к следующему шагу. Однако если Claim Handle недействителен, агент может попытаться потребовать другой слот смарт-объекта из Smart Object Results. Требуемый слот не может быть потребован другим агентом до тех пор, пока он не будет освобожден агентом, который его потребовал.

На изображении выше слот 0 был занят агентом.

Подход к смарт-объекту

  1. Агент вызывает метод GetSlotLocation или GetSlotTransform в подсистеме Smart Object и передает Claim Handle. Этот метод возвращает положение или трансформацию заявленного слота. В качестве альтернативы, пользователи могут использовать следующий код C++ для получения трансформации слота:
FSmartObjectSlotView: FSmartObjectSlotView View = Subsystem->GetSlotView(ClaimHandle.SlotHandle); 

const FSmartObjectSlotTransform& SlotTransform = View.GetStateData<FSmartObjectSlotTransform>(); 

FTransform Transform = SlotTransform.GetTransform();
  1. Подсистема Smart Object возвращает агенту местоположение или трансформацию запрошенного слота.
  2. Теперь агент может начать навигацию к месту расположения слота на уровне. Агент может использовать любой способ навигации, чтобы добраться до места назначения.
  3. Агент прибывает в местоположение слота, вызывает метод Use в подсистеме Smart Object и передает ему Claim Handle.
  4. Метод Use вызывает изменение состояния заявленного слота. Состояние слота изменяется с Claimed на Occupied.
  5. Подсистема Smart Object возвращает агенту структуру Behavior Definition. Определение поведения содержит все необходимые данные для выполнения агентом желаемого поведения в месте расположения слота.

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

Высвобождение смарт-объекта

  1. Агент выполняет желаемое поведение, описанное в определении поведения.
  2. Как только поведение завершено или прервано, агент вызывает метод Release с обработкой Claim Handle в подсистеме Smart Object.
  3. Подсистема Smart Object изменяет состояние слота с Занято на Свободно.
  4. Теперь агент свободен для выполнения других задач или поиска другого интеллектуального объекта. Агенты несут ответственность за освобождение занятых ими слотов. Это может произойти, как только их поведение будет завершено или прервано.

Прерывание процесса

Описанный выше процесс может быть прерван или отменен агентом или смарт-объектом в любой момент.

Если состояние смарт-объекта изменится, он автоматически освободит все заявленные или занятые слоты и уведомит об этом соответствующих агентов через обратный вызов OnSlotInvalidatedDelegate. Частым примером является уничтожение смарт-объекта во время игрового процесса.

Агент также может прервать процесс в любой момент по любой причине. В этом случае агент отвечает за освобождение слота, чтобы другие агенты могли его занять. Частыми примерами являются смерть агента или выполнение другой задачи с более высоким приоритетом.