Состояние как действие в дереве поведения

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

Например, ниже показано дерево поведения:

введите здесь описание изображения

Теперь давайте предположим, что поведение Drive To Enemy требует более чем нескольких итераций в дереве. Таким образом, при каждом проходе вызывается Drive To Enemy, потому что теперь он находится в состоянии running.

Проблема в том, что я хочу вызвать Evade Enemy, если враг находится поблизости. И, учитывая, что всегда вызывается Движение к врагу, у меня никогда не будет возможности вызвать Уклонение от врага (Вероятно, следует называть "Избегайте врага").

  • Должен ли я проходить КАЖДЫЙ проход дерева независимо от того, какое действие выполняется в данный момент?
  • Правильно ли я поступаю?
  • Каков правильный способ справиться с таким поведением?

person Free Lancer    schedule 18.03.2013    source источник


Ответы (1)


Я бы сказал, что каждый раз возвращаться к вершине будет вашим последним средством, если приведенная ниже идея не работает для вас:

Как предлагает Алекс Шампандар на своем веб-сайте aigamedev.com, вместо этого основная идея заключается в том, что, пока вы находитесь в поведении «Движение к врагу», вы включают какой-то способ запуска дополнительных проверок, чтобы убедиться, что поведение должно продолжаться.

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

Это будет выглядеть так:

  1. MainSelector:
    • Evade Enemy
      • Locate Enemy
      • Ехать в противоположном направлении
    • Parallel
      • Is Enemy Nearby?
      • Chase Enemy
        • Find path to enemy
        • Подъехать к врагу
        • Огнестрельное оружие
    • Chase Flag
      • Locate flag
      • Найти путь
      • Поездка к флагу

Узел «Параллельный» будет постоянно проверять «Враг рядом?» узел (с разумной скоростью), даже если выполнение находится глубоко в поддереве «Преследование врага». Момент «Враг рядом?» возвращает отказ, параллель немедленно вернет отказ и пропустит выполнение поведения «Преследование врага». Таким образом, следующая оценка вашего дерева достигнет поведения «Уклонение от врага».

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

Однако в том, как я спроектировал свою систему, я не использую параллельное поведение (не могу правильно использовать многопоточность со сторонним игровым движком, который я использую). Вместо этого у меня есть композит, который делает почти то же самое, только он оценивает проверки между обходами каждого из его дочерних элементов. Что-то вроде чередования, прыгающего туда-сюда от нормального выполнения к оценке проверок. Только если проверки не пройдены, мы прыгаем обратно наверх.

person Anomalous Underdog    schedule 31.03.2013
comment
Это интересное решение. Я также использую игровой движок, который не так хорош с многопоточностью, поэтому мне нравится ваша работа. Попробую реализовать что-то подобное. Кроме того, я просматривал учебные пособия Алекса Шампандара, и кажется, что его селектор повторялся по всему дереву, даже когда определенный узел был запущен, по крайней мере, его корневой селектор. - person Free Lancer; 01.04.2013