80 lines
2.4 KiB
C#
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();
|
|
}
|
|
}
|
|
}
|
|
}
|
|
} |