Декларативно поверх Unity UI Toolkit

Продуманный UI-слой для Unity.

LumaFlow добавляет декларативную композицию, реактивное состояние, навигацию и виртуализированные списки, оставляя UI Toolkit нативным слоем рендеринга и layout.

Версия 0.1.1 · Unity 6 и новее

Опишите интерфейс таким, каким он должен быть сейчас.

Widgets неизменяемы, состояние остаётся явным, а совместимые обновления согласуются с retained UI Toolkit elements вместо замены слоя рендеринга приложения.

Базовые части интерфейса приложения — в одной понятной модели.

Композиция с намерением

Rows, columns, constraints, scrolling и responsive layouts выражаются типизированными widgets. Themes, text scale и localization наследуются через scopes, а не через неявные globals.

  • Типизированные flex и constraint layouts
  • Component themes и interaction states
  • Accessibility semantics и focus traversal

Навигация без связи со сценами

Retained Navigator владеет routes и in-memory snapshots. Overlays управляют dialogs, drawers, popovers, tooltips и toasts отдельным scoped stack.

Нативная виртуализация списков

ListView<T> использует UI Toolkit ListView. Монтируются только видимые и recycle-range rows, а не вся исходная коллекция.

Явный lifecycle и диагностика

MountHandle освобождается на границе native host. Widget Inspector захватывает immutable snapshots дерева, layout и lifecycle findings без постоянного polling.

Framework layer, а не второй UI engine.

LumaFlow сопоставляет декларативные widgets с retained UI Toolkit elements. Он не добавляет собственный renderer, JavaScript runtime или ещё одну layout-систему.

Изучить архитектуру
Widget

Неизменяемая конфигурация

WidgetNode

Mounted reconciliation boundary

VisualElement

Нативный Unity UI Toolkit

Монтируйте в root, которым уже владеете.

LumaFlow публикуется как Unity package com.sahland.lumaflow. Установите его через Unity Package Manager по адресу https://github.com/sahland/lumaflow.git, затем импортируйте sample.

Добавьте sample-компонент на тот же GameObject, где расположен UIDocument: документ найдётся автоматически.

ApplicationRoot.csC#
using LumaFlow;

private MountHandle? _mount;

void OnEnable() {
  _mount = LumaFlow.LumaFlow.Mount(
    new Text("Hello, LumaFlow"),
    document.rootVisualElement);
}