-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathManagersBootstraper.cs
More file actions
136 lines (118 loc) · 3.41 KB
/
Copy pathManagersBootstraper.cs
File metadata and controls
136 lines (118 loc) · 3.41 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;
public class ManagersBootstraper : GenericSingleton<ManagersBootstraper>
{
[SerializeField] private List<ManagerSO> m_ManagersSO;
[SerializeField] private GameManagerSO m_GameManagerSO;
[SerializeField] private bool m_IsCompleteLoadData;
[Space(10), Header("----- Event Channels (Publish) -----")]
[SerializeField] private VoidEventChannelSO m_OnApplicationPauseOrQuit;
// 에디터 툴에서 접근하기 위해 필요한 변수들입니다.
// HideInInspector를 사용하여 평소에는 숨기고 에디터 스크립트에서만 제어합니다.
[Header("Editor Debug Tool"), HideInInspector]
[SerializeField] private ManagerSO m_TestTargetManager;
[HideInInspector]
[SerializeField] private ManagerSO m_NewManagerSO;
private Scene m_currentScene;
protected override void Awake()
{
base.Awake();
if (Instance != this)
{
return;
}
Application.targetFrameRate = 60;
m_currentScene = SceneManager.GetActiveScene();
}
private void Start()
{
foreach (var manager in m_ManagersSO)
{
InitializeManager(manager);
}
}
private void OnEnable()
{
if (Instance == this)
{
SceneManager.sceneLoaded += OnSceneLoaded;
}
}
private void OnDisable()
{
SceneManager.sceneLoaded -= OnSceneLoaded;
}
private void OnDestroy()
{
if (Instance != this)
{
return;
}
for (int i = m_ManagersSO.Count - 1; i >= 0; i--)
{
if (m_ManagersSO[i] != null && m_ManagersSO[i].IsInitialized)
{
m_ManagersSO[i].SetActive(false);
}
}
m_GameManagerSO.Destroy();
}
private void OnApplicationQuit() => m_OnApplicationPauseOrQuit?.RaiseEvent();
private void OnApplicationPause(bool pause)
{
#if UNITY_EDITOR
#else
if (pause) m_OnApplicationPauseOrQuit?.RaiseEvent();
#endif
}
private void OnSceneLoaded(Scene scene, LoadSceneMode mode)
{
if (m_currentScene != scene)
{
m_currentScene = scene;
ExecuteGameStart();
}
}
private void ExecuteGameStart()
{
if (m_GameManagerSO != null)
{
m_GameManagerSO.GameStart();
}
}
public void HandleOnCompleteLoadData()
{
m_IsCompleteLoadData = true;
ExecuteGameStart();
}
// 에디터 리플렉션에서 찾을 수 있도록 private 유지
private void InitializeManager(ManagerSO manager)
{
if (manager != null)
{
manager.SetActive(true);
}
}
// 에디터 툴에서 호출하는 제네릭 교체 메서드
public void ReplaceManager<T>(T newManagerSO) where T : ManagerSO
{
if (newManagerSO == null) return;
int index = m_ManagersSO.FindIndex(m => m is T);
if (index != -1)
{
if (m_ManagersSO[index].IsInitialized)
{
m_ManagersSO[index].SetActive(false);
}
m_ManagersSO[index] = newManagerSO;
InitializeManager(newManagerSO);
Debug.Log($"<color=yellow>[Managers]</color> {typeof(T).Name} replaced with {newManagerSO.name}.");
}
else
{
m_ManagersSO.Add(newManagerSO);
InitializeManager(newManagerSO);
}
}
}