Разработка AI противников мобильной игры
ИИ-противник в мобильной игре — это баланс между «достаточно сложно, чтобы было интересно» и «достаточно предсказуемо, чтобы игрок чувствовал прогресс». Противник, который всегда выигрывает, убивает мотивацию за пять минут. Противник, который всегда проигрывает — через десять.
Иерархические State Machines vs Behaviour Trees
Для большинства мобильных игр выбор стоит между двумя архитектурами.
Конечные автоматы (FSM) — простые, предсказуемые, легко дебажатся. Враг в состоянии Patrol → видит игрока → переходит в Chase → теряет из виду → возвращается в Search → Patrol. Реализуется за несколько часов. Проблема: при усложнении логики граф состояний взрывается, условия переходов начинают пересекаться.
Behaviour Trees (BT) — иерархическая структура из Selector, Sequence, Condition, Action нод. Легче масштабируется, проще читается дизайнерами, поддерживает прерывания. Именно BT используют в большинстве AAA-игр, и именно их стоит использовать в мобильных играх с нетривиальной боёвкой.
Unity не имеет встроенного BT, но есть открытые библиотеки — Fluid Behaviour Tree, NodeCanvas (платный, но полный). Для Godot — Beehave plugin. Минимальная реализация BT:
// Unity: упрощённый Sequence node
public class SequenceNode : BehaviourNode {
private List<BehaviourNode> children;
private int currentIndex = 0;
public override NodeStatus Tick(AIContext context) {
while (currentIndex < children.Count) {
var status = children[currentIndex].Tick(context);
if (status == NodeStatus.Running) return NodeStatus.Running;
if (status == NodeStatus.Failure) {
currentIndex = 0;
return NodeStatus.Failure;
}
currentIndex++;
}
currentIndex = 0;
return NodeStatus.Success;
}
}
Perception: как AI видит мир
Ключевой вопрос — не «что делает противник», а «что он знает о мире». Без нормальной системы восприятия BT-дерево работает с телепатией: враг знает позицию игрока через стены, реагирует мгновенно.
Field of View — конус видимости с углом и дальностью:
bool CanSeePlayer(Transform enemy, Transform player, float viewAngle, float viewDistance) {
Vector3 dirToPlayer = (player.position - enemy.position).normalized;
if (Vector3.Angle(enemy.forward, dirToPlayer) > viewAngle / 2f)
return false; // за пределами угла обзора
float dist = Vector3.Distance(enemy.position, player.position);
if (dist > viewDistance) return false;
// Raycast проверяет, нет ли стен между ними
return !Physics.Raycast(enemy.position, dirToPlayer, dist,
LayerMask.GetMask("Obstacles"));
}
Hearing — звуковые события через очередь: шаги, выстрелы, падение предметов. Каждое событие имеет радиус и затухание. Противник реагирует на событие в радиусе, даже если не видит источник.
Memory — запоминаем последнюю известную позицию игрока. Если потеряли из виду, идём к этой позиции (не к текущей), потом переходим в Search.
Масштабирование сложности
Фиксированная сложность — плохо. Dynamic Difficulty Adjustment (DDA) адаптирует поведение под результаты игрока. Простые параметры для настройки:
| Параметр | Лёгкий | Средний | Сложный |
|---|---|---|---|
| Реакция на игрока | 1.2 сек | 0.6 сек | 0.2 сек |
| Угол обзора | 60° | 90° | 120° |
| Точность стрельбы | 40% | 70% | 90% |
| Время патрулирования | 8 сек | 5 сек | 3 сек |
Эти параметры загружаются из конфига — дизайнер меняет без перекомпиляции. DDA автоматически сдвигает параметры на основе win rate игрока за последние N сессий.
Производительность на мобильных устройствах
AI тики не должны выполняться каждый кадр. Для 20 противников на сцене:
- BT Tick: каждые 100–200ms вместо каждого кадра
- Raycast для видимости: через LOD — дальние враги проверяют реже
- Pathfinding: только при изменении цели, не при каждом тике
Unity NavMesh на мобильных устройствах работает хорошо, но пересчёт пути для всех агентов в один фрейм даёт спайк. Распределяем пересчёт через CoroutineManager или Job System.
Процесс работы
Анализ игровых механик и требований к поведению противников: сценарии, уровни сложности.
Проектирование архитектуры AI: выбор FSM / BT, система восприятия, memory.
Реализация базового поведения, интеграция с системой навигации (NavMesh).
Настройка параметров сложности, реализация DDA.
Плейтестинг и балансировка: измеряем смерти игрока, time-to-kill, win rate по уровням.
Ориентиры по срокам
Базовый FSM-противник с патрулированием и преследованием — 3–5 дней. Полноценная система с BT, восприятием, DDA и несколькими типами противников — 3–6 недель в зависимости от числа уникальных поведений.







