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