AI
May 7

Обзор StateTree

Обзор системы StateTree.

Обзор

StateTree - это иерархическая машина состояний общего назначения, которая объединяет Selectors из деревьев поведения с States (состояния) и Transitions (переходы) из машин состояний. Пользователи могут создавать высокопроизводительную логику, которая остается гибкой и организованной.

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

При выборе состояния активируются все состояния от корневого до листового. Каждое состояние состоит из Tasks (Задач) и Transitions (Переходов).

При выборе состояния, выбранное состояние и все его родительские состояния становятся активными. Все задания выполняются для всех активных состояний, начиная с корня и заканчивая выбранным состоянием.

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

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

Другим примером может быть агент ИИ, который ходит по уровню и постоянно проверяет попадания, осматриваясь вокруг. У вас может быть состояние для ходьбы и осмотра, а другое - для реакции на попадание.

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

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

Это различные элементы дерева StateTree:

1 Корень Первое состояние, выбранное при запуске StateTree.

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

3 Условие входа в состояние Относится к списку условий, которые определяют, может ли состояние быть выбрано.

4 Задание Относится к набору действий, которые принадлежат состоянию и выполняются, когда состояние становится активным.

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

Поток выбора

Выбор нового состояния

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

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

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

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

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

StateTree запускает процесс выбора состояния по требованию, основываясь на переходах. При первом тике происходит неявный переход к корневому состоянию, который выбирает первое состояние для запуска. После того как состояние выбрано, переходы определяют, когда и где будет выполняться логика выбора.

Выполнение задач состояния

После выбора состояния все его задачи начнут выполняться параллельно. Задачи будут выполняться до тех пор, пока переход не запустит процесс выбора и не будет выбрано состояние. Выбранное состояние может быть текущим состоянием (состояние продолжает выполняться) или новым состоянием.

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

Поток данных

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

Для всех узлов дерева состояний доступны следующие общие типы данных:

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

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

Оценщики
Оценщики предоставляют способ передачи данных в дерево состояний, которые иначе невозможно было бы передать с помощью параметров или контекстных данных. Оценщики - это отдельный класс, который может быть выполнен в дереве состояний во время выполнения. Оценщики содержат переменные и могут выполнять пользовательский код при запуске, остановке и при каждом тике дерева. Свойства Evaluator могут быть привязаны к Parameters или Context Data, или к другим Evaluators, которые находятся перед ними в списке Evaluator.

Глобальные задачи
Глобальные задачи позволяют запускать задачи StateTree, которые активны между событиями запуска и остановки дерева. Глобальные задачи можно использовать, если вам нужны постоянные данные для выбора состояния. Например, в системе учета времени суток можно создать глобальную задачу, определяющую текущее время суток. Поскольку глобальные задачи запускаются до корневого состояния дерева, эта информация будет доступна при запуске дерева и во время первого выбора состояния.

Узлы StateTree могут обмениваться данными между собой. Различные элементы дерева StateTree могут связываться с данными следующим образом:

Условия ввода
Можно привязать к общим данным, а также к задачам во всех родительских состояниях.

Условия перехода
Могут связываться с общими данными и задачами из текущего состояния и всех родительских состояний.

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

Blueprint Integration

StateTree разработан для расширения с помощью сценариев Blueprint. Вы можете создавать пользовательские Задачи, Оценщики и Условия, расширяя следующие классы Blueprint:

UStateTreeTaskBlueprintBase
Базовый класс для задачи StateTree.

UStateTreeEvaluatorBlueprintBase
Базовый класс для оценщика StateTree Evaluator.

UStateTreeConditionBlueprintBase
Базовый класс для StateTree Condition.

Продолжая упомянутый ранее пример, вы можете создать систему времени суток, используя StateTree и Blueprints. Эта система будет изменять плотность тумана на уровне в зависимости от времени. Система также может проверять наличие заклинания шторма, чтобы изменить условия освещения независимо от времени.

Для этого примера вы можете создать следующие классы Blueprint:

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

Condition
Проверяет, было ли произнесено заклинание шторма. Это условие может быть оценено в корневом состоянии. Если оно истинно, то переводит выполнение в специальное состояние "Шторм".

Evaluator
Выставляет время суток для Переходов и Условий входа.

Общие закономерности

Группировка похожих задач

Задачи могут быть сгруппированы в рамках общего состояния. В приведенном выше примере есть состояние, которое управляет смарт-объектами в мире. Это состояние содержит дочерние состояния, которые обрабатывают достижение смарт-объекта и использование смарт-объекта.

Каждое из этих дочерних состояний содержит задачи, которые выполняются при выборе этого состояния. Дочернее состояние Reach содержит задачи, которые находят Smart-объект и перемещают агента ИИ к нему.

При использовании этой стратегии группировки все задачи имеют одинаковые переходы через состояние.

Последовательности

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

В приведенном выше примере, когда выбрано состояние Reach, выполняются задачи Find SO Target, Move to SO и Look. После выполнения этих задач переход Next переводит выполнение в состояние Use ниже, где его задачи могут начать выполняться.

Работа с отказами

StateTree обрабатывает сбой завершения задачи иерархически, начиная с активной задачи и поднимаясь вверх по дереву.

В приведенном выше примере состояние Reach Slot переведет выполнение в следующее состояние при успехе (Wait) или переведет выполнение в родительское состояние при неудаче (Wait at Intersection). Состояние Wait at Intersection вызовет переход в состояние Idling, если любое из его дочерних состояний завершится неудачей.

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

Иерархические данные

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

В приведенном выше примере задача Crowd Claim Wait Slot попытается занять слот Smart Object для агента ИИ, и если ей это удастся, она передаст выполнение задаче Move To Wait Slot. Эта задача будет использовать местоположение слота из родительской задачи. В случае успеха она передаст выполнение задаче Wait At Slot, которая также будет использовать местоположение слота из родительской задачи.

Уточненное поведение

StateTree обеспечивает способ организации Задач таким образом, что контекстное поведение может быть легко достигнуто.

В приведенном выше примере состояние Wait управляет стоянием агента ИИ - агент ИИ осматривается и реагирует на удары. По умолчанию будет выполнено состояние Wait Look. Если состояние успешно, оно вернет исполнение своему родителю. Однако в случае неудачи оно переместит выполнение в состояние Wait Hit.

Состояние Wait Hit выполняет задачи Mass LookAt и Mass Contextual Anim. Эти задачи воспроизведут соответствующую анимацию удара.