com.avmedvedskiy.uisystem
v1.2.9
Published
Window System
Readme
WindowService
WindowService - это сервис для управления окнами в Unity с поддержкой асинхронного открытия и закрытия окон через UniTask. Позволяет:
- Управлять созданием и уничтожением окон.
- Поддерживать очередь открытия окон.
- Использовать анимации при открытии и закрытии.
- Загружать окна из ресурсов или Addressables.
📌 Оглавление
🏗 Основные классы
WindowService
Ключевой сервис управления окнами. Отвечает за:
- Создание нового окна через
WindowFactory. - Открытие окон по
windowIdс передачейpayload. - Поддержку очереди открытия окон.
- Закрытие и уничтожение окон.
public async UniTask<TWindow> OpenAsync<TWindow, TPayload>(string windowId, TPayload payload = default, bool inQueue = false)
where TWindow : IWindow<TPayload>
public async UniTask<TWindow> OpenAsync<TWindow>(string windowId, bool inQueue = false)
where TWindow : IWindowМетод OpenAsync<TWindow> предназначен для открытия окна указанного типа TWindow по идентификатору windowId.
- windowId - идентификатор окна.
- inQueue - флаг, указывающий, должно ли окно открываться в очереди.
- Возвращает
UniTask<TWindow>, который завершится, когда окно будет полностью открыто.
BaseWindow
Базовый класс для окон. Поддерживает анимации, управление состояниями (Opened, Closed, Opening, Closing) и взаимодействие с WindowService.
public abstract class BaseWindow : MonoBehaviour, IWindowpublic class BaseWindow<TPayload> : MonoBehaviour, IWindow<TPayload>Методы:
OpenAsync(TPayload payload): открытие окна с анимацией.CloseWindow(): закрытие окна и возврат вWindowService.SetStatus(Status status): изменение состояния окна.
🚀 Как использовать
- Создать
WindowServiceи передать емуWindowFactoryиWindowRootProvider. - Вызвать
OpenAsyncдля открытия окна. - Использовать
CloseAsyncдля закрытия окна.
Пример:
var window = await _windowService.OpenAsync<MyWindow, MyPayload>("MyWindow", new MyPayload());
window.DoSomething();
await _windowService.CloseAsync("MyWindow");Пример открытия окна без payload:
var window = await _windowService.OpenAsync<MyWindow>("MyWindow");
window.DoSomething();
await _windowService.CloseAsync("MyWindow");🛠 Методы расширения
Дополнительные методы для удобного управления окнами:
// Повторное открытие окна в очереди
await window.ReopenInQueue();
// Повторное открытие окна без очереди
await window.Reopen();
// Ожидание закрытия окна
await _windowService.OpenAsync<MyWindow, MyPayload>("MyWindow", new MyPayload()).AndWaitClose();
// Ожидание начала закрытия окна
await _windowService.OpenAsync<MyWindow, MyPayload>("MyWindow", new MyPayload()).AndWaitClosing();
// Открытие всплывающего окна и ожидание результата
var result = await _windowService.OpenPopup<MyPopupWindow, MyPayload, int>("PopupWindow", new MyPayload());
Debug.Log("Результат: " + result);⚙️ Принцип работы
- Проверяется, открыто ли окно (
HasWindow). - Если окно уже открыто, вызывается
OpenAsyncу существующего окна. - Если окно отсутствует, создаётся новое через
WindowFactory. - Окно получает
Status.Opening, затемStatus.Opened. - При закрытии вызывается
CloseAsync, статус меняется наClosing, затемClosed. - Окно удаляется
DestroyWindow().
🏗 Инициализация сервисов и фабрик
Для корректной работы всех окон необходимо инициализировать WindowService и WindowFactory:
[SerializeField] private WindowRootProvider _windowRootProvider;
[SerializeField] private WindowFactoryConfig _windowFactoryConfig;
private void InstallWindowsService()
{
IWindowFactory factory = new WindowFactory(_windowFactoryConfig);
IWindowService windowService = new WindowService(factory, _windowRootProvider);
}После этого windowService можно использовать для управления окнами.
