← Назад к вопросам

Что такое LayoutGroup в Unity UI?

1.0 Junior🔥 162 комментариев
#C# и ООП

Комментарии (2)

🐱
deepseek-v3.2PrepBro AI7 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Что такое LayoutGroup в Unity UI?

LayoutGroup — это абстрактный базовый класс в системе Unity UI (uGUI), который автоматически управляет позиционированием и размерами дочерних RectTransform элементов внутри контейнера. Это фундаментальный инструмент для создания адаптивных, структурированных и легко поддерживаемых пользовательских интерфейсов.

Основное назначение и принцип работы

Главная задача LayoutGroup — избавить разработчика от ручного расчета координат и размеров для каждого элемента UI. Вместо этого вы настраиваете параметры компоновки (такие как отступы, промежутки, выравнивание) на родительском объекте, а система автоматически перестраивает расположение всех его дочерних объектов, подчиняющихся интерфейсу ILayoutElement.

Ключевой принцип: LayoutGroup работает в паре с компонентом ContentSizeFitter. Сам LayoutGroup управляет позицией и размером дочерних элементов, в то время как ContentSizeFitter управляет размером родительского контейнера, подстраивая его под сумму размеров дочерних объектов.

Основные типы LayoutGroup

Unity предоставляет три конкретные реализации, которые покрывают большинство сценариев верстки:

  1. Horizontal Layout Group
    *   Выстраивает дочерние элементы в одну **горизонтальную линию**.
    *   Основные свойства: `Spacing` (расстояние между элементами), `Child Alignment`, `Padding`.

// Пример настройки Horizontal Layout Group через код
HorizontalLayoutGroup hlg = gameObject.AddComponent<HorizontalLayoutGroup>();
hlg.spacing = 10f;
hlg.padding = new RectOffset(5, 5, 0, 0); // Left, Right, Top, Bottom
hlg.childAlignment = TextAnchor.MiddleCenter;
hlg.childControlWidth = true; // LayoutGroup контролирует ширину детей
hlg.childControlHeight = true; // LayoutGroup контролирует высоту детей
  1. Vertical Layout Group
    *   Выстраивает дочерние элементы в один **вертикальный столбец**.
    *   Используется для создания списков, меню, колонок настроек.

// Пример настройки Vertical Layout Group
VerticalLayoutGroup vlg = gameObject.AddComponent<VerticalLayoutGroup>();
vlg.spacing = 5f;
vlg.padding = new RectOffset(20, 20, 10, 10);
  1. Grid Layout Group
    *   Располагает элементы в **равномерную сетку** (grid). Это самый мощный и часто используемый тип для инвентарей, таблиц, галерей.
    *   Ключевые свойства: `Cell Size`, `Spacing`, `Start Corner` (угол начала размещения), `Start Axis` (направление заполнения: сначала по горизонтали или вертикали), `Constraint` (фиксированное количество строк/столбцов).

// Пример настройки Grid Layout Group для инвентаря 4x6
GridLayoutGroup glg = gameObject.AddComponent<GridLayoutGroup>();
glg.cellSize = new Vector2(100, 100);
glg.spacing = new Vector2(5, 5);
glg.constraint = GridLayoutGroup.Constraint.FixedColumnCount;
glg.constraintCount = 4; // Фиксируем 4 колонки

Механизм выполнения и жизненный цикл

Процесс компоновки не происходит непрерывно. Он запускается в определенные моменты для оптимизации:

  • При изменении иерархии (добавление/удаление дочернего элемента).
  • При изменении любого параметра LayoutGroup.
  • При изменении разрешения экрана (важно для адаптивности).
  • При вызове метода LayoutRebuilder.ForceRebuildLayoutImmediate(RectTransform rect) — для принудительного перестроения из кода.

Этот механизм предотвращает выполнение дорогостоящих расчетов каждый кадр.

Практическое применение и лучшие практики

  • Вложенность групп: LayoutGroups можно вкладывать друг в друга для создания сложных интерфейсов. Например, Vertical Layout Group для основного меню, внутри которого кнопки выровнены с помощью Horizontal Layout Group.
  • Комбинация с ContentSizeFitter: Для создания контейнеров, которые динамически подстраивают свой размер под контент (например, всплывающее окно с текстом).
  • Контроль над дочерними элементами: Свойства childControlWidth/Height и childForceExpandWidth/Height позволяют гибко управлять тем, как группа влияет на размеры своих детей.
  • Производительность: Следует избегать чрезмерно глубокой вложенности LayoutGroups и частых изменений в иерархии во время игры, так как каждое изменение провоцирует перерасчет всей цепочки компоновки. Для динамически обновляемых списков (чаты, таблицы лидеров) лучше использовать специализированные ассеты, такие как Unity UI Extensions или коммерческие решения вроде EnhancedScroller.

Заключение

LayoutGroup — это не просто удобный инструмент, а архитектурный стержень системы UI Unity. Он обеспечивает декларативный подход к верстке, где вы описываете правила расположения, а движок самостоятельно их исполняет. Это критически важно для поддержки множества разрешений экранов, быстрого прототипирования интерфейсов и отделения логики расположения элементов от их функциональности. Понимание его работы, типов и особенностей жизненного цикла является обязательным для любого профессионального Unity-разработчика.

Что такое LayoutGroup в Unity UI? | PrepBro