Обзор системы UI
Слой UI OpenMon находится в Assets/OpenMon/Core/Runtime/UI/ и полностью построен на UGUI Unity (Canvas + RectTransform). Каждый экран, меню и диалог используют два основополагающих строительных блока: MenuSelector для навигационных списков/сеток и DialogManager для модальных текстовых окон, выбора и сло жных всплывающих окон.
Архитектура с высоты птичьего полёта
UI/
├── MenuSelector.cs # Базовый класс для ВСЕХ навигационных меню
├── ScrollableMenuSelector.cs # MenuSelector + поддержка ScrollRect
├── VirtualizedMenuSelector.cs # MenuSelector + перерабатываемые/пулированные элементы
├── MenuItem.cs # Отдельная кнопка внутри MenuSelector
├── VirtualizedMenuItem.cs # MenuItem, знающий свою строку в пуле
├── UIElementsInstaller.cs # Установщик Zenject для фабрик UI
├── Battle/ # HUD битвы: главное меню, меню атак, выбор цели
├── Bags/ # Экран инвентаря/сумки с вкладками
├── Dex/ # Полноэкранный режим покедекса с вкладками
├── Dialogs/ # DialogManager + меню выбора, ввод текста, всплывающие окна
├── GameMenu/ # Меню паузы в игре (Dex, Mons, Сумка, Карта и т.д.)
├── MainMenu/ # Экран заголовка: Новая игра, Продолжить, Авторы
├── Monsters/ # Экран состава монстров, сводка, хранилище
├── Options/ # Экран настроек (громкость, разрешение, язык и т.д.)
├── Shops/ # Интерфейс магазина (покупка/продажа)
├── Quests/ # Экран журнала заданий
├── Profile/ # Профиль игрока / карточка тренера
├── Map/ # Наложение карты мира
└── ...
Две основы
MenuSelector — Универсальная навигация по меню
MenuSelector — это базовый класс, от которого наследуется почти каждое интерактивное меню. Он обрабатывает:
- Вертикальную или горизонтальную навигацию через перечисление
Navigation. - Стрелку селектора, которая анимируется к указанному элементу через встроенный в MCE API твинов.
- Звуковую обратную связь при навигации и выборе.
- Интеграцию ввода через интерфейс
IInputReceiverиIInputManager. - Зацикливание — переход за последний элемент возвращает к первому и наоборот.
- Удержание для прокрутки — когда
CanHoldToScrollFasterвключён, удержание ввода повторяет навигацию с настраиваемым интервалом.
Существует две специализированные разновидности:
| Класс | Сценарий использования |
|---|---|
ScrollableMenuSelector | Добавляет ScrollRect, который автоматически прокручивается, чтобы выбранный элемент оставался видимым. |
VirtualizedMenuSelector<TData, TButton, TFactory> | Список с пулом объектов для больших наборов данных (например, Dex, Хранилище). Перерабатывает экземпляры кнопок по мере прокрутки игроком. |
См. страницу Меню для подробного изучения MenuSelector.
DialogManager — Модальные диалоги и сложные всплывающие окна
DialogManager — это Singleton, владеющий всеми модальными наложениями UI в игре. Он управляет:
- Базовыми текстовыми диалогами с анимацией пишущей машинки, панелями имени говорящего и локализацией.
- Меню выбора (Да/Нет, несколько вариантов до 11).
- Полноэкранными экранами, доступными через статические методы: Dex, Сумка, Состав, Магазин, Настройки, Профиль, Задания, Карта.
- Специализированными всплывающими окнами: панель получения опыта, диалог замены атаки, учитель атак, всплывающее окно нового монстра, диалог ввода текста.
- Уведомлениями через дочерний
NotificationManager.
DialogManager создаётся через фабричный паттерн Zenject:
// DialogManagerInstaller.cs
Container.BindFactory<DialogManager, DialogManager.Factory>()
.FromComponentInNewPrefab(Prefab);
См. страницу Диалоги для полного API.