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: як створювати динамічні побудови юнітів