From 3b290235f89b87b6e5502cda14da856a1772b03a Mon Sep 17 00:00:00 2001 From: NTG Date: Thu, 14 Aug 2025 14:02:25 +0900 Subject: [PATCH] =?UTF-8?q?=EA=B2=8C=EC=9E=84=EB=A7=A4=EB=8B=88=EC=A0=80?= =?UTF-8?q?=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 씬에 인스턴스 중복 체크해서 생성할지 말지 결정 --- .../_Scripts/GameFramework/GameManager.cs | 55 +++++++++++++++---- 1 file changed, 44 insertions(+), 11 deletions(-) diff --git a/Assets/_DDD/_Scripts/GameFramework/GameManager.cs b/Assets/_DDD/_Scripts/GameFramework/GameManager.cs index c6579dfc5..bc7692cd5 100644 --- a/Assets/_DDD/_Scripts/GameFramework/GameManager.cs +++ b/Assets/_DDD/_Scripts/GameFramework/GameManager.cs @@ -1,4 +1,5 @@ using System.Collections.Generic; +using System.Threading.Tasks; using UnityEngine; namespace DDD @@ -7,36 +8,66 @@ public class GameManager : Singleton { [SerializeField] private ManagerDefinitionSo _managerDefinitionSo; - + private List _managerInstances; - + 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(_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; + } + + // 씬에 이미 해당 타입의 매니저가 존재하는지 확인 + 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) { 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)