매니저 초기화 순서 보장

This commit is contained in:
Jeonghyeon Ha 2025-09-01 19:52:07 +09:00
parent f07d3f196b
commit 7d82436c0c
15 changed files with 135 additions and 51 deletions

View File

@ -47,14 +47,25 @@ protected override void OnApplicationQuit()
ReleaseAllCached(); ReleaseAllCached();
} }
public void PreInit() { } public void PreInit()
{
}
public async Task Init() public async Task PreInitAsync()
{ {
await Addressables.InitializeAsync().Task; await Addressables.InitializeAsync().Task;
} }
public void PostInit() { } public Task InitAsync()
{
return Task.CompletedTask;
}
public Task PostInitAsync()
{
return Task.CompletedTask;
}
private string GetSafeAssetName(AssetReference assetReference) private string GetSafeAssetName(AssetReference assetReference)
{ {

View File

@ -36,14 +36,19 @@ public void PreInit()
_cinemachineBrain = GetComponent<CinemachineBrain>(); _cinemachineBrain = GetComponent<CinemachineBrain>();
} }
public Task Init() public Task PreInitAsync()
{ {
return Task.CompletedTask; return Task.CompletedTask;
} }
public void PostInit() public Task InitAsync()
{ {
return Task.CompletedTask;
}
public Task PostInitAsync()
{
return Task.CompletedTask;
} }
public void RegisterCamera(CameraGameObject cameraGameObject) public void RegisterCamera(CameraGameObject cameraGameObject)

View File

@ -22,15 +22,21 @@ public void PreInit()
RegisterFlowHandler(); RegisterFlowHandler();
} }
public async Task Init() public Task PreInitAsync()
{
return Task.CompletedTask;
}
public async Task InitAsync()
{ {
await LoadData(); await LoadData();
await GetGameData().LoadData(); await GetGameData().LoadData();
await InitializeAllFlowControllers(); await InitializeAllFlowControllers();
} }
public void PostInit() public Task PostInitAsync()
{ {
return Task.CompletedTask;
} }
private void CreateGameState() private void CreateGameState()

View File

@ -17,20 +17,24 @@ public class DataManager : Singleton<DataManager>, IManager
public void PreInit() public void PreInit()
{ {
} }
public async Task Init() public async Task PreInitAsync()
{ {
await LoadAllGameDataAssets(); await LoadAllGameDataAssets();
await LoadSpriteAtlas(); await LoadSpriteAtlas();
} }
public void PostInit() public Task InitAsync()
{ {
return Task.CompletedTask;
} }
public Task PostInitAsync()
{
return Task.CompletedTask;
}
private async Task LoadAllGameDataAssets() private async Task LoadAllGameDataAssets()
{ {
var assets = await AssetManager.Instance.LoadAssetsByLabel<ScriptableObject>(AssetLabel); var assets = await AssetManager.Instance.LoadAssetsByLabel<ScriptableObject>(AssetLabel);

View File

@ -26,12 +26,17 @@ public void PreInit()
GameFlowDataSo.CurrentGameState = GameFlowState.None; GameFlowDataSo.CurrentGameState = GameFlowState.None;
} }
public Task Init() public Task PreInitAsync()
{ {
return Task.CompletedTask; return Task.CompletedTask;
} }
public async void PostInit() public Task InitAsync()
{
return Task.CompletedTask;
}
public async Task PostInitAsync()
{ {
if (IsGameStarted() == false) if (IsGameStarted() == false)
{ {
@ -39,7 +44,7 @@ public async void PostInit()
} }
} }
private bool IsGameStarted() => GameFlowDataSo.CurrentGameState != GameFlowState.None; public bool IsGameStarted() => GameFlowDataSo.CurrentGameState != GameFlowState.None;
public async Task ChangeFlow(GameFlowState newFlowState) public async Task ChangeFlow(GameFlowState newFlowState)
{ {

View File

@ -57,7 +57,7 @@ private async Task Initialize()
} }
} }
// PreInit 단계 실행 // Start 이전 초기화 보장
foreach (var managerInstance in _managerInstances) foreach (var managerInstance in _managerInstances)
{ {
if (managerInstance is IManager manager) if (managerInstance is IManager manager)
@ -65,22 +65,31 @@ private async Task Initialize()
manager.PreInit(); manager.PreInit();
} }
} }
// PreInit 단계 실행 ( 데이터 준비 등 )
foreach (var managerInstance in _managerInstances)
{
if (managerInstance is IManager manager)
{
await manager.PreInitAsync();
}
}
// Init 단계 실행 (비동기) // Init 단계 실행 (비동기)
foreach (var managerInstance in _managerInstances) foreach (var managerInstance in _managerInstances)
{ {
if (managerInstance is IManager manager) if (managerInstance is IManager manager)
{ {
await manager.Init(); await manager.InitAsync();
} }
} }
// PostInit 단계 실행 // PostInit 단계 실행 ( 사실상 게임 시작된 상태 )
foreach (var managerInstance in _managerInstances) foreach (var managerInstance in _managerInstances)
{ {
if (managerInstance is IManager manager) if (managerInstance is IManager manager)
{ {
manager.PostInit(); await manager.PostInitAsync();
} }
} }
} }

View File

@ -5,7 +5,8 @@ namespace DDD
public interface IManager public interface IManager
{ {
void PreInit(); void PreInit();
Task Init(); Task PreInitAsync();
void PostInit(); Task InitAsync();
Task PostInitAsync();
} }
} }

View File

@ -18,8 +18,12 @@ public class LocalizationManager : Singleton<LocalizationManager>, IManager
private const string Description = "_description"; private const string Description = "_description";
private readonly List<object> _singleArgBuffer = new(1); private readonly List<object> _singleArgBuffer = new(1);
public async void PreInit() public void PreInit()
{
}
public async Task PreInitAsync()
{ {
_localizedCache.Clear(); _localizedCache.Clear();
_currentLocaleCode = GetCurrentLocaleCode(); _currentLocaleCode = GetCurrentLocaleCode();
@ -55,14 +59,14 @@ public async void PreInit()
_isInitialized = true; _isInitialized = true;
} }
public Task Init() public Task InitAsync()
{ {
return Task.CompletedTask; return Task.CompletedTask;
} }
public void PostInit() public Task PostInitAsync()
{ {
return Task.CompletedTask;
} }
/// <summary> /// <summary>

View File

@ -51,9 +51,16 @@ private void OnDestroy()
EventBus.Unregister<SmartVariablesDirtyEvent>(this); EventBus.Unregister<SmartVariablesDirtyEvent>(this);
} }
public void PreInit() { } public void PreInit()
{
}
public async Task Init() public Task PreInitAsync()
{
return Task.CompletedTask;
}
public async Task InitAsync()
{ {
Set(_smartStringKeys[SmartStringKey.Day], GetGameLevelState().Level); Set(_smartStringKeys[SmartStringKey.Day], GetGameLevelState().Level);
Set(_smartStringKeys[SmartStringKey.ChecklistFoodCount], GetRestaurantManagementData().ChecklistFoodCount); Set(_smartStringKeys[SmartStringKey.ChecklistFoodCount], GetRestaurantManagementData().ChecklistFoodCount);
@ -66,10 +73,11 @@ public async Task Init()
await Task.CompletedTask; await Task.CompletedTask;
} }
public void PostInit() public Task PostInitAsync()
{ {
// 도메인 단위 더티 이벤트를 구독하여 필요한 key만 갱신 // 도메인 단위 더티 이벤트를 구독하여 필요한 key만 갱신
EventBus.Register<SmartVariablesDirtyEvent>(this); EventBus.Register<SmartVariablesDirtyEvent>(this);
return Task.CompletedTask;
} }
public void HandleEvent(SmartVariablesDirtyEvent evt) public void HandleEvent(SmartVariablesDirtyEvent evt)

View File

@ -30,14 +30,19 @@ public class SceneManager : Singleton<SceneManager>, IManager
private readonly Dictionary<GameFlowState, SceneData> _loadedSceneDatas = new(); private readonly Dictionary<GameFlowState, SceneData> _loadedSceneDatas = new();
private readonly Dictionary<string, SceneData> _assetKeyToSceneData = new(); private readonly Dictionary<string, SceneData> _assetKeyToSceneData = new();
public void PreInit() public void PreInit()
{ {
_loadedSceneDatas.Clear(); _loadedSceneDatas.Clear();
_assetKeyToSceneData.Clear(); _assetKeyToSceneData.Clear();
} }
public async Task Init() public Task PreInitAsync()
{
return Task.CompletedTask;
}
public async Task InitAsync()
{ {
var activeScene = UnityEngine.SceneManagement.SceneManager.GetActiveScene(); var activeScene = UnityEngine.SceneManagement.SceneManager.GetActiveScene();
#if UNITY_EDITOR #if UNITY_EDITOR
@ -64,9 +69,9 @@ public async Task Init()
await PreloadAll(); await PreloadAll();
} }
public void PostInit() public Task PostInitAsync()
{ {
return Task.CompletedTask;
} }
public async Task PreloadAll() public async Task PreloadAll()

View File

@ -11,21 +11,26 @@ public class TimeManager : Singleton<TimeManager>, IManager, IEventHandler<TimeS
public float CurrentTimeScale { get; private set; } = 1f; public float CurrentTimeScale { get; private set; } = 1f;
private float _baseFixedDeltaTime; private float _baseFixedDeltaTime;
public void PreInit() public void PreInit()
{ {
_baseFixedDeltaTime = Time.fixedDeltaTime; _baseFixedDeltaTime = Time.fixedDeltaTime;
EventBus.Register(this); EventBus.Register(this);
} }
public Task Init() public Task PreInitAsync()
{ {
return Task.CompletedTask; return Task.CompletedTask;
} }
public void PostInit() public Task InitAsync()
{ {
return Task.CompletedTask;
}
public Task PostInitAsync()
{
return Task.CompletedTask;
} }
private void OnDestroy() private void OnDestroy()

View File

@ -30,20 +30,25 @@ public class InventoryManager : Singleton<InventoryManager>, IManager
[SerializeField] [SerializeField]
private InventoryTestDataSo _inventoryTestDataSo; private InventoryTestDataSo _inventoryTestDataSo;
#endif #endif
public void PreInit() public void PreInit()
{ {
} }
public Task Init() public Task PreInitAsync()
{ {
return Task.CompletedTask; return Task.CompletedTask;
} }
public void PostInit() public Task InitAsync()
{
return Task.CompletedTask;
}
public Task PostInitAsync()
{ {
InitializeItemData(); InitializeItemData();
return Task.CompletedTask;
} }
private void InitializeItemData() private void InitializeItemData()

View File

@ -29,7 +29,12 @@ public void PreInit()
GameFlowManager.Instance.FlowHandlers.Add(this); GameFlowManager.Instance.FlowHandlers.Add(this);
} }
public Task Init() public Task PreInitAsync()
{
return Task.CompletedTask;
}
public Task InitAsync()
{ {
var flowToUiMapping = UiData.FlowToUiMapping; var flowToUiMapping = UiData.FlowToUiMapping;
foreach (var flowToUis in flowToUiMapping) foreach (var flowToUis in flowToUiMapping)
@ -48,9 +53,9 @@ public Task Init()
return Task.CompletedTask; return Task.CompletedTask;
} }
public void PostInit() public Task PostInitAsync()
{ {
return Task.CompletedTask;
} }
public Task OnReadyNewFlow(GameFlowState newFlowState) public Task OnReadyNewFlow(GameFlowState newFlowState)

View File

@ -51,11 +51,10 @@ public class InputManager : Singleton<InputManager>, IManager
public InputActionMaps CurrentInputActionMap { get; private set; } public InputActionMaps CurrentInputActionMap { get; private set; }
private readonly Dictionary<(InputActionMaps, string), InputAction> _cachedActions = new(); private readonly Dictionary<(InputActionMaps, string), InputAction> _cachedActions = new();
public void PreInit() public void PreInit()
{ {
_currentPlayerInput = GetComponent<PlayerInput>(); _currentPlayerInput = GetComponent<PlayerInput>();
_cachedActions.Clear(); _cachedActions.Clear();
foreach (var actionMap in _currentPlayerInput.actions.actionMaps) foreach (var actionMap in _currentPlayerInput.actions.actionMaps)
{ {
@ -68,14 +67,19 @@ public void PreInit()
} }
} }
public Task Init() public Task PreInitAsync()
{ {
return Task.CompletedTask; return Task.CompletedTask;
} }
public void PostInit() public Task InitAsync()
{ {
return Task.CompletedTask;
}
public Task PostInitAsync()
{
return Task.CompletedTask;
} }
private bool IsNullCurrentPlayerInput() private bool IsNullCurrentPlayerInput()

View File

@ -31,20 +31,27 @@ public void PreInit()
RegisterFlowHandler(); RegisterFlowHandler();
} }
public async Task Init() public Task PreInitAsync()
{
return Task.CompletedTask;
}
public async Task InitAsync()
{ {
await LoadData(); await LoadData();
await GetRestaurantData().LoadData(); await GetRestaurantData().LoadData();
await InitializeAllFlowControllers(); await InitializeAllFlowControllers();
} }
public void PostInit() public Task PostInitAsync()
{ {
var allInteractables = GetRestaurantState().EnvironmentState.GetAllInteractables(); var allInteractables = GetRestaurantState().EnvironmentState.GetAllInteractables();
foreach (var interactable in allInteractables) foreach (var interactable in allInteractables)
{ {
} }
return Task.CompletedTask;
} }
private void CreateRestaurantState() private void CreateRestaurantState()