@@ -73,11 +73,24 @@ 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 ) ;
77- nextScene = SceneManager . GetSceneByName ( sceneName ) ;
78- sceneLoad . completed += ( AsyncOperation AsyncOp ) => { OnSceneLoaded ( AsyncOp , switchSceneProgress . guid , null ) ; } ;
76+ Scene temporaryScene = SceneManager . CreateScene ( "MLAPI_tmp_switch_" + currentSceneSwitchProgressGuid ) ;
77+
78+ // Move ALL networked objects to the temp scene
79+ MoveAllNetworkedObjectsToScene ( temporaryScene ) ;
7980
80- switchSceneProgress . SetSceneLoadOperation ( sceneLoad ) ;
81+ AsyncOperation unloadCurrentScene = SceneManager . UnloadSceneAsync ( lastScene ) ;
82+
83+ unloadCurrentScene . completed += ( AsyncOperation asyncOp1 ) =>
84+ {
85+ // Switch scene
86+ AsyncOperation sceneLoad = SceneManager . LoadSceneAsync ( sceneName , LoadSceneMode . Additive ) ;
87+
88+ nextScene = SceneManager . GetSceneByName ( sceneName ) ;
89+
90+ sceneLoad . completed += ( AsyncOperation asyncOp2 ) => { OnSceneLoaded ( switchSceneProgress . guid , temporaryScene , null ) ; } ;
91+
92+ switchSceneProgress . SetSceneLoadOperation ( sceneLoad ) ;
93+ } ;
8194
8295 return switchSceneProgress ;
8396 }
@@ -96,11 +109,27 @@ internal static void OnSceneSwitch(uint sceneIndex, Guid switchSceneGuid, Stream
96109 }
97110
98111 lastScene = SceneManager . GetActiveScene ( ) ;
112+
113+ Scene temporaryScene = SceneManager . CreateScene ( "MLAPI_tmp_switch_" + switchSceneGuid ) ;
114+
115+ // Move ALL networked objects to the temp scene
116+ MoveAllNetworkedObjectsToScene ( temporaryScene ) ;
99117
100118 string sceneName = sceneIndexToString [ sceneIndex ] ;
101- AsyncOperation sceneLoad = SceneManager . LoadSceneAsync ( sceneName , LoadSceneMode . Additive ) ;
102- nextScene = SceneManager . GetSceneByName ( sceneName ) ;
103- sceneLoad . completed += ( AsyncOperation operation ) => { OnSceneLoaded ( operation , switchSceneGuid , objectStream ) ; } ;
119+
120+ AsyncOperation unloadCurrentScene = SceneManager . UnloadSceneAsync ( lastScene ) ;
121+
122+ unloadCurrentScene . completed += ( AsyncOperation asyncOp1 ) =>
123+ {
124+ AsyncOperation sceneLoad = SceneManager . LoadSceneAsync ( sceneName , LoadSceneMode . Additive ) ;
125+
126+ nextScene = SceneManager . GetSceneByName ( sceneName ) ;
127+
128+ sceneLoad . completed += ( AsyncOperation asyncOp2 ) =>
129+ {
130+ OnSceneLoaded ( switchSceneGuid , temporaryScene , objectStream ) ;
131+ } ;
132+ } ;
104133 }
105134
106135 internal static void OnFirstSceneSwitchSync ( uint sceneIndex , Guid switchSceneGuid )
@@ -134,39 +163,30 @@ internal static void OnFirstSceneSwitchSync(uint sceneIndex, Guid switchSceneGui
134163 isSwitching = false ;
135164 }
136165
137- private static void OnSceneLoaded ( AsyncOperation operation , Guid switchSceneGuid , Stream objectStream )
166+ private static void OnSceneLoaded ( Guid switchSceneGuid , Scene temporaryScene , Stream objectStream )
138167 {
139168 CurrentActiveSceneIndex = sceneNameToIndex [ nextScene . name ] ;
140169 SceneManager . SetActiveScene ( nextScene ) ;
141170
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- }
171+ // Move all objects to the new scene
172+ MoveAllNetworkedObjectsToScene ( nextScene ) ;
154173
155- AsyncOperation sceneUnload = SceneManager . UnloadSceneAsync ( lastScene ) ;
156- sceneUnload . completed += ( AsyncOperation AsyncOp ) =>
174+ AsyncOperation temporarySceneUnload = SceneManager . UnloadSceneAsync ( temporaryScene ) ;
175+
176+ temporarySceneUnload . completed += ( AsyncOperation asyncOp ) =>
157177 {
158178 if ( NetworkingManager . Singleton . IsServer )
159179 {
160- OnSceneUnloadServer ( AsyncOp , switchSceneGuid ) ;
180+ OnSceneUnloadServer ( switchSceneGuid ) ;
161181 }
162182 else
163183 {
164- OnSceneUnloadClient ( AsyncOp , switchSceneGuid , objectStream ) ;
184+ OnSceneUnloadClient ( switchSceneGuid , objectStream ) ;
165185 }
166186 } ;
167187 }
168188
169- private static void OnSceneUnloadServer ( AsyncOperation operation , Guid switchSceneGuid )
189+ private static void OnSceneUnloadServer ( Guid switchSceneGuid )
170190 {
171191 // Justification: Rare alloc, could(should?) reuse
172192 List < NetworkedObject > newSceneObjects = new List < NetworkedObject > ( ) ;
@@ -271,7 +291,7 @@ private static void OnSceneUnloadServer(AsyncOperation operation, Guid switchSce
271291 }
272292 }
273293
274- private static void OnSceneUnloadClient ( AsyncOperation operation , Guid switchSceneGuid , Stream objectStream )
294+ private static void OnSceneUnloadClient ( Guid switchSceneGuid , Stream objectStream )
275295 {
276296 if ( NetworkingManager . Singleton . NetworkConfig . UsePrefabSync )
277297 {
@@ -334,8 +354,6 @@ private static void OnSceneUnloadClient(AsyncOperation operation, Guid switchSce
334354 }
335355 }
336356
337- // EVENT GOES HERE
338-
339357 isSwitching = false ;
340358
341359 if ( OnSceneSwitched != null )
@@ -369,7 +387,26 @@ internal static void OnClientSwitchSceneCompleted(ulong clientId, Guid switchSce
369387 internal static void RemoveClientFromSceneSwitchProgresses ( ulong clientId )
370388 {
371389 foreach ( SceneSwitchProgress switchSceneProgress in sceneSwitchProgresses . Values )
390+ {
372391 switchSceneProgress . RemoveClientAsDone ( clientId ) ;
392+ }
393+ }
394+
395+ private static void MoveAllNetworkedObjectsToScene ( Scene scene )
396+ {
397+ // Move ALL networked objects to the temp scene
398+ List < NetworkedObject > objectsToKeep = SpawnManager . SpawnedObjectsList ;
399+
400+ for ( int i = 0 ; i < objectsToKeep . Count ; i ++ )
401+ {
402+ //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.
403+ if ( objectsToKeep [ i ] . gameObject . transform . parent != null )
404+ {
405+ objectsToKeep [ i ] . gameObject . transform . parent = null ;
406+ }
407+
408+ SceneManager . MoveGameObjectToScene ( objectsToKeep [ i ] . gameObject , scene ) ;
409+ }
373410 }
374411 }
375412}
0 commit comments