Пишу искуственный интеллект противника, суть такова: character определяет случайную точку на карте (таск) → движется к этой точке (move to) → стреляет в игрока (task). Система зациклена, так что после выстрела противник снова выбирает точку, движется к ней, стреляет и так далее.
Проблема в том, что я не знаю какой стоит выбрать composite для такой последовательности. Пробовал sequence, но после выполнения выстрела логика останавливается вне зависимости от результата выстрела (success или fail). При использовании Selector выстрел не происходит, так как move to выдает success.
Как всегда, нужен скриншот дерева)
Еще у БТ иногда случается такой баг что логика прекращает работать, фиксится вставкой между рутом и первым композитом еще один любой (кроме параллельного).
В итоге, попробуйте собрать схему: root->selector/sequence->sequence(в нем таск с поиском точки, затем мувту, затем таск со стрельбой)
Таск выстрела точно вызывает finish execution? Скрин таска стрельбы тоже добавьте
R1pp3R
Мне казалось, что я достаточно четко обрисовал структуру behavior tree, но раз нужен скриншот, то вот он:
Скрин таска по стрельбе:
Сейчас галочка не стоит и поэтому выполняется fail, но установка галочки ничего не меняет.
Странно. У меня несколько таких же сиквенсов и все нормально работают.
Видимо, проблема в функции Shoot. Попробуй там вместо каста и функции просто печатать что-нибудь. Интересно, тоже будет стопать или нет.
TommYMoonlight
> логика останавливается вне зависимости от результата
Вообще BehaviorTree перестает работать? Эта визуализация с выбранной желтым текущей веткой тоже не работает?
попробуйте между Root и Sequence добавить еще один Sequence (у БТ есть один баг - вполне возможно, что вы на него и наткнулись)
TommYMoonlight
> Сейчас галочка не стоит и поэтому выполняется fail, но установка галочки ничего
> не меняет.
галочка нужна будет, если этот таск вызывается из композитора Sequence, и за ним следует еще какая-то логика
Пока ты Success в Shoot не выставишь в TRUE, задача считается не выполненной и не может перейти к следующей задаче.
Это нужно для того, чтобы перезапускать задачу (самому или согласно твоей логике), в случае её не успеха.
То есть пока MoveTo например не вернёт Success (что мы дошли), выстрел не будет произведён.
Behavior Three логика автомата (если проще, логика автомата с газировкой). Где каждая цепочка выполняет свою роль, а в итоге переходит к следующему действию. Действий может быть много и все они последовательны и могут быть как бы сгруппированы для одного большого процесса, чтобы не мешать его с другим.
Вообще Вам имеет смысл пройти курсы с ютуба, даже любительские. Посмотрите как строить из таких блоков логику, как они применяются и почему именно таким способом. И вы поймете на сколько они сильно отличаются от привычной человеческой логики. И наверняка начнёте её строить обычными блоками в blueprint.
Сейчас понял, в чем проблема - у вас в таске стрельбы каст проваливается, соответственно, ни shoot ни finish execution не выполняются. Owner actor, скорей всего, возвращает ссылку на контроллер, а не на пешку (точно не помню), так что вам оттуда надо вытянуть ноду GetControlledPawn и ее к касту подключить.
П.с. когда работаете с behavior tree обрабатывайте все возможные исключения - cast failed тоже подключите к финишу, только с false результатом. Когда оставляете такие щели - это в 100% случаев аукнется
П.п.с. receive execution ai дает доступ и к контроллеруи к пешке - советую им воспользоваться вместо getControlledPawn
R1pp3R
> у вас в таске стрельбы каст проваливается, соответственно, ни shoot ни finish
> execution не выполняются
Это самый очевидный вариант, но
TommYMoonlight
> после выполнения выстрела логика останавливается
По какой-то причине выстрел происходит.
Что может остановить BT после выстрела вообще не понятно. Может ничего и не останавливается. Надо подождать автора.
TommYMoonlight
> Пишу искуственный интеллект противника, суть такова: character определяет
> случайную точку на карте (таск) → движется к этой точке (move to) → стреляет в
> игрока (task). Система зациклена, так что после выстрела противник снова
> выбирает точку, движется к ней, стреляет и так далее.
> Проблема в том, что я не знаю какой стоит выбрать composite для такой
> последовательности. Пробовал sequence, но после выполнения выстрела логика
> останавливается вне зависимости от результата выстрела (success или fail). При
> использовании Selector выстрел не происходит, так как move to выдает success.
FinishWithResult = Succeeded (в качестве последнего нода) в сиквенсе возвращает управление в начало сиквенса.
FinishWithResult = Failed в сиквенсе прерывает управление и возвращает его на более высокий уровень.
Сделай Select на более высоком уровне для нескольких задач. Например отдельно патрулирование и отдельно для того, что у тебя. И будет тебе счастье. У тебя в дереве нет выбора, поэтому по любому управление возвращается в начало цикла. Просто ты не оставил своему дереву выбора ИМХО.
Это как в тюремной камере:
-Вам не понравилось в камере? - Тогда выходите.
-Дверь закрыта? -Тогда выполните пункт 1...
Спасибо всем за помощь, проблема решена!
Отдельное спасибо R1pp3R, так как именно ваши советы помогли мне решить проблему.
Дерево построил таким образом:
С прежней структурой таск выстрела срабатывал, но сам выстрел не происходил, при этом при подключении в таск выстрела вместо самого выстрела Print String текст выводился. Решил данную проблему также по совету R1pp3R с помощью вытягивания GetControlledPawn и подключения ее к касту, получилась такая система:
В догонку. Мне недавно знакомы твои проблеммы. Если твоё дерево снова не сработает, то
https://youtu.be/e3jiTksusP0
не надо впадать в отчаяние.
просто сделай Build->Build Paths
ivashko
> просто сделай Build->Build Paths
Спасибо, возьму на заметку.
TommYMoonlight
Я на bt собаку съел)
Попробуйте после рута убрать тот селектор. Если юудет так же нормально работать - так и оставляйте
Тема в архиве.