Selector
1 or 2 or 3
Selector - это одна из базовых нод в деревьях поведения. Она представляет собой композитную ноду, которая выполняет своих детей последовательно слева направо до тех пор, пока один из детей не вернет статус Success, либо пока все дети не вернут статус Failure.
Пример применения
Нода Selector полезна, когда нужно выполнить действия в порядке приоритетов. Если одно действие не выполнено успешно, Selector переходит к следующему действию в списке.
-
Выбираем бить скиллом или обычной атакой
Логика такая - проверяем, а можем ли мы атаковать скиллом (он готов, хватает MP и так далее). Если да - бьем скиллом и выходим. Если нет - бьем базовой атакой.
Обратите внимание, что будет выполнена ЛИБО атака скиллом, ЛИБО базовая атака. Т.е. если атака скиллом удастстя успешно, то до Execute Aura(2') дерево даже не дойдет -
Ротация скиллов - Selector + Sequence: А теперь давайте построим уже полноценную ротацию
![c5do0cg[1].png](/_wiki/assets/b5b11f4af3ac2cc641ec6c7180a8f00e6f052ef6356bb5f7c5916704f971ea11/assets/c5do0cg%5B1%5D.png)
Что же здесь происходит - для начала, мы используем ноду Sequence(1), которая объединяет еще одну Sequence(2) и Selector(5). Sequence(2) отвечает за проверки "А можем ли мы вообще бить?", т.е. мы живы и выбрана цель. В реальных примерах сюда еще могут примешиваться проверки HP, нахождения в городе и так далее. Если любая из проверок не выполнится - дерево уйдет на следующий цикл, так и не попытавшись атаковать. Если же мы живы и у нас есть цель, то дальше нужно выбрать "А как же именно мы будем атаковать выбранную цель?".
Для упрощения здесь всего 2 варианта:
- если у нас готов скилл Aura Is Active(7), то мы применим его Execute Aura(8), здесь внутри может быть тот же Send Sequence
- если скилл не готов - бьем базовой атакой
В реальных сценариях сама ротация может быть сильно сложнее - нужно проверять ресурсы(HP/MP/кулдауны), можно проверять приоритетность текущей цели (если мало HP у цели - нет смысла бить сильным скиллом) и т.п.
Работа ноды
- Нода Selector выполняет своих детей по порядку, начиная с первого слева.
- Если какой-либо ребенок вернул
Success, то Selector тоже вернетSuccessи прекратит выполнение остальных детей. - Если все дети вернули
Failure, то Selector вернетFailure. - Если все дети вернули
Running, то Selector также вернетRunningи продолжит выполнение с того места, где остановился.
Не путайте! Sequence останавливается на первой же ноде, которая вернула Failure, а Selector останавливается на первой ноде, которая вернула Success.
