У врага есть несколько состояний, основанных на осведомленности, управляемых непрерывным значением подозрения (0,0 .. 1,0), исходящим от системы восприятия (шум, зрение и т. д.).
государства высокого уровня:
- [/b]
Код: Выделить всё
COOL / PATROL
Поведение по умолчанию при незначительном подозрении. - [/b] (≈ подозрительность 0,2 – 0,4)
Код: Выделить всё
INVESTIGATE
Противник перемещается к последней известной позиции раздражителя и производит короткие следственные действия. - [/b] (≈ подозрительность 0,4 – 0,6)
Код: Выделить всё
SEARCH
Более активное поисковое поведение (оглядывание, сканирование, ожидание). - [/b] (≈ подозрение > 0,6)
Код: Выделить всё
CHASE
Полностью реактивное преследование игрока.
- Если игрок опознан в любой момент, противник должен немедленно прервать все, что он делает, и переключиться на ПОГОНИ.
- Как только враг начнет ИССЛЕДОВАТЬ или ПОИСК, он должен завершить небольшую последовательность действий (двигаться → смотреть → ждать и т. д.), прежде чем вернуться в режим ХОЛОД.
- Он не должен переключаться между состояниями в каждом кадре только потому, что подозрения слегка колеблются.
Корневой узел — это динамический GuardSelector, примерно такой:
Код: Выделить всё
root
dynamicGuardSelector
(identified?) sequence
chase
(suspicious?) sequence
search
wait ...
(irritated?) sequence
investigate
wait ...
$idlePatrolLoop
Основная проблема
dynamicGuardSelector обеспечивает реактивность, которую я хочу, но очень затрудняет обязательство:
- Защитники переоцениваются каждый тик.
- Ветви с более низким приоритетом могут быть прерваны в любой момент.
- Если действие или последовательность зависят от флагов или таймеров, установленных в enter()/exit(), прерывания могут привести к:
таймеры будут сброшены навсегда - код очистки никогда не запустится
- «липкие» состояния (например, isInvestigating никогда не становятся ложными)
- или наоборот: потеря связи между шагами последовательности
Я попробовал несколько подходов:
- Декораторы в стиле защелки
/> - Логические значения Blackboard (isInvestigating, isSearching и т. д.)
- Начать/завершить действия вокруг последовательностей
Что я пытаюсь сделать Достичь (концептуально)
Мне нужен ИИ, который:
- Немедленно реагирует на события с более высоким приоритетом.
- Выполняет действия с более низким приоритетом достаточно долго, чтобы выглядеть намеренно.
- Может быть состоит из множества небольших действий без хрупкой логики флагов.
- Достаточно хорошо масштабируется по мере увеличения количества состояний и действий.
Как это обычно решается в libGDX / libgdx-ai?
Как вы обычно моделируете прерываемое, но обязательное поведение без создания хрупкой логики пользовательского состояния?
Будем очень признательны за любые архитектурные рекомендации или примеры.
Подробнее здесь: https://stackoverflow.com/questions/798 ... -behaviors
Мобильная версия