ProjectDDD/Assets/_DDD/_Scripts/GameUi/UiManager.cs
2025-08-21 16:25:27 +09:00

111 lines
3.1 KiB
C#

using System;
using System.Threading.Tasks;
using UnityEngine;
namespace DDD
{
public class UiManager : Singleton<UiManager>, 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 설정 오류")
};
}
}
}