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

Проверьте себя
1. Что произойдёт с дочерним объектом, если сдвинуть его родителя?
AНичего, ребёнок останется на месте
BРебёнок сдвинется вместе с родителем
CРебёнок удалится
DРебёнок станет родителем
2. Чем локальная позиция отличается от мировой?
AНичем
BЛокальная — относительно родителя, мировая — абсолютная в сцене
CЛокальная только для камеры
DМировая измеряется в пикселях