дерево-поведения-годо
Реализация GDScript дерева поведения для игрового ИИ, основанная на собственных узлах Годо и использующая встроенный редактор дерева сцен.
ВЕРСИЯ С# → https://github.com/MadFlyFish/godot-behavior-tree-csharp
УСТАНОВКА
- Скопируйте папку «addons» в основной каталог вашего проекта.
- Включите плагин в настройках проекта, ЗАТЕМ ПЕРЕЗАПУСТИТЕ Godot, иначе он не распознает новые классы (это ошибка движка).
- При желании вы также можете перетащить папку bt_example в основной каталог вашего проекта.
- Чтобы увидеть работу примера, запустите сцену Agent.tscn. Сцена ex_behavior_tree.tscn — это пример построения дерева.
ИНСТРУКЦИИ:
- Нажмите значок создания узла. Вы должны увидеть новые доступные узлы (если нет, перезапустите Godot). Вы должны использовать BehaviourTree в качестве корневого узла, который должен иметь только один дочерний узел. Этим дочерним элементом может быть любой из узлов категории BTNode, которые все наследуют от класса BTNode.
- После создания дерева поведения необходимо указать, кто является владельцем ИИ (Агента) и какой Blackboard используется. Доски можно разместить где угодно (при условии, что они находятся за пределами дерева) и даже разделить их между разными деревьями. Система достаточно гибкая, чтобы вы могли решить, как и когда обновлять данные на доске. Например, вы можете создать простой узел со сценарием, который обрабатывает обновление доски, например. с обратными вызовами сигналов или даже в процессе(). Или вы можете сделать это где угодно, даже изнутри дерева, просто убедитесь, что вы проектируете вещи так, чтобы вы могли их поддерживать и отслеживать.
- Дерево поведения выполняет каждый из своих дочерних элементов, которые возвращают какое-то состояние успеха или неудачи. Будут выполнены только те ветки, которые следуют за успешным узлом. BTNode должен возвращать либо успех, либо неудачу и может приостановить выполнение только с помощью вызова yield(), после чего он останется в рабочем состоянии до тех пор, пока выполнение не завершится. Когда BTNode находится в рабочем состоянии, дерево постепенно приостанавливает выполнение (за исключением BTParallel ), пока все дочерние узлы не завершат выполнение. Это сделано в целях оптимизации.
- Поток дерева определяется так называемыми составными узлами: BTSequence, BTSelector, BTRandomSelector, BTRandomSequence, BTParallel, которые все наследуют от BTComposite. Последовательность считается успешной, если все дочерние элементы успешны, и неудачной, если один из дочерних элементов терпит неудачу. Селектор является логической противоположностью: он успешен, если один дочерний элемент успешен, и терпит неудачу, если все дочерние элементы терпят неудачу. Параллельный процесс будет запускать все дочерние элементы и всегда будет успешным, БЕЗ ожидания завершения выполнения дочерних элементов. Базовый составной узел запускает все дочерние узлы и всегда завершается успешно, но также ожидает завершения выполнения.
- Действия вашего поведения ИИ выполняются в узлах BLeaf. Добавьте BTLeaf, затем выполните «расширить скрипт». Теперь вы можете определить собственное поведение в этом скрипте, переопределив метод _ick() . Ваши действия будут здесь. Обязательно прочитайте комментарии к базовому сценарию, чтобы узнать лучшие практики. Также помните, что у BLeaf не должно быть детей.
- BTDecorator используется для настройки выполнения дочернего узла. У них может быть только ОДИН ребенок.
- BTConditional — наиболее распространенный тип декоратора. Добавьте BTConditional и расширьте сценарий, затем переопределите метод _ pre_tick(), чтобы определить условия, при которых будет выполняться дочерний элемент. Обязательно прочитайте комментарий, потому что там есть полезный пример.
- BTGuards — это декораторы, которые можно использовать для временной блокировки ветвей. При желании вы можете назначить разблокировщик, который будет отменять указанное время блокировки. Также есть возможность назначить шкафчик. BTGuards может сделать ваше поведение очень богатым и реактивным, а также оптимизированным, поскольку они избегают ненужного ветвления и повторения.
- Другие декораторы позволяют зацикливать выполнение, обращать результат тика и т. д. Вы можете многое сделать, настроив выполнение с помощью декораторов.
- Хорошая практика — использовать предоставленные узлы и следовать шаблону проектирования дерева поведения. Но поскольку это реализация, основанная исключительно на коде, без какого-либо визуального редактора, у вас есть большой контроль над дизайном и, следовательно, допуск на ошибку. Это просто полезные скрипты, которые следуют некоторым «хорошим практикам», но не привязаны к ним, если бы не пара основных правил. Вам решать, как построить свое дерево поведения, но имейте в виду, что если вы будете использовать его неправильно, вы не получите выгоды от мощи шаблона дерева поведения. (например, вы могли бы даже использовать базовый BTNode для всего и просто расширять его каждый раз, хотя это было бы путаницей)
- У вас может быть огромное дерево поведения, но лучше всего следовать философии компонентов Годо и создать несколько меньших деревьев поведения для каждого компонента вашей сцены. Например, дерево для вашего контроллера движения, дерево для вашего контроллера оружия, дерево для вашего компонента поиска путей и т. д. Дерево поведения может иметь только одну доску, но одна и та же доска может использоваться многими деревьями, так что это особенно удобно, если вы хотите иметь несколько деревьев, не делая при этом несколько досок. Лично я использую доску как отдельный компонент потому, что хотел создать отряды врагов, использующих одни и те же данные, но ведущих себя независимо, так что это вариант использования. Более того, у моих актеров обычно есть несколько компонентов, и я хочу использовать одну и ту же базу данных для разных деревьев.