Transform: позиция, поворот, масштаб и иерархия
Transform — самый важный компонент. Он отвечает за то, где объект, как повёрнут и какого размера. А ещё через него строится иерархия объектов.
Суть: Transform хранит три вещи —
position(позиция),rotation(поворот),scale(масштаб). Объекты можно вкладывать друг в друга: дочерний объект двигается вместе с родителем. Координаты бывают локальные (относительно родителя) и мировые (абсолютные).
Каждый объект где-то находится — это задаёт position. Как повёрнут — rotation. Насколько большой — scale (1 — обычный размер). Эти три числа-вектора и есть Transform.
Самое мощное в Transform — иерархия. Если перетащить один объект на другой в Hierarchy, первый станет ребёнком. Теперь когда двигается родитель, ребёнок едет с ним. Это как руль на машине: двигается машина — двигается и руль, хотя у руля своя позиция внутри салона.
Как работает под капотом
Машина (родитель) position (10, 0) | +-- Колесо_Л (ребёнок) local (-1, -0.5) -> world (9, -0.5) +-- Колесо_П (ребёнок) local (+1, -0.5) -> world (11, -0.5) +-- Фара (ребёнок) local (+2, 0.3) -> world (12, 0.3) Сдвинули машину на (+5, 0): Машина world (15, 0), колёса и фара едут с ней.
Локальная позиция ребёнка — это смещение относительно родителя. Мировая позиция — это абсолютное место в сцене. Движок постоянно пересчитывает мировые координаты из локальных, поднимаясь по цепочке родителей.
Покажем расчёт мировой позиции из локальной на Python (упрощённо, без поворотов):
# Родитель в мире, ребёнок задан локально
parent_world = (10.0, 0.0)
children = {
"Колесо_Л": (-1.0, -0.5),
"Колесо_П": ( 1.0, -0.5),
"Фара": ( 2.0, 0.3),
}
def to_world(parent, local):
return (parent[0] + local[0], parent[1] + local[1])
for name, local in children.items():
wx, wy = to_world(parent_world, local)
print(f"{name}: локально {local} -> в мире ({wx}, {wy})")
# Сдвинули родителя на +5 по X
parent_world = (parent_world[0] + 5, parent_world[1])
print("Фара после сдвига:", to_world(parent_world, children["Фара"]))Та же логика на Python ▶ — мировая позиция ребёнка = позиция родителя + локальное смещение. Сдвинул родителя — все дети поехали следом. В реальном Unity к этому добавляются повороты и масштаб, но идея ровно эта.
Частые ошибки
- Путать localPosition и position. Если объект — ребёнок, его
positionв мире не равно числам, которые ты вписываешь в Inspector (там локальные значения). - Масштабировать родителя с детьми. Масштаб тоже наследуется: увеличил родителя в 2 раза — дети тоже растянулись. Иногда это сюрприз.
- Слишком глубокая иерархия. Двадцать уровней вложенности замедляют пересчёт и путают. Держи иерархию неглубокой.
Best practices
- Группируй связанные объекты под пустым родителем (например все враги под объектом
Enemies) — порядок в Hierarchy. - Для движения объекта меняй
transform.positionили используй физику, но не оба способа одновременно на одном объекте. - Держи масштаб объектов равным 1, где возможно; меняй размер через сам спрайт, а не через Scale — так физика ведёт себя предсказуемее.
Итоги: Transform — это позиция, поворот и масштаб плюс иерархия родитель-ребёнок. Дети двигаются вместе с родителем; их позиция бывает локальной и мировой. Группируй объекты под пустыми родителями и держи иерархию неглубокой.
Зачем вообще нужна иерархия на практике
Иерархия — это не теория, а ежедневный инструмент. Соберёшь персонажа из тела, оружия в руке и полоски здоровья над головой — сделай их детьми одного объекта, и они поедут вместе как единое целое, тебе не придётся синхронизировать три позиции вручную. Хочешь временно спрятать всех врагов уровня? Положи их под пустой объект Enemies и выключи его — скроется вся ветка разом. Иерархия задаёт и порядок: дочерние UI-элементы рисуются поверх родителя в том порядке, в каком идут в списке. Поэтому продуманное дерево объектов — это половина порядка в проекте. Плохая привычка — валить всё в корень сцены сотней объектов без группировки: найти что-то в таком списке потом невозможно.