Guides / Как перемещать группы юнитов в Unity
Unity Development Guide

Как перемещать группы юнитов в Unity

Практическое руководство по перемещению групп юнитов в Unity с сохранением позиций формации, направления, перегруппировки и плавного движения.

Почему движение группы отличается

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

Храните позиции формации относительно группы

Практичный подход — хранить позицию каждого юнита как offset относительно anchor формации. Anchor может быть лидером, пустым GameObject или логической точкой, которой управляет система движения.

Преобразование локальных offset в мировые координаты

Для offset `(x, 0, z)` нужно учитывать позицию и вращение anchor. В Unity удобно использовать `TransformPoint`, который переводит локальную точку в мировое пространство.

Простой расчёт цели на C#

Vector3 GetUnitTarget(Transform anchor, Vector3 localOffset)
{
    return anchor.TransformPoint(localOffset);
}

Главная идея: формация не должна знать, где группа находится в мире. Она описывает только относительные позиции.

Двигайте anchor, а не правила формации

Когда игрок задаёт новую цель, перемещайте anchor к ней. Каждый юнит получает свою цель из offset. Благодаря этому скорость, steering и pathfinding можно менять независимо от генерации формации.

Поворачивайте формацию по направлению движения

Если группа должна смотреть в сторону движения, поворачивайте anchor к нужному направлению. Поскольку цели юнитов рассчитываются через transform anchor, вся формация поворачивается автоматически.

Перегруппировка и временное расхождение

В реальной игре группа не всегда остаётся идеально ровной. Юнит может обойти препятствие или временно отстать. Сохраняйте его слот формации, но разрешайте локальному steering отклоняться. После препятствия юнит возвращается к своему слоту.

Препятствия и навигация

Не стоит заставлять систему формации отвечать за всю навигацию. Лучше разделить задачи: формация создаёт желаемые позиции, navigation/steering перемещает юнитов, а локальное избегание решает близкие столкновения.

Производительность больших групп

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

Как собрать систему

Базовый конвейер простой: создать anchor, назначить локальные offsets, двигать и поворачивать anchor, переводить offsets в мировые цели и позволить системе движения юнитов приближаться к ним.

Dynamic Formation System для Unity

Если не хочется создавать всю систему самостоятельно, Dynamic Formation System от RomaSoft объединяет процедурные формации, runtime-поведения, движение по путям и waypoint, групповое steering и morphing формаций.

Заключение

Надёжное движение группы начинается с разделения ответственности. Храните слоты формации в локальном пространстве, используйте anchor для позиции и ориентации группы, а navigation и steering оставляйте отдельной системе.

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

Связанный материал

Читайте: Система формаций в Unity: как создавать динамические построения юнитов