Почему юниты в StarCraft 2 не всегда атакуют ближайшую цель

В StarCraft 2 иногда происходит ситуация, которая на первый взгляд выглядит как ошибка искусственного интеллекта: рядом с вашим юнитом находятся несколько противников, но он атакует не ближайшего. Игрок ожидает простой логики — чем меньше расстояние до цели, тем выше вероятность атаки. Однако в реальности автоматический выбор цели в StarCraft 2 устроен значительно сложнее.

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

Эта механика относится к автоматическому выбору целей и работает, когда игрок напрямую не указал конкретного противника. Она применяется, в частности, при командах Stop, Hold Position, Patrol, Attack-Move и Follow Ally. При прямой команде Attack Target игра уже не выбирает цель самостоятельно.

Как юнит выбирает цель в StarCraft 2

У автоматического выбора цели есть определённая иерархия. Игра рассматривает подходящие цели в радиусе сканирования оружия и сравнивает их по нескольким критериям.

В упрощённом виде порядок выглядит так:

  1. Представляет ли цель угрозу для юнита?
  2. Каков её Attack Target Priority — приоритет цели для атаки?
  3. Позволяет ли цель использовать основное оружие юнита?
  4. Какая цель ближе — если предыдущие условия одинаковы?

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

Есть ещё один важный нюанс: после выбора цели юнит не обязан постоянно пересматривать весь список противников. Если выбранная цель остаётся допустимой, он продолжает атаковать её. Переключение происходит, например, если цель погибла, стала недоступной, вышла из дальности оружия или в радиусе обнаружилась более приоритетная цель.

Именно это часто создаёт впечатление, будто юнит «не замечает» врага, который находится буквально рядом.

Почему ближайший враг может быть проигнорирован

Представим простую ситуацию. У вас есть боевой юнит, а перед ним находятся два противника:

  • первый находится в двух клетках и не атакует;
  • второй находится чуть дальше, но уже ведёт огонь по вашему юниту.

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

Это один из главных принципов автоматического выбора целей в StarCraft 2: атакующий противник обычно важнее просто близкого противника. В документации механики угроза стоит выше остальных критериев выбора.

Есть и специальные типы юнитов, которые система рассматривает как угрозу даже при определённых ограничениях их оружия. В эту категорию входят, например, некоторые заклинатели и специализированные боевые единицы — среди них High Templar, Oracle, Disruptor, Widow Mine, Raven, Infestor, Swarm Host и Viper.

Поэтому иногда автоматическая атака может выбрать цель, которая с точки зрения игрока кажется не самой очевидной.

Что такое Attack Target Priority

Второй важный параметр — Attack Target Priority (ATP), то есть приоритет цели для атаки.

У типов юнитов и зданий есть определённые значения этого параметра. Чем выше значение, тем привлекательнее объект для автоматического выбора, если предыдущий критерий — угроза — не дал однозначного результата.

У большинства обычных боевых юнитов и ряда оборонительных сооружений приоритет находится на уровне 20. У многих обычных зданий он значительно ниже — 11. При этом существуют отдельные исключения: например, заполненный бункер, планетарная крепость и некоторые оборонительные сооружения имеют повышенный приоритет.

Поэтому расстояние между объектами само по себе ничего не гарантирует.

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

Именно этот принцип объясняет многие ситуации, которые игроки воспринимают как «странное поведение» автоматической атаки.

Почему атакующий юнит часто важнее ближайшего

Особенно хорошо механика заметна во время массовых сражений.

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

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

Есть показательные примеры. Void Ray при определённых условиях предпочитает Marine Marauder, потому что Marine считается угрозой для него, тогда как Marauder не может атаковать воздушную цель. Зерглинги, в свою очередь, могут выбрать заполненный Bunker вместо более близкого Supply Depot: заполненный бункер представляет угрозу, а обычный склад — нет.

Получается парадоксальная на первый взгляд ситуация: более дальняя цель может оказаться для игры «ближе» с точки зрения приоритета.

Когда расстояние действительно становится главным критерием

Расстояние вступает в игру после более важных критериев. Если среди доступных целей нет различий по угрозе, Attack Target Priority и возможности использовать основное оружие, тогда система может выбрать ближайшую.

Но здесь есть важное условие: речь идёт прежде всего о ситуации, когда юниту требуется выбрать новую цель.

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

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

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

Почему разные юниты выбирают цели по-разному

StarCraft 2 не использует абсолютно одинаковый алгоритм для каждого юнита.

Например, Hellbat, Thor, Battlecruiser и Ultralisk при последнем этапе выбора могут ориентироваться не просто на расстояние, а на угол поворота, необходимый для атаки. Это позволяет крупным и тяжёлым единицам не совершать резких разворотов между несколькими почти одинаково удалёнными целями.

Для игрока особенно заметно это может быть на Thor и Battlecruiser. Если вокруг такого юнита находится несколько противников, он не обязательно выберет объект с минимальной дистанцией. Более выгодным с точки зрения алгоритма может оказаться тот, в сторону которого оружию требуется повернуться меньше.

Ещё интереснее ведут себя Colossus, Immortal и Siege Tank без осадного режима. Эти юниты при соответствующих условиях ориентируются на расстояние до предыдущей цели, а не просто до себя. Такой подход позволяет оружию меньше дёргаться между расположенными рядом противниками.

Именно поэтому попытка вывести универсальное правило «все юниты бьют ближайшего» быстро приводит к исключениям.

Примеры выбора цели в StarCraft 2

Рассмотрим несколько типичных ситуаций.

Marine против двух целей. Если один противник уже атакует Marine, он может получить приоритет над более близкой, но неатакующей целью.

Zergling рядом с Bunker и Supply Depot. Заполненный Bunker является угрозой и имеет высокий приоритет, поэтому зерглинг не обязан атаковать ближайший Supply Depot.

Mutalisk против Marine и Missile Turret. Обе цели могут считаться угрозами, но Marine имеет более высокий Attack Target Priority, поэтому автоматический выбор может отдать предпочтение ему, несмотря на расстояние.

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

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

Таким образом, одинаковая команда Attack-Move у разных юнитов не означает абсолютно одинаковое поведение.

Можно ли заставить юнит атаковать именно ближайшую цель

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

Самый надёжный вариант — дать прямой приказ на атаку выбранной цели. В этом случае игрок сам определяет объект атаки, и автоматический алгоритм выбора цели не решает, кого атаковать вместо него.

Это принципиально отличается от Attack-Move. При Attack-Move юнит перемещается к указанной точке и самостоятельно выбирает подходящие цели по описанной выше системе. При обычном Move автоматический выбор боевой цели вообще не является основной частью поведения.

Поэтому в микроконтроле StarCraft 2 ручной фокус-фаер остаётся важнее надежды на то, что игровой ИИ сам выберет нужного противника.

Почему кажется, что юниты «атакуют неправильно»

Причина обычно не в случайности и не в том, что игра просто «не умеет определять ближайшего врага».

Автоматическое наведение в StarCraft 2 учитывает сразу несколько параметров: угрозу, приоритет цели, особенности оружия и расстояние. Причём расстояние находится в нижней части этой иерархии. Дополнительные исключения существуют у отдельных юнитов, которые используют угол поворота или положение предыдущей цели.

Более того, Blizzard продолжает исправлять отдельные ошибки, связанные с выбором целей. Например, в патче StarCraft II 5.0.15 разработчики исправили проблему, из-за которой система наведения Материнского корабля чрезмерно отдавала приоритет низкоприоритетным целям вроде личинок. В том же обновлении была исправлена ошибка, из-за которой высаженные из транспорта юниты не атаковали ближайшие к ним цели.

Это важное различие: предусмотренная механика и баг — не одно и то же. Если юнит не атакует ближайшего врага, это ещё не означает ошибку. Чаще всего он просто следует правилам автоматического выбора цели.

Если вы играете не только в Стар Крафт 2, но и в vulcan-bonusy.com то играйте осмотрительно с умом. В прочем у меня сейчас этот сайт не доступен.

Главное, что нужно запомнить

Юниты в StarCraft 2 не обязаны атаковать ближайшую цель. Игра использует многоуровневую систему автоматического выбора.

Сначала учитывается, представляет ли противник угрозу. Затем сравнивается Attack Target Priority, после чего учитывается возможность применения основного оружия. Только если эти критерии не позволяют выбрать однозначную цель, начинает играть роль расстояние.

При этом уже выбранная цель может сохраняться до тех пор, пока остаётся допустимой. А отдельные юниты — Thor, Battlecruiser, Hellbat, Ultralisk, Colossus, Immortal и Siege Tank — имеют дополнительные особенности выбора между равнозначными целями.

Поэтому, если ваш юнит игнорирует ближайшего врага, первое, что стоит проверить, — не атакует ли этот противник вашего юнита, не имеет ли более высокого приоритета и не действует ли у данного типа юнита особое правило выбора цели. В большинстве случаев это не странность, а вполне конкретная механика StarCraft 2.

04.10.2018