Skip to content
This repository was archived by the owner on May 22, 2025. It is now read-only.

Commit 5158b0d

Browse files
Some fixed to the Manager
- Fixed issues where getting the active scenes list would not always be up to date. - Added support for loading scene groups via an editor button on the multi scene manager.
1 parent 0bb93c0 commit 5158b0d

File tree

2 files changed

+98
-8
lines changed

2 files changed

+98
-8
lines changed
Lines changed: 86 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,86 @@
1+
// ----------------------------------------------------------------------------
2+
// MultiSceneManagerEditor.cs
3+
//
4+
// Author: Jonathan Carter (A.K.A. J)
5+
// Date: 10/11/2021
6+
// ----------------------------------------------------------------------------
7+
8+
using System;
9+
using System.Collections.Generic;
10+
using System.IO;
11+
using System.Linq;
12+
using JTools.Editor;
13+
using UnityEditor;
14+
using UnityEditor.SceneManagement;
15+
using UnityEngine;
16+
using UnityEngine.SceneManagement;
17+
18+
namespace MultiScene.Core.Editor
19+
{
20+
[CustomEditor(typeof(MultiSceneManager))]
21+
public class MultiSceneManagerEditor : UnityEditor.Editor
22+
{
23+
private MultiSceneManager multiSceneManager;
24+
25+
private void OnEnable()
26+
{
27+
multiSceneManager = target as MultiSceneManager;
28+
}
29+
30+
public override void OnInspectorGUI()
31+
{
32+
Button.ColourButton("Load All In Editor (Will throw editor error, ignore it)", Colours.Green, LoadActiveSceneGroupInEditor);
33+
Button.ColourButton("Load All Additive In Editor", Colours.Yellow, LoadAdditiveActiveSceneGroupInEditor);
34+
base.OnInspectorGUI();
35+
}
36+
37+
38+
private void LoadActiveSceneGroupInEditor()
39+
{
40+
var _sceneList = multiSceneManager.scenesToLoad.scenes;
41+
var _paths = GetScenePaths();
42+
if (_sceneList.Count <= 0) return;
43+
44+
for (var i = 0; i < _sceneList.Count; i++)
45+
{
46+
var _scene = _sceneList[i];
47+
var _path = _paths.FirstOrDefault(t => t.Contains(_scene));
48+
49+
if (i.Equals(0))
50+
EditorSceneManager.OpenScene(_path, OpenSceneMode.Single);
51+
else
52+
EditorSceneManager.OpenScene(_path, OpenSceneMode.Additive);
53+
}
54+
}
55+
56+
57+
private void LoadAdditiveActiveSceneGroupInEditor()
58+
{
59+
var _sceneList = multiSceneManager.scenesToLoad.scenes;
60+
var _paths = GetScenePaths();
61+
if (_sceneList.Count <= 0) return;
62+
63+
for (var i = 0; i < _sceneList.Count; i++)
64+
{
65+
var _scene = _sceneList[i];
66+
var _path = _paths.FirstOrDefault(t => t.Contains(_scene));
67+
68+
if (i.Equals(0)) continue;
69+
EditorSceneManager.OpenScene(_path, OpenSceneMode.Additive);
70+
}
71+
}
72+
73+
74+
private List<string> GetScenePaths()
75+
{
76+
var sceneNumber = SceneManager.sceneCountInBuildSettings;
77+
string[] arrayOfNames;
78+
arrayOfNames = new string[sceneNumber];
79+
80+
for (int i = 0; i < sceneNumber; i++)
81+
arrayOfNames[i] = SceneUtility.GetScenePathByBuildIndex(i);
82+
83+
return arrayOfNames.ToList();
84+
}
85+
}
86+
}

Core/Scripts/MultiSceneManager.cs

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@ public bool LoadOnAwake
4444
}
4545

4646
public static Action<string> OnSceneLoaded;
47+
public static Action<SceneGroup> OnSceneGroupLoaded;
4748

4849

4950
/// <summary>
@@ -56,13 +57,7 @@ public bool IsSceneLoaded(string sceneName)
5657
if (!hasCachedScenesList)
5758
GetActiveSceneNames();
5859

59-
foreach (var s in cachedActiveSceneNames)
60-
{
61-
if (SceneManager.GetSceneByName(s).name.Equals(sceneName))
62-
return true;
63-
}
64-
65-
return false;
60+
return cachedActiveSceneNames.Contains(sceneName);
6661
}
6762

6863
/// <summary>
@@ -79,7 +74,7 @@ public bool IsSceneInGroup(SceneGroup group, string sceneName)
7974
/// <summary>
8075
/// Gets the list of active scenes and returns them as a string.
8176
/// </summary>
82-
private List<string> GetActiveSceneNames()
77+
public List<string> GetActiveSceneNames()
8378
{
8479
var _list = new List<string>();
8580

@@ -132,6 +127,8 @@ private void CallListeners(Scene s, LoadSceneMode l)
132127
enableListeners = SceneElly.GetComponentsFromAllScenes<IMultiSceneEnable>();
133128
startListeners = SceneElly.GetComponentsFromAllScenes<IMultiSceneStart>();
134129

130+
GetActiveSceneNames();
131+
135132
StartCoroutine(CallMultiSceneAwake());
136133
SceneManager.sceneLoaded -= CallListeners;
137134
}
@@ -176,6 +173,7 @@ private IEnumerator CallMultiSceneStart()
176173
_l.OnMultiSceneStart();
177174

178175
PostSceneLoaded?.Invoke();
176+
OnSceneGroupLoaded?.Invoke(activeSceneGroup);
179177
}
180178

181179

@@ -241,6 +239,8 @@ public void LoadScenes()
241239
else
242240
SceneManager.LoadSceneAsync(_s, LoadSceneMode.Additive);
243241
}
242+
243+
GetActiveSceneNames();
244244
}
245245

246246
/// <summary>
@@ -269,6 +269,8 @@ public void LoadScenes(SceneGroup group)
269269
else
270270
SceneManager.LoadSceneAsync(_s, LoadSceneMode.Additive);
271271
}
272+
273+
GetActiveSceneNames();
272274
}
273275

274276

@@ -298,6 +300,8 @@ public void LoadScenesKeepBase(SceneGroup group)
298300
else
299301
SceneManager.LoadSceneAsync(_s, LoadSceneMode.Additive);
300302
}
303+
304+
GetActiveSceneNames();
301305
}
302306
}
303307
}

0 commit comments

Comments
 (0)