using System; using System.Threading.Tasks; using UnityEngine; namespace DDD { public class UiManager : Singleton, IManager, IGameFlowHandler { [SerializeField] private Transform _hudRoot; [SerializeField] private Transform _interactionUiRoot; [SerializeField] private Transform _popupUiRoot; [SerializeField] private Transform _commonUiRoot; public UiData UiData => GameData.Instance.UiData; public UiState UiState => GameState.Instance.UiState; private void OnDestroy() { GameFlowManager.Instance?.FlowHandlers?.Remove(this); } public void PreInit() { Utils.DestroyAllChildren(_hudRoot); Utils.DestroyAllChildren(_interactionUiRoot); Utils.DestroyAllChildren(_popupUiRoot); Utils.DestroyAllChildren(_commonUiRoot); GameFlowManager.Instance.FlowHandlers.Add(this); } public Task Init() { var flowToUiMapping = UiData.FlowToUiMapping; foreach (var flowToUis in flowToUiMapping) { if (flowToUis.Key == GameFlowState.All) { foreach (var ui in flowToUis.Value) { var uiType = ui.UiType; var root = GetUiRoot(uiType); UiState.CreateUi(ui, root); } } } return Task.CompletedTask; } public void PostInit() { } public Task OnReadyNewFlow(GameFlowState newFlowState) { var flowToUiMapping = UiData.FlowToUiMapping; foreach (var flowToUis in flowToUiMapping) { if (flowToUis.Key.HasFlag(newFlowState)) { foreach (var ui in flowToUis.Value) { var uiType = ui.UiType; var root = GetUiRoot(uiType); UiState.CreateUi(ui, root); } } else { foreach (var ui in flowToUis.Value) { UiState.DestroyUi(ui); } } } return Task.CompletedTask; } public Task OnExitCurrentFlow(GameFlowState exitingFlowState) { return Task.CompletedTask; } public Transform GetUiRoot(UiType uiType) { return uiType switch { UiType.Hud => _hudRoot, UiType.Interaction => _interactionUiRoot, UiType.Popup => _popupUiRoot, UiType.Common => _commonUiRoot, _ => throw new Exception("UiType 설정 오류") }; } } }