1
-
1
+ using System . Collections ;
2
+ using System . Threading . Tasks ;
2
3
using UnityEngine ;
4
+ using UnityEngine . SceneManagement ;
5
+ using UnityCore . Menu ;
3
6
4
7
namespace UnityCore {
5
8
6
9
namespace Scene {
7
10
8
11
public class SceneController : MonoBehaviour
9
12
{
13
+ public delegate void SceneLoadDelegate ( SceneType _scene ) ;
14
+
15
+ public static SceneController instance ;
16
+
17
+ public bool debug ;
18
+
19
+ private PageController m_Menu ;
20
+ private SceneType m_TargetScene ;
21
+ private PageType m_LoadingPage ;
22
+ private SceneLoadDelegate m_SceneLoadDelegate ;
23
+ private bool m_SceneIsLoading ;
24
+
25
+ // get menu with integrity
26
+ private PageController menu {
27
+ get {
28
+ if ( m_Menu == null ) {
29
+ m_Menu = PageController . instance ;
30
+ }
31
+ if ( m_Menu == null ) {
32
+ LogWarning ( "You are trying to access the PageController, but no instance was found." ) ;
33
+ }
34
+ return m_Menu ;
35
+ }
36
+ }
37
+
38
+ private string currentSceneName {
39
+ get {
40
+ return SceneManager . GetActiveScene ( ) . name ;
41
+ }
42
+ }
10
43
44
+ #region Unity Functions
45
+ private void Awake ( ) {
46
+ if ( ! instance ) {
47
+ Configure ( ) ;
48
+ DontDestroyOnLoad ( gameObject ) ;
49
+ } else {
50
+ Destroy ( gameObject ) ;
51
+ }
52
+ }
53
+
54
+ private void OnDisable ( ) {
55
+ Dispose ( ) ;
56
+ }
57
+ #endregion
58
+
59
+ #region Public Functions
60
+ public void Load ( SceneType _scene , SceneLoadDelegate _sceneLoadDelegate = null , bool _reload = false , PageType _loadingPage = PageType . None ) {
61
+ if ( _loadingPage != PageType . None && ! menu ) {
62
+ return ;
63
+ }
64
+
65
+ if ( ! SceneCanBeLoaded ( _scene , _reload ) ) {
66
+ return ;
67
+ }
68
+
69
+ m_SceneIsLoading = true ;
70
+ m_TargetScene = _scene ;
71
+ m_LoadingPage = _loadingPage ;
72
+ m_SceneLoadDelegate = _sceneLoadDelegate ;
73
+ StartCoroutine ( "LoadScene" ) ;
74
+ }
75
+ #endregion
76
+
77
+ #region Private Functions
78
+ private void Configure ( ) {
79
+ instance = this ;
80
+ SceneManager . sceneLoaded += OnSceneLoaded ;
81
+ }
82
+
83
+ private void Dispose ( ) {
84
+ SceneManager . sceneLoaded -= OnSceneLoaded ;
85
+ }
86
+
87
+ private async void OnSceneLoaded ( UnityEngine . SceneManagement . Scene _scene , LoadSceneMode _mode ) {
88
+ if ( m_TargetScene == SceneType . None ) {
89
+ return ;
90
+ }
91
+
92
+ SceneType _sceneType = StringToSceneType ( _scene . name ) ;
93
+ if ( m_TargetScene != _sceneType ) {
94
+ return ;
95
+ }
96
+
97
+ if ( m_SceneLoadDelegate != null ) {
98
+ try {
99
+ m_SceneLoadDelegate ( _sceneType ) ; // it is possible the delegate is no longer accessible
100
+ } catch ( System . Exception ) {
101
+ LogWarning ( "Unable to respond with sceneLoadDelegate after scene [" + _sceneType + "] loaded." ) ;
102
+ }
103
+ }
104
+
105
+ if ( m_LoadingPage != PageType . None ) {
106
+ await Task . Delay ( 1000 ) ;
107
+ menu . TurnPageOff ( m_LoadingPage ) ;
108
+ }
109
+
110
+ m_SceneIsLoading = false ;
111
+ }
112
+
113
+ private IEnumerator LoadScene ( ) {
114
+ if ( m_LoadingPage != PageType . None ) {
115
+ menu . TurnPageOn ( m_LoadingPage ) ;
116
+ while ( ! menu . PageIsOn ( m_LoadingPage ) ) {
117
+ yield return null ;
118
+ }
119
+ }
120
+
121
+ string _targetSceneName = SceneTypeToString ( m_TargetScene ) ;
122
+ SceneManager . LoadScene ( _targetSceneName ) ;
123
+ }
124
+
125
+ private bool SceneCanBeLoaded ( SceneType _scene , bool _reload ) {
126
+ string _targetSceneName = SceneTypeToString ( _scene ) ;
127
+ if ( currentSceneName == _targetSceneName && ! _reload ) {
128
+ LogWarning ( "You are trying to load a scene [" + _scene + "] which is already active." ) ;
129
+ return false ;
130
+ } else if ( _targetSceneName == string . Empty ) {
131
+ LogWarning ( "The scene you are trying to load [" + _scene + "] is not valid." ) ;
132
+ return false ;
133
+ } else if ( m_SceneIsLoading ) {
134
+ LogWarning ( "Unable to load scene [" + _scene + "]. Another scene [" + m_TargetScene + "] is already loading." ) ;
135
+ return false ;
136
+ }
137
+
138
+ return true ;
139
+ }
140
+
141
+ private string SceneTypeToString ( SceneType _scene ) {
142
+ switch ( _scene ) {
143
+ case SceneType . Game : return "Game" ;
144
+ case SceneType . Menu : return "Menu" ;
145
+ default :
146
+ LogWarning ( "Scene [" + _scene + "] does not contain a string for a valid scene." ) ;
147
+ return string . Empty ;
148
+ }
149
+ }
150
+
151
+ private SceneType StringToSceneType ( string _scene ) {
152
+ switch ( _scene ) {
153
+ case "Game" : return SceneType . Game ;
154
+ case "Menu" : return SceneType . Menu ;
155
+ default :
156
+ LogWarning ( "Scene [" + _scene + "] does not contain a type for a valid scene." ) ;
157
+ return SceneType . None ;
158
+ }
159
+ }
160
+
161
+ private void Log ( string _msg ) {
162
+ if ( ! debug ) return ;
163
+ Debug . Log ( "[Scene Controller]: " + _msg ) ;
164
+ }
165
+
166
+ private void LogWarning ( string _msg ) {
167
+ if ( ! debug ) return ;
168
+ Debug . LogWarning ( "[Scene Controller]: " + _msg ) ;
169
+ }
170
+ #endregion
11
171
}
12
172
}
13
173
}
0 commit comments