Skip to content

Commit be1ca2c

Browse files
committed
fix(spawning): Fixed start method on new scene objects not firing before scene unload
1 parent dd14b0f commit be1ca2c

File tree

1 file changed

+45
-25
lines changed

1 file changed

+45
-25
lines changed

MLAPI/NetworkingManagerComponents/Core/NetworkSceneManager.cs

Lines changed: 45 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -73,10 +73,17 @@ public static SceneSwitchProgress SwitchScene(string sceneName)
7373
sceneSwitchProgresses.Add(switchSceneProgress.guid, switchSceneProgress);
7474
currentSceneSwitchProgressGuid = switchSceneProgress.guid;
7575

76-
AsyncOperation sceneLoad = SceneManager.LoadSceneAsync(sceneName, LoadSceneMode.Additive);
76+
7777
nextScene = SceneManager.GetSceneByName(sceneName);
78-
sceneLoad.completed += (AsyncOperation AsyncOp) => { OnSceneLoaded(AsyncOp, switchSceneProgress.guid, null); };
7978

79+
Scene temporaryScene = SceneManager.CreateScene("MLAPI_tmp_switch_" + currentSceneSwitchProgressGuid);
80+
81+
// Move ALL networked objects to the temp scene
82+
MoveAllNetworkedObjectsToScene(temporaryScene);
83+
84+
// Switch scene
85+
AsyncOperation sceneLoad = SceneManager.LoadSceneAsync(sceneName, LoadSceneMode.Single);
86+
sceneLoad.completed += (AsyncOperation asyncOp) => { OnSceneLoaded(switchSceneProgress.guid, temporaryScene, null); };
8087
switchSceneProgress.SetSceneLoadOperation(sceneLoad);
8188

8289
return switchSceneProgress;
@@ -96,11 +103,16 @@ internal static void OnSceneSwitch(uint sceneIndex, Guid switchSceneGuid, Stream
96103
}
97104

98105
lastScene = SceneManager.GetActiveScene();
106+
107+
Scene temporaryScene = SceneManager.CreateScene("MLAPI_tmp_switch_" + switchSceneGuid);
108+
109+
// Move ALL networked objects to the temp scene
110+
MoveAllNetworkedObjectsToScene(temporaryScene);
99111

100112
string sceneName = sceneIndexToString[sceneIndex];
101-
AsyncOperation sceneLoad = SceneManager.LoadSceneAsync(sceneName, LoadSceneMode.Additive);
113+
AsyncOperation sceneLoad = SceneManager.LoadSceneAsync(sceneName, LoadSceneMode.Single);
102114
nextScene = SceneManager.GetSceneByName(sceneName);
103-
sceneLoad.completed += (AsyncOperation operation) => { OnSceneLoaded(operation, switchSceneGuid, objectStream); };
115+
sceneLoad.completed += (AsyncOperation operation) => { OnSceneLoaded(switchSceneGuid, temporaryScene, objectStream); };
104116
}
105117

106118
internal static void OnFirstSceneSwitchSync(uint sceneIndex, Guid switchSceneGuid)
@@ -134,39 +146,30 @@ internal static void OnFirstSceneSwitchSync(uint sceneIndex, Guid switchSceneGui
134146
isSwitching = false;
135147
}
136148

137-
private static void OnSceneLoaded(AsyncOperation operation, Guid switchSceneGuid, Stream objectStream)
149+
private static void OnSceneLoaded(Guid switchSceneGuid, Scene temporaryScene, Stream objectStream)
138150
{
139151
CurrentActiveSceneIndex = sceneNameToIndex[nextScene.name];
140152
SceneManager.SetActiveScene(nextScene);
141153

142-
List<NetworkedObject> objectsToKeep = SpawnManager.SpawnedObjectsList;
143-
144-
for (int i = 0; i < objectsToKeep.Count; i++)
145-
{
146-
//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.
147-
if (objectsToKeep[i].gameObject.transform.parent != null)
148-
{
149-
objectsToKeep[i].gameObject.transform.parent = null;
150-
}
151-
152-
SceneManager.MoveGameObjectToScene(objectsToKeep[i].gameObject, nextScene);
153-
}
154+
// Move all objects to the new scene
155+
MoveAllNetworkedObjectsToScene(nextScene);
154156

155-
AsyncOperation sceneUnload = SceneManager.UnloadSceneAsync(lastScene);
156-
sceneUnload.completed += (AsyncOperation AsyncOp) =>
157+
AsyncOperation temporarySceneUnload = SceneManager.UnloadSceneAsync(temporaryScene);
158+
159+
temporarySceneUnload.completed += (AsyncOperation asyncOp) =>
157160
{
158161
if (NetworkingManager.Singleton.IsServer)
159162
{
160-
OnSceneUnloadServer(AsyncOp, switchSceneGuid);
163+
OnSceneUnloadServer(switchSceneGuid);
161164
}
162165
else
163166
{
164-
OnSceneUnloadClient(AsyncOp, switchSceneGuid, objectStream);
167+
OnSceneUnloadClient(switchSceneGuid, objectStream);
165168
}
166169
};
167170
}
168171

169-
private static void OnSceneUnloadServer(AsyncOperation operation, Guid switchSceneGuid)
172+
private static void OnSceneUnloadServer(Guid switchSceneGuid)
170173
{
171174
// Justification: Rare alloc, could(should?) reuse
172175
List<NetworkedObject> newSceneObjects = new List<NetworkedObject>();
@@ -271,7 +274,7 @@ private static void OnSceneUnloadServer(AsyncOperation operation, Guid switchSce
271274
}
272275
}
273276

274-
private static void OnSceneUnloadClient(AsyncOperation operation, Guid switchSceneGuid, Stream objectStream)
277+
private static void OnSceneUnloadClient(Guid switchSceneGuid, Stream objectStream)
275278
{
276279
if (NetworkingManager.Singleton.NetworkConfig.UsePrefabSync)
277280
{
@@ -334,8 +337,6 @@ private static void OnSceneUnloadClient(AsyncOperation operation, Guid switchSce
334337
}
335338
}
336339

337-
// EVENT GOES HERE
338-
339340
isSwitching = false;
340341

341342
if (OnSceneSwitched != null)
@@ -369,7 +370,26 @@ internal static void OnClientSwitchSceneCompleted(ulong clientId, Guid switchSce
369370
internal static void RemoveClientFromSceneSwitchProgresses(ulong clientId)
370371
{
371372
foreach (SceneSwitchProgress switchSceneProgress in sceneSwitchProgresses.Values)
373+
{
372374
switchSceneProgress.RemoveClientAsDone(clientId);
375+
}
376+
}
377+
378+
private static void MoveAllNetworkedObjectsToScene(Scene scene)
379+
{
380+
// Move ALL networked objects to the temp scene
381+
List<NetworkedObject> objectsToKeep = SpawnManager.SpawnedObjectsList;
382+
383+
for (int i = 0; i < objectsToKeep.Count; i++)
384+
{
385+
//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.
386+
if (objectsToKeep[i].gameObject.transform.parent != null)
387+
{
388+
objectsToKeep[i].gameObject.transform.parent = null;
389+
}
390+
391+
SceneManager.MoveGameObjectToScene(objectsToKeep[i].gameObject, scene);
392+
}
373393
}
374394
}
375395
}

0 commit comments

Comments
 (0)