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

Зачем нужен вложенный Canvas?

2.0 Middle🔥 102 комментариев
#UI

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

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

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

Вложенный Canvas: цели и практическое применение

Вложенный Canvas — это объект типа Canvas, размещенный внутри другого Canvas в иерархии Unity. Это не стандартный подход, но он имеет несколько конкретных и полезных применений в разработке UI, особенно когда требуется сложная организация или особые эффекты рендеринга.

Основные причины использования вложенного Canvas

1. Изоляция рендеринга и оптимизация (Pixel Perfect и Overdraw)

Главный Canvas имеет свои параметры Render Mode (Screen Space, World Space). Вложенный Canvas может использовать другой режим или иметь независимые настройки Pixel Perfect, Sort Order и Additional Shader Channels. Это позволяет:

  • Создать "под-интерфейс" (например, окно инвентаря внутри игрового мира), который рендерится отдельно от основного UI.
  • Минимизировать overdraw (перерисовку пикселей). Можно отключить Pixel Perfect для основного Canvas (для общего UI) и включить его для вложенного (для критически важных элементов, требующих четкости).
  • Контролировать порядок сортировки (Canvas.sortingOrder) внутри группы элементов независимо от родительского Canvas.

2. Организация сложных UI с независимым масштабированием и позиционированием

Основной Canvas может использовать RectTransform для размещения относительно экрана или мира. Вложенный Canvas внутри него становится самостоятельным контейнером с собственным RectTransform, что позволяет:

  • Применять отдельные операции масштабирования, вращения или скейлирования к целой группе элементов (например, к HUD-панели), не затрагивая остальные UI-элементы.
  • Легко перемещать или скрывать/показывать сложные составные блоки интерфейса как единый объект.
  • Использовать разные Canvas Scaler (настройки масштабирования) для разных частей интерфейса (например, основной UI адаптируется к разрешению, а вложенный — фиксированного размера).

3. Создание специфичных эффектов рендеринга и материалов

Каждый Canvas рендерится как отдельный меш (mesh). Вложенный Canvas позволяет назначить уникальный Material или Shader для группы элементов:

  • Добавить эффект блюра, маскирования или специальный текстуринг только к определенной области UI (например, к окну диалога).
  • Использовать отдельный материал для маскировки (Mask или RectMask2D) внутри вложенного Canvas, не затрагивая родительский.

4. Управление порядком событий (Input и Raycasting)

Вложенный Canvas может иметь свой собственный Graphic Raycaster (или не иметь его). Это позволяет:

  • Изолировать область ввода. Например, элементы во вложенном Canvas могут блокировать события клика для элементов родительского Canvas или обрабатывать их независимо.
  • Управлять порядком обработки событий UI (EventSystem) между слоями интерфейса.

Пример практического использования

Рассмотрим сценарий: игровой HUD с основной панелью и выдвигающимся окном инвентаря, которое должно быть идеально четким (Pixel Perfect) и иметь эффект полупрозрачного фона.

// Пример структуры в иерархии Unity
MainCanvas (Render Mode: Screen Space - Overlay, Pixel Perfect: false)
├── HealthBar
├── Minimap
└── InventorySubCanvas (вложенный Canvas, Pixel Perfect: true)
    ├── BackgroundPanel (с материалом с альфа-каналом)
    ├── ItemSlotGrid
    └── CloseButton
// Код для управления показом/скрытием вложенного Canvas как единого объекта
public class InventoryManager : MonoBehaviour
{
    [SerializeField] private Canvas inventorySubCanvas; // Ссылка на вложенный Canvas

    public void ToggleInventory()
    {
        // Включаем/выключаем весь вложенный Canvas и все его элементы
        inventorySubCanvas.enabled = !inventorySubCanvas.enabled;

        // Можно также управлять через GameObject
        // inventorySubCanvas.gameObject.SetActive(!inventorySubCanvas.gameObject.activeSelf);
    }
}

Ключевые технические моменты и ограничения

  • Performance: Каждый дополнительный Canvas увеличивает количество draw calls (вызовов отрисовки), поскольку Unity рендерит каждый Canvas как отдельный меш. Это может негативно повлиять на производительность, особенно на мобильных устройствах. Не следует создавать вложенные Canvas без необходимости.
  • Sorting: У вложенного Canvas параметр sortingOrder работает относительно родительского Canvas. Элементы внутри вложенного Canvas будут рендериться в порядке, определенном его собственным sortingOrder и порядком в иерархии.
  • Input: Необходимо внимательно настроить Graphic Raycaster на обоих Canvas'ах, чтобы избежать конфликтов обработки событий.

Заключение

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