게임매니저 수정
씬에 인스턴스 중복 체크해서 생성할지 말지 결정
This commit is contained in:
parent
4738abd677
commit
3b290235f8
@ -1,4 +1,5 @@
|
||||
using System.Collections.Generic;
|
||||
using System.Threading.Tasks;
|
||||
using UnityEngine;
|
||||
|
||||
namespace DDD
|
||||
@ -14,29 +15,59 @@ protected async void Start()
|
||||
{
|
||||
base.OnAwake();
|
||||
|
||||
EventBus.ClearAll();
|
||||
|
||||
_ = Initialize();
|
||||
}
|
||||
|
||||
private async Task Initialize()
|
||||
{
|
||||
if (_managerDefinitionSo == null)
|
||||
{
|
||||
Debug.LogError("_managerDefinitionSo");
|
||||
return;
|
||||
}
|
||||
|
||||
EventBus.ClearAll();
|
||||
|
||||
// 매니저 초기화
|
||||
_managerInstances = new List<Singleton>(_managerDefinitionSo.ManagerClasses.Count);
|
||||
|
||||
foreach (var managerObject in _managerDefinitionSo.ManagerClasses)
|
||||
// 매니저 클래스들을 순회하면서 씬에 존재하는지 확인하고 생성 또는 재사용
|
||||
foreach (var managerPrefab in _managerDefinitionSo.ManagerClasses)
|
||||
{
|
||||
var managerInstance = Instantiate(managerObject);
|
||||
managerInstance.name = managerObject.name;
|
||||
if (managerPrefab == null)
|
||||
{
|
||||
Debug.LogWarning("매니저 프리팹이 null입니다. 건너뜁니다.");
|
||||
continue;
|
||||
}
|
||||
|
||||
_managerInstances.Add(managerInstance);
|
||||
// 씬에 이미 해당 타입의 매니저가 존재하는지 확인
|
||||
var existingManager = FindObjectOfType(managerPrefab.GetType()) as Singleton;
|
||||
|
||||
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)
|
||||
{
|
||||
manager.PreInit();
|
||||
}
|
||||
}
|
||||
|
||||
// Init 단계 실행 (비동기)
|
||||
foreach (var managerInstance in _managerInstances)
|
||||
{
|
||||
if (managerInstance is IManager manager)
|
||||
@ -44,6 +75,8 @@ protected async void Start()
|
||||
await manager.Init();
|
||||
}
|
||||
}
|
||||
|
||||
// PostInit 단계 실행
|
||||
foreach (var managerInstance in _managerInstances)
|
||||
{
|
||||
if (managerInstance is IManager manager)
|
||||
|
Loading…
Reference in New Issue
Block a user