Текущая реализация

UI-система AS-BUILT

Кастомная библиотека компонентов на Unity UI Toolkit: элементы, скины-ScriptableObject, типография и навигация экранов. Внешний вид отделён от логики.

⚠ Снимок кода, не целевой дизайн Фактическое устройство UI-слоя на сегодня. Контекст раздела — на странице Обзор реализации.

Ключевая идея — Skin как ScriptableObject

UI построен на UI Toolkit (UIElements) с паттерном Skin: логика элемента живёт в коде, а весь визуал (спрайты, цвета, шрифты, размеры, анимации) — в ScriptableObject-скине. Один компонент → разные скины → единый визуал и live-preview в редакторе. Смена скина сразу обновляет вид.

Четыре слоя Элементы (VisualElement + логика) · Скины (ScriptableObject визуала) · Типография (централизованные текст-стили) · Навигация (экраны и их спавн).

Элементы (~29 компонентов)

Кастомные VisualElement с полной логикой взаимодействия, типизированы через [UxmlElement]/[UxmlAttribute], поддерживают UXML-шаблоны.

ГруппаКомпоненты
БазовыеButton, Label, Toggle, Checkbox, Icon, Divider, Background.
СложныеSlider, RangeSlider, ProgressBar, Portrait.
КонтейнерыDialogFrame, ScrollView, ScrollContainer (абстрактный), TabContainer.
СпискиListView, GridView, ItemsView.
ФормыInput, Combobox, RadioGroup, ColorPicker.
ПрочиеSpinner, Carousel, Stepper, Toast, Foldout, GradientText, UiNineSliceBox.

рабочая Путь: GameEngine/Scripts/UI/Packs/.

Скины (~28 ScriptableObject)

По скину на элемент: состояния (Normal / Hovered / Pressed / Disabled), спрайты, цвета, шрифты, размеры, параметры анимаций. Паттерн StateVisuals + MetricsSettings + InteractionSettings. Отдельные скины под градиентный текст и Nine-Slice рамки.

Известные нюансы из практики CSS background-size/repeat не тайлит спрайты с 9-slice бордером — для тайла фона нужен безбордерный бесшовный спрайт, а маска тайлит мешем. Скроллбар — это SliderElement в handle-режиме (handleMode форсится в коде ScrollContainerElement, не в скине).

рабочая Live-preview в редакторе через SkinLivePreview.

Типография

Централизованные текст-стили в UiTypography (ScriptableObject) с ролями: Main (48px bold), Sub (32px bold), Section (24px bold), Body (18px), Small (14px). UiTextStyle держит TextMeshPro-параметры: шрифт, размер, outline, shadow, gradient.

рабочая

Класс / файлРоль
UiPackNavigationServiceАктивный экран (TryShowScreen, HideActiveScreen).
UiPackScreenFactoryСпавн экранов из UiScreenDefinition.
UiPackNavigationHostКонтейнер активного экрана.

Поддержка тем (ThemeKey — переключение наборов скинов) и обоих бэкендов: Canvas (совместимость) и UI Toolkit.

рабочая

Наследуемые компоненты и панели

Рядом живёт старый UI-слой (для совместимости): UI_Counter, UI_Paginator, UI_RelationsSlider, WR_UI_Scroller и набор экранов/панелей (MainMenu, Windows, Minimap, Hints, NB-UI для NewBattle, World).

в разработке Путь: GameEngine/Scripts/UI/Components/ и соседние.