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() { ClearAll(); 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() { } private void ClearObjects(Transform root) { foreach (Transform child in root) { Destroy(child.gameObject); } } private void ClearAll() { ClearObjects(_hudRoot); ClearObjects(_interactionUiRoot); ClearObjects(_popupUiRoot); ClearObjects(_commonUiRoot); } public Task OnReadyNewFlow(GameFlowState newFlowState) { var flowToUiMapping = UiData.FlowToUiMapping; foreach (var flowToUis in flowToUiMapping) { if ((flowToUis.Key & newFlowState) != 0) { 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 설정 오류") }; } } }