@@ -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