Unreal EngineСтатьиИгровая логика и ИИ

Behavior Trees в Unreal Engine 4

Автор:

Для программирования логики поведения искусственного интеллекта в Unreal Engine, используется Behavior Tree - древовидная структура которая задаёт действия для выполнения и условия для них. В этой статье будут описаны отличия реализации Behavior Tree в Unreal Engine 4 от классических реализаций. Кроме того приведен полный перечень имеющихся узлов для Behavior Tree с описанием.

UELOGO | Behavior Trees в Unreal Engine 4

  Ресурсы используемые в Behavior Tree
Отличия Behavior Tree в Unreal Engine
  1. Behavior Trees в Unreal Engine являются событийно-ориентированными (event-driven)
  2. Условные выражения не являются листьями узлов в дереве
  3. Специальная обработка для параллельного поведения
    Почему бы не использовать узлы Parallel?
    Что использует UE4 вместо узлов Parallel?
  Преимущества подхода UE4 к Одновременным Поведениям
Частые вопросы
Руководство по узлам Behavior Tree
Composite - составные узлы
  Узел Selector
  Узел Sequence
  Узел Simple Parallel
Decorator
  Blackboard
  Compare Blackboard Entries
  Composite
  Conditional Loop
  Cone Check
  Cooldown
  Does Path Exist
  Force Success
  Gameplay Tag Condition
  Is Blackboard Value of Given Class
  Keep in Cone
  Loop
  Reached Move Goal
  Set Tag Cooldown
  Tag Cooldown
  Time Limit
Узлы Services
  Default Focus
Узлы Tasks
  Make Noise
  Move To
  Play Sound
  Run Behavior
  Run EQS Query
  Wait
  Wait Blackboard Time

Ресурсы используемые в Behavior Tree

Behavior Tree - Это обработчик искусственного интеллекта. Он принимает решения и действует в зависимости от принятых решений.
Blackboard - Это память искусственного интеллекта. Она хранит значения, которые используются в Behavior Tree, в виде пары ключ-значение.

Отличия Behavior Tree в Unreal Engine


Этот раздел предназначен для тех людей, которые знакомы с Behavior Tree, и хотели бы погрузиться в реализацию Behavior Tree на Unreal Engine 4 как можно быстрее.
Для тех, кто не использовал Behavior Tree раньше, для вас некоторые объяснения будут запутанными.

Есть три важных отличия Behavior Tree в Unreal Engine от стандартных реализаций.

1. Behavior Trees в Unreal Engine являются событийно-ориентированными (event-driven)


Behavior Trees управляемые событиями не выполняют работу каждый кадр. Вместо того, чтобы постоянно проверять, имело ли место соответствующие изменение, Behavior Tree просто пассивно ожидает «события», которое может вызвать изменения в дереве.

Наличие событийно-ориентированной архитектуры, предоставляет возможности улучшения производительности и отладки. Однако, чтобы использовать эти преимущества, вы должны понимать отличия нашей реализации Behavior Trees.

Поскольку код не должен перебирать все дерево каждый кадр, производительность намного лучше! Концептуально, вместо того, чтобы постоянно спрашивать: «Мы идём?», Мы можем просто "отдохнуть" до тех пор, пока мы не получим сигнал "Мы идём!"

2. Условные выражения не являются листьями узлов в дереве

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

Создание условий как декораторов вместо задач, имеет несколько существенных преимуществ.

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

Изображение

В этом разделе дерева, декораторы Close Enough и Blackboard  могут предотвратить выполнение дочерних узлов последовательности (Sequence).

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

3. Специальная обработка для параллельного поведения

Стандартные деревья поведения часто используют составной узел - Parallel, для обработки параллельных поведений. Параллельный узел начинает выполнение всех своих дочерних узлов одновременно. Специальные правила определяют, как действовать, если один или несколько из этих дочерних узлов завершает работу.

Параллельные узлы не обязательно многопоточны (когда задачи выполняются действительно в одно и тоже время). Это просто способ концептуально выполнять несколько задач одновременно. Часто они работают на том же самом потоке и начинают работу последовательно. Эта последовательность не имеет значения, так как всё будет происходить в том же самом кадре, но это иногда важно.

Вместо сложных параллельных узлов, деревья UE4 используют простые параллельные, Simple Parallel, узлы и наш собственный тип специального узла, который мы называем Service - служба, для достижения тех же видов поведения.

Почему бы не использовать узлы Parallel?

  1. Параллельные узлы могут быть очень запутанными, даже для относительно простых форм поведения.
    Фактически параллельные узлы это когда одновременно работает куча отдельных под-деревьев, но некоторые, или все, из этих под-деревьев, возможно, придется прервать, когда одно из них завершается неудачно или успешно, когда другие завершились (успешно или неудачно). Параллельные формы поведения могут сбивать с толку даже в простых случаях, и даже с некоторым количеством настроек которые потенциально доступны, это весьма запутанно.
  2. Параллельные узлы более трудны для оптимизации, особенно с точки зрения создания управляемых событиями деревьев.

Что использует UE4 вместо узлов Parallel?


Есть три типа узлов которые вы можете использовать для реализации функциональности узлов  Parallel:

Узел Simple Parallel
Узлы Simple Parallel позволяют иметь только два дочерних узла: один узел должен быть узлом одной задачи, а второй может представлять собой поддерево.

Вы можете думать о ходе выполнения узла Simple Parallel в таком виде: «Пока выполняется задача A, делать B». Например, «Пока атакуем противника, двигаться в его направлении». То есть A - это основная задача, а B - это вторичная задача или некие действия которые выполняются пока выполняется задача A.

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

Узлы Simple Parallel позволяют легко использовать некоторые событийно-ориентированные оптимизации. Узлы Full Parallel были бы гораздо более сложными для оптимизации.


Узлы Services
Службы (Services) - с это специальные узлы которые связаны с любым составным узлом (Selector (Селектор), Sequence (Последовательность), или Simple Parallel (Простой параллельный узел)), которые могут регистрироваться для обратного вызовы каждые X секунд и выполнять определенные задачи которые должны возникать периодически.

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

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


Декоратор свойства "Observer Aborts"
Один общий случай использования для стандартных параллельных узлов - постоянно проверять условия, при которых задача может прервать выполнение, если требуемые условия не соблюдаются. Например, если у вас есть кошка, которая выполняет последовательность, такую как "Вилять телом" и затем "Атаковать", вы можете прекратить его выполнение, если мышь убегает в нору. С параллельными узлами, вы бы имели дочерний узел, который проверяет, можно ли наброситься на мышь, а затем еще один дочерний узел -  это последовательность для выполнения. Так как наше поведение управляется событиями, мы вместо того, чтобы следить за условиями, имеем условные декораторы которые наблюдают за значениями и при необходимости прерывают выполнение.

Преимущества подхода UE4 к Одновременным Поведениям

Частые вопросы

"Можете ли вы действительно делать всё то, что вы могли бы делать с использованием узлов Parallel?"

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

"Это только различия между Behavior Trees из Unreal и стандартом Behavior Trees"

"Стандарт" в кавычках. В действительности нет такого понятия, как "стандарт" для Behavior Tree, так что может быть любое количество различий между реализацией UE4 и независимой реализацией с которой вы знакомы. Если вы знакомы с необычной реализацией, она может иметь другие важные различия, и вероятно есть  более тонкие различия. Надеемся, что эти заметки дают вам представление о наиболее важных отличиях касающихся того, как как вам нужно будет строить свои деревья. Для получения более подробной информации о наших специальных типах узлов, читайте разделы об этих узлах.

Страницы: 1 2 3 4 Следующая »

#ИИ, #Behavior tree, #Unreal

30 сентября 2016 (Обновление: 1 июня 2020)

Комментарии [14]