~2 мин чтения

Unity Editor, сцена и иерархия

Главные окна редактора, GameObject и Transform — DOM 3D-мира.

Editor: с чего вы будете смотреть на мир

Unity Editor — это IDE для контента. Несколько окон-доков, которые можно перетаскивать и сохранять как layout. Ключевые из коробки:

  • Scene View — 3D-вьюпорт редактора. Здесь вы летаете и расставляете объекты.
  • Game View — то, что увидит игрок: рендер с активной камеры.
  • Hierarchy — дерево объектов в текущей сцене.
  • Project — файлы проекта (ассеты): модели, текстуры, скрипты, материалы.
  • Inspector — свойства выбранного объекта. Здесь вы редактируете компоненты.
  • Console — лог, ошибки, варнинги (Debug.Log, Debug.LogError).
Веб

DevTools браузера: Elements, Console, Sources, Network. Inspector браузера — это про CSS-стили DOM-элемента.

Unity

Hierarchy — это “Elements” (дерево сцены). Inspector — это “Styles”, только редактирует компоненты на GameObject. Project — это файловое дерево “Sources”.

Сцена (Scene)

Сцена — это файл .unity с описанием конкретного уровня или экрана: какие GameObject в нём, с какими компонентами и значениями. Загружаются сцены через SceneManager.LoadScene. Аналог страницы (route) в SPA.

В современной разработке часто используют аддитивную загрузку: одна базовая сцена с UI и менеджерами, поверх неё подгружаются сцены-уровни.

using UnityEngine.SceneManagement;

SceneManager.LoadScene("Level_01");                          // полная замена
SceneManager.LoadScene("HUD", LoadSceneMode.Additive);       // поверх текущей

GameObject — главный примитив

GameObject — пустой контейнер. Сам по себе он не делает ничего: ни рисуется, ни движется. Всё поведение даётся ему компонентами. У GameObject всегда есть один обязательный компонент — Transform (или RectTransform для UI).

Веб

DOM-элемент <div>. Сам по себе пустой, но с CSS-классами и атрибутами получает поведение (анимации, позиционирование, обработчики событий).

Unity

GameObject “Player”. Добавили CharacterController — он движется как капсула. Добавили MeshRenderer — стал виден. Добавили ваш PlayerInput.cs — реагирует на ввод.

Transform — 3D-позиция, поворот и масштаб

Transform хранит локальные значения относительно родителя:

  • localPositionVector3 (x, y, z), метры
  • localRotationQuaternion (внутри), localEulerAngles для удобного представления в градусах
  • localScaleVector3 (x, y, z), множители

И производные мировые: position, rotation, eulerAngles. Если объект — дочерний, мировые значения вычисляются цепочкой матриц трансформации.

transform.localPosition = new Vector3(0, 1.5f, 0); // 1.5 м вверх от родителя
transform.Rotate(0, 90f, 0);                       // повернуть на 90° вокруг Y
transform.localScale = Vector3.one * 2f;           // ×2 по всем осям
Подводный камень: scale в иерархии

Если родитель отмасштабирован неравномерно (например, (2, 1, 1)), а ребёнок повёрнут, мировой масштаб ребёнка станет “сдвинутым” (skew) — Unity показывает предупреждения в Inspector. Старайтесь не мешать non-uniform scale с поворотами в иерархии.

Координатная система

Unity использует левостороннюю систему координат:

  • +X — вправо
  • +Y — вверх (важно для тех, кто привык к Z-up в Blender/3ds Max)
  • +Z — вперёд

Один Unit по умолчанию = 1 метр. Это влияет на физику: гравитация — 9.81 м/с² по умолчанию. Если ваши модели импортированы в “сантиметровом” масштабе, физика будет вести себя странно. Поправляйте Scale Factor в импортере модели.

Иерархия и родительство

Сделав GameObject ребёнком другого, вы привязываете его Transform к родительскому. Ребёнок наследует позицию, поворот и масштаб. Это удобный приём для:

  • Группировок (папки в иерархии): пустой GameObject как контейнер для коллекции врагов.
  • Логических связей: рука → ладонь → меч; двигаете руку — меч следует.
  • Префабов: модель персонажа со скелетом — это иерархия Transform’ов с компонентами на нужных узлах.
// Сделать `child` ребёнком `parent`
child.transform.SetParent(parent.transform, worldPositionStays: true);

// Отвязать
child.transform.SetParent(null);

Параметр worldPositionStays определяет, сохранится ли мировая позиция при перепривязке. По умолчанию true — Unity пересчитает localPosition, чтобы объект остался “на месте”.

В следующем разделе разберёмся, как именно вы пишете поведение — через MonoBehaviour и его жизненный цикл.