게임매니저 수정

씬에 인스턴스 중복 체크해서 생성할지 말지 결정
This commit is contained in:
NTG 2025-08-14 14:02:25 +09:00
parent 4738abd677
commit 3b290235f8

View File

@ -1,4 +1,5 @@
using System.Collections.Generic; using System.Collections.Generic;
using System.Threading.Tasks;
using UnityEngine; using UnityEngine;
namespace DDD namespace DDD
@ -7,36 +8,66 @@ public class GameManager : Singleton<GameManager>
{ {
[SerializeField] [SerializeField]
private ManagerDefinitionSo _managerDefinitionSo; private ManagerDefinitionSo _managerDefinitionSo;
private List<Singleton> _managerInstances; private List<Singleton> _managerInstances;
protected async void Start() protected async void Start()
{ {
base.OnAwake(); base.OnAwake();
EventBus.ClearAll();
_ = Initialize();
}
private async Task Initialize()
{
if (_managerDefinitionSo == null) if (_managerDefinitionSo == null)
{ {
Debug.LogError("_managerDefinitionSo"); Debug.LogError("_managerDefinitionSo");
return; return;
} }
EventBus.ClearAll();
// 매니저 초기화
_managerInstances = new List<Singleton>(_managerDefinitionSo.ManagerClasses.Count); _managerInstances = new List<Singleton>(_managerDefinitionSo.ManagerClasses.Count);
foreach (var managerObject in _managerDefinitionSo.ManagerClasses) // 매니저 클래스들을 순회하면서 씬에 존재하는지 확인하고 생성 또는 재사용
foreach (var managerPrefab in _managerDefinitionSo.ManagerClasses)
{ {
var managerInstance = Instantiate(managerObject); if (managerPrefab == null)
managerInstance.name = managerObject.name; {
Debug.LogWarning("매니저 프리팹이 null입니다. 건너뜁니다.");
continue;
}
// 씬에 이미 해당 타입의 매니저가 존재하는지 확인
var existingManager = FindObjectOfType(managerPrefab.GetType()) as Singleton;
_managerInstances.Add(managerInstance); if (existingManager != null)
{
// 이미 씬에 존재하는 경우 재사용
Debug.Log($"매니저 {managerPrefab.GetType().Name}이(가) 씬에 이미 존재합니다. 재사용합니다.");
_managerInstances.Add(existingManager);
}
else
{
// 씬에 존재하지 않는 경우 새로 생성
var newManagerInstance = Instantiate(managerPrefab);
newManagerInstance.name = $"{managerPrefab.name}_Instance";
Debug.Log($"매니저 {managerPrefab.GetType().Name}을(를) 새로 생성했습니다.");
_managerInstances.Add(newManagerInstance);
}
}
// PreInit 단계 실행
foreach (var managerInstance in _managerInstances)
{
if (managerInstance is IManager manager) if (managerInstance is IManager manager)
{ {
manager.PreInit(); manager.PreInit();
} }
} }
// Init 단계 실행 (비동기)
foreach (var managerInstance in _managerInstances) foreach (var managerInstance in _managerInstances)
{ {
if (managerInstance is IManager manager) if (managerInstance is IManager manager)
@ -44,6 +75,8 @@ protected async void Start()
await manager.Init(); await manager.Init();
} }
} }
// PostInit 단계 실행
foreach (var managerInstance in _managerInstances) foreach (var managerInstance in _managerInstances)
{ {
if (managerInstance is IManager manager) if (managerInstance is IManager manager)