FSM и Behavior Trees
FSM — конечный автомат
NPC — в одном состоянии; переход триггерится событием (увидел игрока, получил урон, враг умер). Боевой пример:
Combat FSM переходы
Idle → Chase (игрок в радиусе видимости)
Chase → Attack (игрок в радиусе ближнего боя)
Attack → Chase (игрок отошёл)
Attack → Flee (здоровье < 25%)
Flee → Idle (дистанция > радиуса видимости)Сила: прост, отлаживаем (видно состояние), детерминирован (хорошо для replay), O(1)/кадр, дизайнер-френдли. Слабость: хрупок при 30+ состояниях; нет эмерджентности (не закодил — не случится); 100 NPC со сложными FSM = неподдерживаемо.
Behavior Tree — индустриальный стандарт
DAG иерархических решений, обход в глубину слева-направо. Узлы: композиты (Sequence — до первой неудачи; Selector — до первого успеха; Parallel), декораторы (Inverter, Repeater, Condition-guard), действия (листья). Каждый возвращает Success/Failure/Running.
Halo 2 Elite — боевой BT (упрощённо) дерево
Root (Parallel)
├─ Sequence: Combat
│ ├─ Condition: враг виден?
│ ├─ Selector: стратегия атаки
│ │ ├─ Sequence: ближний бой (в радиусе? → Attack)
│ │ ├─ Sequence: граната (в радиусе? есть? → Throw)
│ │ └─ Sequence: дальний (есть оружие? → Shoot)
│ └─ Action: тактическое перемещение
└─ Sequence: Patrol (Condition: враг не виден)Сила: иерархичность (стратегия + тактика), переиспользуемые поддеревья, визуализируется в редакторе, эмерджентность от взаимодействия поддеревьев. Слабость: всё ещё рукотворно; обход сложного дерева каждый кадр стоит денег. Halo 2 (2004) вышла на BT, Bungie написала постмортем — и понеслось: теперь BT в Unreal, Unity, Godot.
🕹 В какие игры поиграть — и что заметить
Одна задача «решить, что делает NPC» — три ступени сложности: жадный автомат на перекрёстке, дерево поведения, планировщик. По каждой: как сделано и во что сыграть, чтобы увидеть это руками.
Минимум: у каждого призрака крошечный автомат из режимов Scatter / Chase / Frightened (глобальный таймер их переключает), а внутри Chase — жадный выбор клетки к своей цели. Никакого дерева, никакого планирования: четыре простых FSM дают эмерджентную «облаву», потому что цели разные (Blinky — в клетку Пакмана, Pinky — на 4 впереди).
🎮 Сыграй: запусти Pac-Man, выучи ритм — призраки разом разворачиваются, когда таймер щёлкает Scatter↔Chase (это переход состояния FSM, видимый глазом). Слопай power-pellet → все уходят в Frightened. Ты буквально смотришь на конечный автомат.
Игра, с которой BT стали индустрией. Поведение элиты — дерево: Selector выбирает стратегию (ближний бой / граната / стрельба / отступление), Sequence проверяет условия. Видимый результат — враги, которые отступают под огнём, ищут укрытие и перегруппировываются, а не тупо прут.
🎮 Сыграй: в Halo 2/3 (или MCC) прижми элиту плотным огнём — заметь, как он разрывает дистанцию и прячется, а добитый до паники сородич бежит. Это Selector, спускающийся по приоритетам, и узлы Condition по здоровью — поведение, читаемое снаружи.
Следующий уровень: не «дерево заранее», а планировщик. GOAP Джеффа Оркина (Monolith) адаптирует STRIPS-планирование 1971-го: у NPC есть цель (убить игрока) и действия с предусловиями/эффектами; автомат-планировщик на лету строит цепочку под ситуацию. Отсюда легендарные солдаты-реплики: фланги, подавление, переворот столов в укрытие — никем не заскриптовано, всё выведено из целей и доступных действий.
🎮 Сыграй: в F.E.A.R. вступи в перестрелку в комнате со столами/окнами и послушай переклички («Flush him out!», «Flanking!») — они озвучивают план. Заблокируй один путь — увидишь, как враги перепланируют обход. Это GOAP, ищущий новую цепочку действий в реальном времени.
Хардкор: автоматная теория за FSM и BTможно пропустить
Moore vs Mealy
В Moore-автомате выход зависит только от состояния; в Mealy — от состояния и входа. Игровые FSM — гибрид: поведение привязано к состоянию (Moore-стиль), но переходы несут действия (Mealy-стиль). Mealy при том же поведении нужно меньше состояний.
Выразительность: FSM ⇔ регулярные языки
Конечный автомат распознаёт ровно регулярные языки. У него нет стека → он не считает неограниченно и не обрабатывает произвольно вложенное/рекурсивное поведение (нужен магазинный автомат). Практически: чистый FSM не «помнит», сколько раз что-то случилось, без явного состояния под каждый счётчик.
Почему BT, а не гигантский switch
Плоский FSM, кодирующий k независимых булевых условий, требует до 2^k состояний (взрыв состояний). Иерархические автоматы (HFSM) и BT факторизуют эту комбинаторику композицией — это и есть их реальный выигрыш, а не «больше вычислительной мощности».
Семантика BT как булева алгебра
Sequence = И с коротким замыканием (∧), Selector = ИЛИ (∨), Inverter = ¬. BT без статуса Running — монотонное и-или-дерево над условиями, то есть вычисление булевой функции. Статус Running добавляет время, превращая дерево в трансдьюсер по тикам. Тик — O(числа узлов) в худшем; реактивный BT переобходит от корня каждый кадр (в отличие от событийного FSM).
Хардкор · инженерия: где реально берутся баги game-AIможно пропустить
- Инструменты важнее теории: 90% времени — отладка «почему NPC застрял». Визуальный дебаг текущего состояния / активного узла BT экономит дни.
- Data-driven authoring: деревья/таблицы переходов в данных, не в коде — чтобы дизайнер правил без пересборки. Граница «код vs данные» — ключевое архитектурное решение.
- Развязка с фреймрейтом: логика AI часто тикает реже рендера (10–20 Гц) и амортизируется по кадрам — 200 NPC с BT на 60 Гц положат фрейм.
- Источник багов №1 — состояние: рассинхрон blackboard, гонки перцепции и решения, «залипшие» переходы. Детерминизм FSM здесь — спасение для воспроизведения.
Бэкенд / оркестрация: workflow-движки (Temporal, Step Functions) = state machines; протокольные автоматы (TCP), регэкспы, парсеры — всё FSM.
ML / AI: агентные циклы и tool-use — это BT/FSM поверх LLM (дерево решений с условиями и фолбэками); constrained/structured decoding = конечный автомат над токенами (грамматика гарантирует валидный JSON). Марковские цепи = вероятностные FSM.
UI / системы: состояния компонентов (XState), retry/circuit-breaker — машины состояний.
Принцип: явная модель состояния отлаживаема и тестируема; где «поведение по режимам» — там FSM/BT, в любой сфере.
FSM и BT эквивалентны по выразительности?
Почему не один гигантский switch на все случаи?
Sequence/Selector — это буквально и-или дерево?
Чем HFSM отличается от BT, если оба факторизуют состояние?
FSM — это марковская цепь, а если переходы вероятностные?
- Bungie, постмортем AI Halo 2 (GDC) — почему BT стали индустрией.
- «Behavior Trees in Robotics and AI» (Colledanchise & Ögren) — строгая формализация.
- Модуль 11, разделы 1.1–1.2 — полный текст с псевдокодом.