1
- using System . Collections . Generic ;
1
+ using System . Collections . Generic ;
2
2
using System . Linq ;
3
3
using UnityEditor ;
4
4
using UnityEditor . SceneManagement ;
@@ -21,10 +21,37 @@ private static void OpenWindow()
21
21
[ System . Serializable ]
22
22
private class SceneSwitcherData
23
23
{
24
- public List < string > sceneGuids = new List < string > ( ) ;
24
+ public List < SceneData > scenes = new List < SceneData > ( ) ;
25
25
public bool sortRecentToTop = true ;
26
26
public bool loadAdditive = true ;
27
27
public bool closeScenes = true ;
28
+
29
+ public void AddScene ( string guid )
30
+ {
31
+ if ( ! scenes . Exists ( ( scene ) => scene . guid == guid ) )
32
+ {
33
+ var sceneData = new SceneData ( ) { guid = guid , color = Color . white } ;
34
+
35
+ scenes . Add ( sceneData ) ;
36
+ }
37
+ }
38
+
39
+ [ System . Serializable ]
40
+ internal class SceneData
41
+ {
42
+ public string guid ;
43
+ public Color color ;
44
+ public bool foldout ;
45
+ public BooleanOverride loadAdditive ;
46
+ public BooleanOverride closeScenes ;
47
+ }
48
+ }
49
+
50
+ public enum BooleanOverride
51
+ {
52
+ Default = 0 ,
53
+ Yes = 1 ,
54
+ No = 2
28
55
}
29
56
30
57
private SceneSwitcherData _sceneSwitcherData = new SceneSwitcherData ( ) ;
@@ -44,6 +71,11 @@ private void OnEnable()
44
71
}
45
72
46
73
private void OnDisable ( )
74
+ {
75
+ SaveState ( ) ;
76
+ }
77
+
78
+ private void SaveState ( )
47
79
{
48
80
//Save State
49
81
PlayerPrefs . SetString ( PrefsKey , JsonUtility . ToJson ( _sceneSwitcherData ) ) ;
@@ -81,7 +113,7 @@ private void OnGUI()
81
113
break ;
82
114
}
83
115
84
- if ( _sceneSwitcherData . sceneGuids . Count > 0 )
116
+ if ( _sceneSwitcherData . scenes . Count > 0 )
85
117
{
86
118
SceneListGui ( ) ;
87
119
}
@@ -107,67 +139,117 @@ private static void BoxGui(string text)
107
139
private void SceneListGui ( )
108
140
{
109
141
_scrollPosition = EditorGUILayout . BeginScrollView ( _scrollPosition ) ;
142
+ const int lineHeight = 18 ;
110
143
111
144
GUILayout . BeginVertical ( new GUIStyle ( "GroupBox" ) ) ;
112
- foreach ( var guid in _sceneSwitcherData . sceneGuids )
145
+ foreach ( var sceneData in _sceneSwitcherData . scenes )
113
146
{
147
+ if ( sceneData . foldout )
148
+ {
149
+ GUILayout . BeginVertical ( EditorStyles . helpBox ) ;
150
+ }
151
+ else
152
+ {
153
+ GUILayout . BeginVertical ( ) ;
154
+ }
155
+
114
156
GUILayout . BeginHorizontal ( ) ;
115
157
116
158
if ( _editing )
117
159
{
118
160
if ( GUILayout . Button ( "↑" , GUILayout . MaxWidth ( 20 ) ) )
119
161
{
120
- MoveUp ( guid ) ;
121
- return ;
162
+ MoveUp ( sceneData ) ;
163
+ GUILayout . EndHorizontal ( ) ;
164
+ GUILayout . EndVertical ( ) ;
165
+ break ;
122
166
}
123
-
124
- if ( GUILayout . Button ( "↓" , GUILayout . MaxWidth ( 20 ) ) )
167
+ else if ( GUILayout . Button ( "↓" , GUILayout . MaxWidth ( 20 ) ) )
125
168
{
126
- MoveDown ( guid ) ;
127
- return ;
169
+ MoveDown ( sceneData ) ;
170
+ GUILayout . EndHorizontal ( ) ;
171
+ GUILayout . EndVertical ( ) ;
172
+ break ;
128
173
}
129
174
}
130
175
131
- var path = AssetDatabase . GUIDToAssetPath ( guid ) ;
176
+ var path = AssetDatabase . GUIDToAssetPath ( sceneData . guid ) ;
177
+ var preColorBG = GUI . backgroundColor ;
178
+ GUI . backgroundColor = sceneData . color ;
179
+
132
180
if ( GUILayout . Button ( System . IO . Path . GetFileNameWithoutExtension ( path ) ) )
133
181
{
182
+ GUI . backgroundColor = preColorBG ;
134
183
// Give user option to save/cancel
135
184
if ( ! EditorSceneManager . SaveCurrentModifiedScenesIfUserWantsTo ( ) )
136
185
{
137
- return ;
186
+ GUILayout . EndHorizontal ( ) ;
187
+ GUILayout . EndVertical ( ) ;
188
+ break ;
138
189
}
139
190
140
- SwitchToScene ( path ) ;
191
+ SwitchToScene ( sceneData , path ) ;
141
192
if ( _sceneSwitcherData . sortRecentToTop )
142
193
{
143
- MoveToTop ( guid ) ;
194
+ MoveToTop ( sceneData ) ;
144
195
}
145
196
146
- return ;
197
+ GUILayout . EndHorizontal ( ) ;
198
+ GUILayout . EndVertical ( ) ;
199
+ break ;
147
200
}
148
201
202
+ GUI . backgroundColor = preColorBG ;
203
+
149
204
if ( _editing )
150
205
{
151
206
GUI . backgroundColor = Color . red ;
152
- if ( GUILayout . Button ( "X" , GUILayout . MaxWidth ( 20 ) ) )
207
+ if ( GUILayout . Button ( EditorGUIUtility . IconContent ( "d_TreeEditor.Trash" ) , GUILayout . Width ( 30 ) ) )
153
208
{
154
- _sceneSwitcherData . sceneGuids . Remove ( guid ) ;
155
- return ;
209
+ _sceneSwitcherData . scenes . Remove ( sceneData ) ;
210
+ SaveState ( ) ;
211
+ GUILayout . EndHorizontal ( ) ;
212
+ GUILayout . EndVertical ( ) ;
213
+ break ;
156
214
}
157
-
158
215
GUI . backgroundColor = Color . white ;
216
+
217
+ var arrowTexture = sceneData . foldout ? EditorGUIUtility . IconContent ( "d_scrolldown" ) : EditorGUIUtility . IconContent ( "d_scrollup" ) ;
218
+ if ( GUILayout . Button ( arrowTexture , GUILayout . Width ( 25 ) , GUILayout . Height ( 20 ) ) )
219
+ {
220
+ sceneData . foldout = ! sceneData . foldout ;
221
+ }
159
222
}
160
223
161
224
GUILayout . EndHorizontal ( ) ;
225
+
226
+ if ( _editing && sceneData . foldout )
227
+ {
228
+ GUILayout . BeginVertical ( ) ;
229
+
230
+ var temp = EditorGUIUtility . labelWidth ;
231
+ EditorGUIUtility . labelWidth = 100 ;
232
+
233
+ sceneData . color = EditorGUILayout . ColorField ( "Button Tint" , sceneData . color ) ;
234
+ sceneData . loadAdditive = ( BooleanOverride ) EditorGUILayout . EnumPopup ( new GUIContent ( "Additive Load" , "Loads scenes additively" ) , sceneData . loadAdditive ) ;
235
+ sceneData . closeScenes = ( BooleanOverride ) EditorGUILayout . EnumPopup ( new GUIContent ( "Close Others" , "Will close/unload other scenes when additive loading is active" ) , sceneData . closeScenes ) ;
236
+
237
+ EditorGUIUtility . labelWidth = temp ;
238
+
239
+ GUILayout . EndVertical ( ) ;
240
+ }
241
+
242
+ GUILayout . EndVertical ( ) ;
243
+
162
244
}
163
245
164
246
GUILayout . EndVertical ( ) ;
165
247
166
- const int lineHeight = 18 ;
167
248
if ( _editing )
168
249
{
169
250
//Draw Toggle Buttons
170
- GUILayout . BeginHorizontal ( ) ;
251
+ GUILayout . Label ( "Default Settings" ) ;
252
+ GUILayout . BeginHorizontal ( new GUIStyle ( "GroupBox" ) ) ;
171
253
_sceneSwitcherData . sortRecentToTop = GUILayout . Toggle ( _sceneSwitcherData . sortRecentToTop ,
172
254
new GUIContent ( "Auto Sort" , "Will sort most recently used scenes to the top" ) ,
173
255
GUILayout . Height ( lineHeight ) ) ;
@@ -177,7 +259,7 @@ private void SceneListGui()
177
259
new GUIContent ( "Close" , "Will close/unload other scenes when additive loading is active" ) ,
178
260
GUILayout . Height ( lineHeight ) ) ;
179
261
GUILayout . EndHorizontal ( ) ;
180
-
262
+
181
263
//Draw Done Button
182
264
GUILayout . BeginHorizontal ( ) ;
183
265
@@ -190,47 +272,53 @@ private void SceneListGui()
190
272
GUI . backgroundColor = Color . white ;
191
273
192
274
GUILayout . EndHorizontal ( ) ;
275
+
276
+ EditorGUILayout . Space ( ) ;
277
+ EditorGUILayout . Space ( ) ;
278
+
193
279
}
194
-
280
+
195
281
EditorGUILayout . EndScrollView ( ) ;
196
282
}
197
283
198
- private void MoveToTop ( string guid )
284
+ private void MoveToTop ( SceneSwitcherData . SceneData guid )
199
285
{
200
- _sceneSwitcherData . sceneGuids . Remove ( guid ) ;
201
- _sceneSwitcherData . sceneGuids . Insert ( 0 , guid ) ;
286
+ _sceneSwitcherData . scenes . Remove ( guid ) ;
287
+ _sceneSwitcherData . scenes . Insert ( 0 , guid ) ;
202
288
}
203
289
204
- private void MoveUp ( string guid )
290
+ private void MoveUp ( SceneSwitcherData . SceneData guid )
205
291
{
206
- var index = _sceneSwitcherData . sceneGuids . IndexOf ( guid ) ;
207
- _sceneSwitcherData . sceneGuids . RemoveAt ( index ) ;
292
+ var index = _sceneSwitcherData . scenes . IndexOf ( guid ) ;
293
+ _sceneSwitcherData . scenes . RemoveAt ( index ) ;
208
294
if ( index > 0 )
209
295
{
210
296
index -- ;
211
297
}
212
298
213
- _sceneSwitcherData . sceneGuids . Insert ( index , guid ) ;
299
+ _sceneSwitcherData . scenes . Insert ( index , guid ) ;
214
300
}
215
301
216
- private void MoveDown ( string guid )
302
+ private void MoveDown ( SceneSwitcherData . SceneData guid )
217
303
{
218
- var index = _sceneSwitcherData . sceneGuids . IndexOf ( guid ) ;
219
- _sceneSwitcherData . sceneGuids . RemoveAt ( index ) ;
220
- if ( index < _sceneSwitcherData . sceneGuids . Count )
304
+ var index = _sceneSwitcherData . scenes . IndexOf ( guid ) ;
305
+ _sceneSwitcherData . scenes . RemoveAt ( index ) ;
306
+ if ( index < _sceneSwitcherData . scenes . Count )
221
307
{
222
308
index ++ ;
223
309
}
224
310
225
- _sceneSwitcherData . sceneGuids . Insert ( index , guid ) ;
311
+ _sceneSwitcherData . scenes . Insert ( index , guid ) ;
226
312
}
227
313
228
- private void SwitchToScene ( string path )
314
+ private void SwitchToScene ( SceneSwitcherData . SceneData sceneData , string path )
229
315
{
230
- var scene = EditorSceneManager . OpenScene ( path ,
231
- _sceneSwitcherData . loadAdditive ? OpenSceneMode . Additive : OpenSceneMode . Single ) ;
316
+ var closeScenes = sceneData . closeScenes == BooleanOverride . Default ? _sceneSwitcherData . closeScenes : ( sceneData . closeScenes == BooleanOverride . Yes ) ;
317
+ var loadAdditively = sceneData . loadAdditive == BooleanOverride . Default ? _sceneSwitcherData . loadAdditive : ( sceneData . loadAdditive == BooleanOverride . Yes ) ;
318
+
319
+ var scene = EditorSceneManager . OpenScene ( path , loadAdditively ? OpenSceneMode . Additive : OpenSceneMode . Single ) ;
232
320
233
- if ( ! _sceneSwitcherData . closeScenes )
321
+ if ( ! closeScenes )
234
322
{
235
323
return ;
236
324
}
@@ -260,11 +348,9 @@ private void AddObjects(Object[] objects)
260
348
var path = AssetDatabase . GetAssetPath ( sceneAsset ) ;
261
349
var guid = AssetDatabase . AssetPathToGUID ( path ) ;
262
350
263
- if ( ! _sceneSwitcherData . sceneGuids . Contains ( guid ) )
264
- {
265
- _sceneSwitcherData . sceneGuids . Add ( guid ) ;
266
- }
351
+ _sceneSwitcherData . AddScene ( guid ) ;
267
352
}
353
+ SaveState ( ) ;
268
354
}
269
355
270
356
private static bool IsValidSelection ( IEnumerable < Object > objects )
@@ -286,6 +372,6 @@ private void ToggleEdit()
286
372
}
287
373
288
374
#endregion
289
-
375
+
290
376
}
291
- }
377
+ }
0 commit comments