Skip to content

Commit 3f6c42f

Browse files
committed
fix(scene): Changed scene switching to load in single mode
1 parent f1bb0f4 commit 3f6c42f

File tree

1 file changed

+42
-44
lines changed

1 file changed

+42
-44
lines changed

MLAPI/NetworkingManagerComponents/Core/NetworkSceneManager.cs

Lines changed: 42 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -72,25 +72,18 @@ public static SceneSwitchProgress SwitchScene(string sceneName)
7272
SceneSwitchProgress switchSceneProgress = new SceneSwitchProgress();
7373
sceneSwitchProgresses.Add(switchSceneProgress.guid, switchSceneProgress);
7474
currentSceneSwitchProgressGuid = switchSceneProgress.guid;
75-
76-
Scene temporaryScene = SceneManager.CreateScene("MLAPI_tmp_switch_" + currentSceneSwitchProgressGuid);
77-
75+
7876
// Move ALL networked objects to the temp scene
79-
MoveAllNetworkedObjectsToScene(temporaryScene);
77+
MoveObjectsToDontDestroyOnLoad();
8078

81-
AsyncOperation unloadCurrentScene = SceneManager.UnloadSceneAsync(lastScene);
82-
83-
unloadCurrentScene.completed += (AsyncOperation asyncOp1) =>
84-
{
85-
// Switch scene
86-
AsyncOperation sceneLoad = SceneManager.LoadSceneAsync(sceneName, LoadSceneMode.Additive);
79+
// Switch scene
80+
AsyncOperation sceneLoad = SceneManager.LoadSceneAsync(sceneName, LoadSceneMode.Single);
8781

88-
nextScene = SceneManager.GetSceneByName(sceneName);
82+
nextScene = SceneManager.GetSceneByName(sceneName);
8983

90-
sceneLoad.completed += (AsyncOperation asyncOp2) => { OnSceneLoaded(switchSceneProgress.guid, temporaryScene, null); };
84+
sceneLoad.completed += (AsyncOperation asyncOp2) => { OnSceneLoaded(switchSceneProgress.guid, null); };
9185

92-
switchSceneProgress.SetSceneLoadOperation(sceneLoad);
93-
};
86+
switchSceneProgress.SetSceneLoadOperation(sceneLoad);
9487

9588
return switchSceneProgress;
9689
}
@@ -109,26 +102,19 @@ internal static void OnSceneSwitch(uint sceneIndex, Guid switchSceneGuid, Stream
109102
}
110103

111104
lastScene = SceneManager.GetActiveScene();
112-
113-
Scene temporaryScene = SceneManager.CreateScene("MLAPI_tmp_switch_" + switchSceneGuid);
114-
105+
115106
// Move ALL networked objects to the temp scene
116-
MoveAllNetworkedObjectsToScene(temporaryScene);
107+
MoveObjectsToDontDestroyOnLoad();
117108

118109
string sceneName = sceneIndexToString[sceneIndex];
119110

120-
AsyncOperation unloadCurrentScene = SceneManager.UnloadSceneAsync(lastScene);
111+
AsyncOperation sceneLoad = SceneManager.LoadSceneAsync(sceneName, LoadSceneMode.Single);
121112

122-
unloadCurrentScene.completed += (AsyncOperation asyncOp1) =>
123-
{
124-
AsyncOperation sceneLoad = SceneManager.LoadSceneAsync(sceneName, LoadSceneMode.Additive);
125-
126-
nextScene = SceneManager.GetSceneByName(sceneName);
113+
nextScene = SceneManager.GetSceneByName(sceneName);
127114

128-
sceneLoad.completed += (AsyncOperation asyncOp2) =>
129-
{
130-
OnSceneLoaded(switchSceneGuid, temporaryScene, objectStream);
131-
};
115+
sceneLoad.completed += (AsyncOperation asyncOp2) =>
116+
{
117+
OnSceneLoaded(switchSceneGuid, objectStream);
132118
};
133119
}
134120

@@ -163,27 +149,22 @@ internal static void OnFirstSceneSwitchSync(uint sceneIndex, Guid switchSceneGui
163149
isSwitching = false;
164150
}
165151

166-
private static void OnSceneLoaded(Guid switchSceneGuid, Scene temporaryScene, Stream objectStream)
152+
private static void OnSceneLoaded(Guid switchSceneGuid, Stream objectStream)
167153
{
168154
CurrentActiveSceneIndex = sceneNameToIndex[nextScene.name];
169155
SceneManager.SetActiveScene(nextScene);
170156

171157
// Move all objects to the new scene
172-
MoveAllNetworkedObjectsToScene(nextScene);
158+
MoveObjectsToScene(nextScene);
173159

174-
AsyncOperation temporarySceneUnload = SceneManager.UnloadSceneAsync(temporaryScene);
175-
176-
temporarySceneUnload.completed += (AsyncOperation asyncOp) =>
160+
if (NetworkingManager.Singleton.IsServer)
177161
{
178-
if (NetworkingManager.Singleton.IsServer)
179-
{
180-
OnSceneUnloadServer(switchSceneGuid);
181-
}
182-
else
183-
{
184-
OnSceneUnloadClient(switchSceneGuid, objectStream);
185-
}
186-
};
162+
OnSceneUnloadServer(switchSceneGuid);
163+
}
164+
else
165+
{
166+
OnSceneUnloadClient(switchSceneGuid, objectStream);
167+
}
187168
}
188169

189170
private static void OnSceneUnloadServer(Guid switchSceneGuid)
@@ -392,8 +373,25 @@ internal static void RemoveClientFromSceneSwitchProgresses(ulong clientId)
392373
}
393374
}
394375

395-
private static void MoveAllNetworkedObjectsToScene(Scene scene)
396-
{
376+
private static void MoveObjectsToDontDestroyOnLoad()
377+
{
378+
// Move ALL networked objects to the temp scene
379+
List<NetworkedObject> objectsToKeep = SpawnManager.SpawnedObjectsList;
380+
381+
for (int i = 0; i < objectsToKeep.Count; i++)
382+
{
383+
//In case an object has been set as a child of another object it has to be unchilded in order to be moved from one scene to another.
384+
if (objectsToKeep[i].gameObject.transform.parent != null)
385+
{
386+
objectsToKeep[i].gameObject.transform.parent = null;
387+
}
388+
389+
MonoBehaviour.DontDestroyOnLoad(objectsToKeep[i].gameObject);
390+
}
391+
}
392+
393+
private static void MoveObjectsToScene(Scene scene)
394+
{
397395
// Move ALL networked objects to the temp scene
398396
List<NetworkedObject> objectsToKeep = SpawnManager.SpawnedObjectsList;
399397

0 commit comments

Comments
 (0)