@@ -73,10 +73,17 @@ public static SceneSwitchProgress SwitchScene(string sceneName)
73
73
sceneSwitchProgresses . Add ( switchSceneProgress . guid , switchSceneProgress ) ;
74
74
currentSceneSwitchProgressGuid = switchSceneProgress . guid ;
75
75
76
- AsyncOperation sceneLoad = SceneManager . LoadSceneAsync ( sceneName , LoadSceneMode . Additive ) ;
76
+
77
77
nextScene = SceneManager . GetSceneByName ( sceneName ) ;
78
- sceneLoad . completed += ( AsyncOperation AsyncOp ) => { OnSceneLoaded ( AsyncOp , switchSceneProgress . guid , null ) ; } ;
79
78
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 ) ; } ;
80
87
switchSceneProgress . SetSceneLoadOperation ( sceneLoad ) ;
81
88
82
89
return switchSceneProgress ;
@@ -96,11 +103,16 @@ internal static void OnSceneSwitch(uint sceneIndex, Guid switchSceneGuid, Stream
96
103
}
97
104
98
105
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 ) ;
99
111
100
112
string sceneName = sceneIndexToString [ sceneIndex ] ;
101
- AsyncOperation sceneLoad = SceneManager . LoadSceneAsync ( sceneName , LoadSceneMode . Additive ) ;
113
+ AsyncOperation sceneLoad = SceneManager . LoadSceneAsync ( sceneName , LoadSceneMode . Single ) ;
102
114
nextScene = SceneManager . GetSceneByName ( sceneName ) ;
103
- sceneLoad . completed += ( AsyncOperation operation ) => { OnSceneLoaded ( operation , switchSceneGuid , objectStream ) ; } ;
115
+ sceneLoad . completed += ( AsyncOperation operation ) => { OnSceneLoaded ( switchSceneGuid , temporaryScene , objectStream ) ; } ;
104
116
}
105
117
106
118
internal static void OnFirstSceneSwitchSync ( uint sceneIndex , Guid switchSceneGuid )
@@ -134,39 +146,30 @@ internal static void OnFirstSceneSwitchSync(uint sceneIndex, Guid switchSceneGui
134
146
isSwitching = false ;
135
147
}
136
148
137
- private static void OnSceneLoaded ( AsyncOperation operation , Guid switchSceneGuid , Stream objectStream )
149
+ private static void OnSceneLoaded ( Guid switchSceneGuid , Scene temporaryScene , Stream objectStream )
138
150
{
139
151
CurrentActiveSceneIndex = sceneNameToIndex [ nextScene . name ] ;
140
152
SceneManager . SetActiveScene ( nextScene ) ;
141
153
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 ) ;
154
156
155
- AsyncOperation sceneUnload = SceneManager . UnloadSceneAsync ( lastScene ) ;
156
- sceneUnload . completed += ( AsyncOperation AsyncOp ) =>
157
+ AsyncOperation temporarySceneUnload = SceneManager . UnloadSceneAsync ( temporaryScene ) ;
158
+
159
+ temporarySceneUnload . completed += ( AsyncOperation asyncOp ) =>
157
160
{
158
161
if ( NetworkingManager . Singleton . IsServer )
159
162
{
160
- OnSceneUnloadServer ( AsyncOp , switchSceneGuid ) ;
163
+ OnSceneUnloadServer ( switchSceneGuid ) ;
161
164
}
162
165
else
163
166
{
164
- OnSceneUnloadClient ( AsyncOp , switchSceneGuid , objectStream ) ;
167
+ OnSceneUnloadClient ( switchSceneGuid , objectStream ) ;
165
168
}
166
169
} ;
167
170
}
168
171
169
- private static void OnSceneUnloadServer ( AsyncOperation operation , Guid switchSceneGuid )
172
+ private static void OnSceneUnloadServer ( Guid switchSceneGuid )
170
173
{
171
174
// Justification: Rare alloc, could(should?) reuse
172
175
List < NetworkedObject > newSceneObjects = new List < NetworkedObject > ( ) ;
@@ -271,7 +274,7 @@ private static void OnSceneUnloadServer(AsyncOperation operation, Guid switchSce
271
274
}
272
275
}
273
276
274
- private static void OnSceneUnloadClient ( AsyncOperation operation , Guid switchSceneGuid , Stream objectStream )
277
+ private static void OnSceneUnloadClient ( Guid switchSceneGuid , Stream objectStream )
275
278
{
276
279
if ( NetworkingManager . Singleton . NetworkConfig . UsePrefabSync )
277
280
{
@@ -334,8 +337,6 @@ private static void OnSceneUnloadClient(AsyncOperation operation, Guid switchSce
334
337
}
335
338
}
336
339
337
- // EVENT GOES HERE
338
-
339
340
isSwitching = false ;
340
341
341
342
if ( OnSceneSwitched != null )
@@ -369,7 +370,26 @@ internal static void OnClientSwitchSceneCompleted(ulong clientId, Guid switchSce
369
370
internal static void RemoveClientFromSceneSwitchProgresses ( ulong clientId )
370
371
{
371
372
foreach ( SceneSwitchProgress switchSceneProgress in sceneSwitchProgresses . Values )
373
+ {
372
374
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
+ }
373
393
}
374
394
}
375
395
}
0 commit comments