1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/anxin1225-BehaviourTree

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
Клонировать/Скачать
Внести вклад в разработку кода
Синхронизировать код
Отмена
Подсказка: Поскольку Git не поддерживает пустые директории, создание директории приведёт к созданию пустого файла .keep.
Loading...
README.md

Поведение дерева

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

Использование кода дерева поведения в этом проекте

Описание проекта

Код дерева поведения написан на Lua. Он основан на базовой грамматике Lua.

Для корпоративного проекта потребовался набор кода дерева поведения на Lua, поэтому мы взяли за основу код из игры «Голодные игры». Большинство узлов дерева поведения совпадают с узлами из «Голодных игр», но некоторые узлы были изменены из-за возможных требований.

Общее описание

Состояние дерева поведения делится на четыре типа:
* READY: состояние готовности, узел ещё не был вызван или был вызван, но после завершения был сброшен.
* RUNNING: выполняется, обычно родительский узел ожидает завершения дочернего узла перед тем, как установить своё состояние в завершённое. Однако некоторые узлы не учитывают состояние выполнения дочерних узлов.
* SUCCESS: выполнение успешно.
* FAILED: выполнение неудачно.

Большинство узлов имеют соответствующие китайские имена, хотя некоторые я не знаю, как перевести.

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

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

Узел дерева ###BehaviourTree

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

###BehaviourNode

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

###DecoratorNode (узел декоратора)

Не имеет реальной бизнес-логики, но обычно является родительским узлом только с одним дочерним узлом.

###ConditionNode (узел условия)

При создании этого узла передаётся метод, который может получить значение условия. Узел будет оценивать возвращаемое значение метода при выполнении и изменять своё состояние. Значение nil или false преобразуется в FAILED, в противном случае — в SUCCESS.

###ConditionWaitNode (условный ожидающий узел)

Аналогичен узлу условия, за исключением того, что он устанавливается в состояние RUNNING, если условие оценивается как FAILED.

###ActionNode (действующий узел)

Передаёт функцию при создании этого узла. Когда узел выполняется, функция вызывается, и состояние узла устанавливается в SUCCESS.

###WaitNode (ожидающий узел)

Время ожидания передаётся при создании узла. Состояние узла будет RUNNING до истечения времени ожидания. После окончания времени ожидания состояние узла изменится на SUCCESS.
Примечание: во время ожидания узел будет спать. Это делается для снижения нагрузки на производительность. Другие аналогичные функциональные узлы должны также обеспечивать соответствующий сон при написании.

###SequenceNode (последовательный узел)

Необходимо передать очередь узлов при создании этого узла. Дочерние узлы будут выполняться по очереди при выполнении этого узла. Если состояние дочернего узла — SUCCESS, то следующий узел будет выполнен; если состояние дочернего узла — RUNNING, то узел установит своё состояние как RUNNING и будет ждать других результатов; если состояние дочернего узла — FAILED, то узел установит своё состояние в FAILED и сразу вернётся. Если все узлы возвращают SUCCESS в конце, узел установит своё состояние в SUCCESS и вернётся.

###SelectorNode (выбирающий узел)

Аналогичен последовательному узлу, необходимо передать список узлов при его создании. Узлы в списке будут выполняться один за другим при выполнении этого узла. Если дочерний узел возвращает SUCCESS, узел установит своё состояние в SUCCESS и сразу вернётся; если дочерний узел находится в состоянии RUNNING, узел установит своё состояние как RUNNING и дождётся других результатов; если дочерний узел вернёт FAILED, узел выполнит следующий узел. Если ни один из узлов не вернёт SUCCESS, узел установит своё состояние в FAILED и вернётся.

###NotDecorator (инвертирующий узел)

Требуется передать дочерний узел при создании этого узла. Результаты выполнения дочернего узла, кроме RUNNING, будут инвертированы и возвращены.

###FailIfRunningDecorator

Требуется передать дочерний узел при создании этого узла. Кроме состояния RUNNING, результаты дочернего узла будут установлены как состояние этого узла; если состояние дочернего узла равно RUNNING, состояние этого узла будет установлено в FAILED. Затем возвращается.

###RunningIfFailDecorator

Требуется передать дочерний узел при создании этого узла. Все результаты дочернего узла, кроме FAILED, будут установлены как состояние этого узла; если состояние дочернего узла равно FAILED, состояние этого узла будет установлено в RUNNING. Затем возвращается.

###LoopNode (циклический узел)

Необходимо передать список узлов и максимальное количество циклов при создании этого узла. Циклический узел попытается выполнить N раз, прежде чем установит своё состояние в SUCCESS и вернёт результат. Логика выполнения аналогична логике последовательного узла, где состояние RUNNING дочернего узла блокирует выполнение следующего узла, а состояние FAILED дочернего узла прерывает выполнение.

###RandomNode (случайный узел)

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

###ParallelNode (параллельный узел)

Необходимо передать список узлов при создании этого узла. Узлы в списке выполняются один за другим. Если состояние дочернего узла равно FAILED, оно установит своё собственное состояние в FAILED и немедленно вернётся; если состояние дочернего узла равно SUCCESS или RUNNING, он выполнит следующий узел. Только когда все узлы вернут SUCCESS, этот узел установит своё состояние в SUCCESS и вернётся, иначе он установит своё состояние в RUNNING.
Примечание: некоторые узлы (ConditionNode, NotDecorator) принудительно перезапускаются перед выполнением для оценки.

###ParallelNodeAny

То же, что и ParallelNode, единственное отличие состоит в том, что этот узел установит своё состояние в SUCCESS, как только любой узел вернёт SUCCESS, и вернётся.

###WhileNode

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

###IfNode

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

###WeightSelectNode

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

Комментарии ( 0 )

Вы можете оставить комментарий после Вход в систему

Введение

Поведение дерева Lua, выделенное из голодного Lua-скрипта. Модификация дерева поведения для зависимости от файлов functions в Cocos2dx-lua вместо оригинальных файлов Class. Развернуть Свернуть
MIT
Отмена

Обновления

Пока нет обновлений

Участники

все

Недавние действия

Загрузить больше
Больше нет результатов для загрузки
1
https://api.gitlife.ru/oschina-mirror/anxin1225-BehaviourTree.git
git@api.gitlife.ru:oschina-mirror/anxin1225-BehaviourTree.git
oschina-mirror
anxin1225-BehaviourTree
anxin1225-BehaviourTree
master