@@ -72,25 +72,18 @@ public static SceneSwitchProgress SwitchScene(string sceneName)
72
72
SceneSwitchProgress switchSceneProgress = new SceneSwitchProgress ( ) ;
73
73
sceneSwitchProgresses . Add ( switchSceneProgress . guid , switchSceneProgress ) ;
74
74
currentSceneSwitchProgressGuid = switchSceneProgress . guid ;
75
-
76
- Scene temporaryScene = SceneManager . CreateScene ( "MLAPI_tmp_switch_" + currentSceneSwitchProgressGuid ) ;
77
-
75
+
78
76
// Move ALL networked objects to the temp scene
79
- MoveAllNetworkedObjectsToScene ( temporaryScene ) ;
77
+ MoveObjectsToDontDestroyOnLoad ( ) ;
80
78
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 ) ;
87
81
88
- nextScene = SceneManager . GetSceneByName ( sceneName ) ;
82
+ nextScene = SceneManager . GetSceneByName ( sceneName ) ;
89
83
90
- sceneLoad . completed += ( AsyncOperation asyncOp2 ) => { OnSceneLoaded ( switchSceneProgress . guid , temporaryScene , null ) ; } ;
84
+ sceneLoad . completed += ( AsyncOperation asyncOp2 ) => { OnSceneLoaded ( switchSceneProgress . guid , null ) ; } ;
91
85
92
- switchSceneProgress . SetSceneLoadOperation ( sceneLoad ) ;
93
- } ;
86
+ switchSceneProgress . SetSceneLoadOperation ( sceneLoad ) ;
94
87
95
88
return switchSceneProgress ;
96
89
}
@@ -109,26 +102,19 @@ internal static void OnSceneSwitch(uint sceneIndex, Guid switchSceneGuid, Stream
109
102
}
110
103
111
104
lastScene = SceneManager . GetActiveScene ( ) ;
112
-
113
- Scene temporaryScene = SceneManager . CreateScene ( "MLAPI_tmp_switch_" + switchSceneGuid ) ;
114
-
105
+
115
106
// Move ALL networked objects to the temp scene
116
- MoveAllNetworkedObjectsToScene ( temporaryScene ) ;
107
+ MoveObjectsToDontDestroyOnLoad ( ) ;
117
108
118
109
string sceneName = sceneIndexToString [ sceneIndex ] ;
119
110
120
- AsyncOperation unloadCurrentScene = SceneManager . UnloadSceneAsync ( lastScene ) ;
111
+ AsyncOperation sceneLoad = SceneManager . LoadSceneAsync ( sceneName , LoadSceneMode . Single ) ;
121
112
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 ) ;
127
114
128
- sceneLoad . completed += ( AsyncOperation asyncOp2 ) =>
129
- {
130
- OnSceneLoaded ( switchSceneGuid , temporaryScene , objectStream ) ;
131
- } ;
115
+ sceneLoad . completed += ( AsyncOperation asyncOp2 ) =>
116
+ {
117
+ OnSceneLoaded ( switchSceneGuid , objectStream ) ;
132
118
} ;
133
119
}
134
120
@@ -163,27 +149,22 @@ internal static void OnFirstSceneSwitchSync(uint sceneIndex, Guid switchSceneGui
163
149
isSwitching = false ;
164
150
}
165
151
166
- private static void OnSceneLoaded ( Guid switchSceneGuid , Scene temporaryScene , Stream objectStream )
152
+ private static void OnSceneLoaded ( Guid switchSceneGuid , Stream objectStream )
167
153
{
168
154
CurrentActiveSceneIndex = sceneNameToIndex [ nextScene . name ] ;
169
155
SceneManager . SetActiveScene ( nextScene ) ;
170
156
171
157
// Move all objects to the new scene
172
- MoveAllNetworkedObjectsToScene ( nextScene ) ;
158
+ MoveObjectsToScene ( nextScene ) ;
173
159
174
- AsyncOperation temporarySceneUnload = SceneManager . UnloadSceneAsync ( temporaryScene ) ;
175
-
176
- temporarySceneUnload . completed += ( AsyncOperation asyncOp ) =>
160
+ if ( NetworkingManager . Singleton . IsServer )
177
161
{
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
+ }
187
168
}
188
169
189
170
private static void OnSceneUnloadServer ( Guid switchSceneGuid )
@@ -392,8 +373,25 @@ internal static void RemoveClientFromSceneSwitchProgresses(ulong clientId)
392
373
}
393
374
}
394
375
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
+ {
397
395
// Move ALL networked objects to the temp scene
398
396
List < NetworkedObject > objectsToKeep = SpawnManager . SpawnedObjectsList ;
399
397
0 commit comments