UIComponents

Namespace: Vortex.Unity.UI.UIComponents Сборка: ru.vortex.unity.ui.misc

Назначение

Модульная система UI-компонентов. UIComponent (MonoBehaviour) управляет массивами типизированных UIComponentPart, обеспечивая единый API для работы с текстами, кнопками, графикой и состояниями.

Возможности:

  • Массовое и точечное обновление UI через PutData() / SetText() / SetSprite() / SetAction() / SetSwitcher()
  • Поддержка Text, TextMeshPro, TextMeshProUGUI, Button, AdvancedButton, SpriteRenderer, Image, UIStateSwitcher
  • Позиционная адресация part'ов для multi-part компонентов
  • [UIComponentLink] атрибут для type-safe выбора позиции в Inspector
  • Опциональная локализация текстов (включена по умолчанию)

Вне ответственности:

  • Логика отображения данных (уровень 3/4)
  • Управление жизненным циклом интерфейсов (UIProviderSystem)

Зависимости

Зависимость Назначение
Vortex.Unity.UI.StateSwitcher UIStateSwitcher — интеграция через UIComponentSwitcher
Vortex.Unity.EditorTools [AutoLink] — авто-привязка компонентов
Vortex.Core.LocalizationSystem StringExt.Translate() — локализация текстов
Odin Inspector [ShowInInspector], [Button], [TitleGroup]
TextMeshPro TMP-компоненты

Архитектура

UIComponents/
├── UIComponent.cs                  # Центральный оркестратор (partial)
├── UIComponentExtEditor.cs         # Editor: Init(), Test(), GetLinks()
├── UIComponentData.cs              # Struct данных для PutData()
├── Parts/
│   ├── UIComponentPart.cs          # Абстрактная база part'а
│   ├── UIComponentText.cs          # Text, TMP, TMPUGUI
│   ├── UIComponentButton.cs        # Button, AdvancedButton
│   ├── UIComponentGraphic.cs       # SpriteRenderer, Image (+ Texture2D→Sprite)
│   └── UIComponentSwitcher.cs      # UIStateSwitcher
├── Attributes/
│   └── UIComponentLinkAttribute.cs # Type-safe позиция part'а
└── Editor/
    └── UIComponentLinkAttributeDrawer.cs  # Slider + валидация

UIComponent

Partial MonoBehaviour. Хранит четыре массива part'ов:

Массив Тип part'а Назначение
uiComponentTexts[] UIComponentText Текстовые элементы
uiComponentButtons[] UIComponentButton Кнопки
uiComponentGraphics[] UIComponentGraphic Графика
uiComponentSwitchers[] UIComponentSwitcher Состояния

Init() — автообнаружение part'ов

Кнопка Init в Inspector запускает рекурсивный GetComponentsInChildren по всем четырём типам part'ов. При наличии вложенных UIComponent в иерархии — сначала рекурсивно вызывает Init() на каждом дочернем UIComponent, затем исключает все part'ы, уже принадлежащие дочерним контейнерам. Каждый part принадлежит ровно одному UIComponent.

После сбора part'ов Init() заполняет _testData текущими значениями (тексты, спрайты, состояния свитчеров) для отладки через кнопку Test.

UIComponentPart (abstract)

Базовый класс для всех part'ов. В Editor автоматически заполняет RectTransform до размера контейнера (если не отмечен onlyNativeSize).

Реализации

UIComponentText — поддерживает Text (legacy), TextMeshPro, TextMeshProUGUI. Автообнаружение компонентов в Editor ([OnInspectorInit]).

UIComponentButton — поддерживает Button и AdvancedButton. Отслеживает _currentAction, снимает старый listener перед установкой нового. Очистка в OnDestroy.

UIComponentGraphic — поддерживает SpriteRenderer и Image. Принимает как Sprite, так и Texture2D (автоконвертация в Sprite). Валидация типа в Editor: допускаются только SpriteRenderer и Image.

UIComponentSwitcher — мост к UIStateSwitcher. Принимает int или Enum для переключения состояния.


API

// Массовое применение данных
component.PutData(new UIComponentData {
    texts = new[] { "Title", "Subtitle" },
    sprites = new[] { icon },
    actions = new[] { OnClick }
});

// Точечное обращение
component.SetText("Title");
component.SetText("Subtitle", 1);       // по позиции
component.SetSprite(icon);
component.SetSprite(texture2D);          // автоконвертация
component.SetAction(OnClick);
component.SetAction(OnClick, 2);         // по позиции
component.SetSwitcher(SwitcherState.On);

UIComponentData (struct)

Поле Тип Описание
texts string[] Тексты для каждого UIComponentText
actions UnityAction[] Callback'и для каждого UIComponentButton
sprites Sprite[] Спрайты для каждого UIComponentGraphic
enumValues int[] Состояния для каждого UIComponentSwitcher

UIComponentLinkAttribute

Type-safe выбор позиции part'а в Inspector. Отображает slider 0..N с именем целевого part'а:

[SerializeField, UIComponentLink(typeof(UIComponentText), "uiComponent")]
private int position = -1;  // -1 = по умолчанию, 0..N = конкретный part

Граничные случаи

Ситуация Поведение
SetText("x", pos) без UIComponentText или вне диапазона Debug.LogError, возврат
SetText("x") при uiComponentTexts == null NullReferenceException
SetAction(null) Снятие текущего listener
PutData() с массивом короче кол-ва part'ов Тексты/кнопки/графика: отсутствующие элементы обнуляются (пустая строка / null / null). Свитчеры: обработка прерывается (break)
SetSprite(Texture2D) Создаётся Sprite через Sprite.Create()
position вне диапазона Debug.LogError + возврат (позиционные методы), IndexOutOfRangeException (прямой доступ к массиву)
useLocalization = true (по умолчанию) Тексты проходят через StringExt.Translate()

UIComponentLinkAttribute

Ситуация Поведение
position = -1 Drawer показывает warning "ко всем компонентам"
position вне диапазона Drawer показывает error
position в диапазоне Drawer показывает disabled ObjectField с целевым GameObject