ProjectDDD/Assets/_DDD/_Scripts/GameFramework/GameManager.cs
NTG 6df9f4cfae 싱글톤, 게임매니저 로직 수정
1. 싱글톤이 파괴되기전에 OnAwake를 호출하는 오류 수정
2. 게임매니저 로직 start -> awake로 변경
2025-08-14 17:01:55 +09:00

80 lines
2.4 KiB
C#

using System.Collections.Generic;
using System.Threading.Tasks;
using UnityEngine;
namespace DDD
{
public class GameManager : Singleton<GameManager>
{
[SerializeField]
private ManagerDefinitionSo _managerDefinitionSo;
private List<Singleton> _managerInstances;
protected override void OnAwake()
{
base.OnAwake();
EventBus.ClearAll();
_ = Initialize();
}
private async Task Initialize()
{
Debug.Assert(_managerDefinitionSo != null, "_managerDefinitionSo is null");
_managerInstances = new List<Singleton>(_managerDefinitionSo.ManagerClasses.Count);
foreach (var managerPrefab in _managerDefinitionSo.ManagerClasses)
{
if (managerPrefab == null)
{
Debug.LogWarning($"{managerPrefab.name} 프리팹이 null입니다. 건너뜁니다.");
continue;
}
var existingManager = FindAnyObjectByType(managerPrefab.GetType()) as Singleton;
if (existingManager != null)
{
print($"{existingManager.name} 오브젝트가 이미 존재합니다.");
_managerInstances.Add(existingManager);
}
else
{
var newManagerInstance = Instantiate(managerPrefab);
newManagerInstance.name = managerPrefab.name;
_managerInstances.Add(newManagerInstance);
}
}
// PreInit 단계 실행
foreach (var managerInstance in _managerInstances)
{
if (managerInstance is IManager manager)
{
manager.PreInit();
}
}
// Init 단계 실행 (비동기)
foreach (var managerInstance in _managerInstances)
{
if (managerInstance is IManager manager)
{
await manager.Init();
}
}
// PostInit 단계 실행
foreach (var managerInstance in _managerInstances)
{
if (managerInstance is IManager manager)
{
manager.PostInit();
}
}
}
}
}