Почему движение группы отличается
Переместить несколько юнитов в одну точку легко. Сложнее сделать так, чтобы они пришли организованной группой. Каждый юнит должен иметь целевую позицию относительно формации, а группа — общую точку назначения, ориентацию и скорость.
Храните позиции формации относительно группы
Практичный подход — хранить позицию каждого юнита как 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: как создавать динамические построения юнитов