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

19

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

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

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

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

Проблема в том, что я хочу позвонить вражескому врагу, если враг рядом. И, учитывая, что Drive To Enemy всегда называют, у меня никогда не будет возможности позвонить Evade Enemy ( вероятно, следует называть Avoid Enemy ).

  • Должен ли я проходить дерево КАЖДОГО прохода независимо от того, какое действие выполняется в данный момент?
  • Я иду об этом правильным путем?
  • Как правильно обращаться с таким поведением?

Первоначально спросил на Stackoverflow. Мысль здесь будет более подходящим местом, чтобы задать этот вопрос.

Свободный Лансер
источник
1
Помог ли ответ, приведенный здесь? gamedev.stackexchange.com/questions/51693/...
Тетраду
Это тоже мой вопрос. Я собирался опубликовать этот вопрос в качестве комментария, но подумал, что это должен быть отдельный вопрос.
Свободный лансер

Ответы:

16

Смотрите изображение, которое я предоставил в моем предыдущем ответе :

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

Если вы представите, что узел 1 - «Уклонение от врага», а узел 2 - «Уклонение от врага», вы увидите, что даже во второй итерации (когда все зеленое, кроме «2», а «B» - когда вторая итерация начинается), 'Evade Enemy' все еще проверяется первым. Только когда «Evade Enemy» терпит неудачу, потому что поблизости нет врагов, «Chase Enemy» снова активируется. При повторном посещении «Chase Enemy» он замечает, что находится в состоянии «бега», и сразу переходит к «B».

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

Я не уверен, что вы собираетесь обрабатывать ваши узлы справа налево, но именно так вы, кажется, располагаете их (то есть, если вы уклоняетесь от врага, найдите врага справа от диска в противоположном направлении). Если вам нужны дальнейшие объяснения, вы должны задать в чате или в одном из ваших существующих вопросов по теме.

MichaelHouse
источник
2
Спасибо за еще одно замечательное объяснение. Мне было трудно понять рекурсивную природу Деревьев Поведения. Я собирался спросить вас в комментарии к последнему вопросу, но не хотел превращать комментарии в длинный QA. Последний вопрос, однако, теперь все это имеет смысл. Есть ли разница между селекторами и последовательностями в обработке состояний выполнения? Похоже, что Селектор (Узел 0) сначала проверил Узел 1, а последовательность «Узел 2» не проверила Узел А во второй итерации.
Свободный Лансер
4
Хороший вопрос, я думаю, вы поняли. Узел 2 не проверял узел A, потому что он был завершен. Когда узел 2 помечен как «Работающий», он отмечает, что узел B - это узел, который работает в данный момент. Вы можете предположить, что если узел работает, это означает, что предыдущие узлы не нужно проверять снова.
MichaelHouse
Вы сбрасываете Root Selector (0) на «READY» после того, как он был установлен на «RUNNING» после первой итерации?
Бесплатный Lancer
Я считаю, что только родительский узел запущенного узла настроен на работу. Корень должен быть настроен на готовность вместо запуска, потому что нам нужно снова проанализировать узел (1).
MichaelHouse
3
Это один из вариантов. Вы можете обновлять его так часто или нечасто, как вам нравится. Каждые 300 мс, если хотите, или каждый кадр. Или вы можете иметь фиксированное обновление, а также триггерное обновление для обработки любых событий. Деревья поведения, как и в большинстве подобных структур, строго не определены. Они должны использоваться наилучшим образом для вашей игры. Если оценивать каждый кадр слишком расточительно, не делайте этого. Вы также можете ограничить количество времени, затрачиваемое на оценку дерева, и выбрать следующий кадр, если хотите. Там много вариантов.
MichaelHouse