Skip to content

Commit 3705ebc

Browse files
authored
feat: Disable scene management (#281)
* feat: Added option to disable SceneManagement * fix: Fixed compilation on older compilers * feat: Added option to disable SceneManagement * fix: Fixed compilation on older compilers
1 parent 783ef1f commit 3705ebc

File tree

6 files changed

+85
-41
lines changed

6 files changed

+85
-41
lines changed

MLAPI-Editor/NetworkingManagerEditor.cs

Lines changed: 35 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@
66
using UnityEditorInternal;
77
using MLAPI;
88
using MLAPI.Transports;
9-
using UnityEditor.Callbacks;
109

1110
[CustomEditor(typeof(NetworkingManager), true)]
1211
[CanEditMultipleObjects]
@@ -22,7 +21,7 @@ public class NetworkingManagerEditor : Editor
2221

2322
// NetworkConfig fields
2423
private SerializedProperty protocolVersionProperty;
25-
private SerializedProperty allowRuntimeSceneChanges;
24+
private SerializedProperty allowRuntimeSceneChangesProperty;
2625
private SerializedProperty networkTransportProperty;
2726
private SerializedProperty receiveTickrateProperty;
2827
private SerializedProperty maxReceiveEventsPerTickRateProperty;
@@ -38,6 +37,7 @@ public class NetworkingManagerEditor : Editor
3837
private SerializedProperty createPlayerPrefabProperty;
3938
private SerializedProperty forceSamePrefabsProperty;
4039
private SerializedProperty usePrefabSyncProperty;
40+
private SerializedProperty enableSceneManagementProperty;
4141
private SerializedProperty recycleNetworkIdsProperty;
4242
private SerializedProperty networkIdRecycleDelayProperty;
4343
private SerializedProperty rpcHashSizeProperty;
@@ -100,7 +100,7 @@ private void Init()
100100

101101
// NetworkConfig properties
102102
protocolVersionProperty = networkConfigProperty.FindPropertyRelative("ProtocolVersion");
103-
allowRuntimeSceneChanges = networkConfigProperty.FindPropertyRelative("AllowRuntimeSceneChanges");
103+
allowRuntimeSceneChangesProperty = networkConfigProperty.FindPropertyRelative("AllowRuntimeSceneChanges");
104104
networkTransportProperty = networkConfigProperty.FindPropertyRelative("NetworkTransport");
105105
receiveTickrateProperty = networkConfigProperty.FindPropertyRelative("ReceiveTickrate");
106106
maxReceiveEventsPerTickRateProperty = networkConfigProperty.FindPropertyRelative("MaxReceiveEventsPerTickRate");
@@ -116,6 +116,7 @@ private void Init()
116116
createPlayerPrefabProperty = networkConfigProperty.FindPropertyRelative("CreatePlayerPrefab");
117117
forceSamePrefabsProperty = networkConfigProperty.FindPropertyRelative("ForceSamePrefabs");
118118
usePrefabSyncProperty = networkConfigProperty.FindPropertyRelative("UsePrefabSync");
119+
enableSceneManagementProperty = networkConfigProperty.FindPropertyRelative("EnableSceneManagement");
119120
recycleNetworkIdsProperty = networkConfigProperty.FindPropertyRelative("RecycleNetworkIds");
120121
networkIdRecycleDelayProperty = networkConfigProperty.FindPropertyRelative("NetworkIdRecycleDelay");
121122
rpcHashSizeProperty = networkConfigProperty.FindPropertyRelative("RpcHashSize");
@@ -138,7 +139,7 @@ private void CheckNullProperties()
138139

139140
// NetworkConfig properties
140141
protocolVersionProperty = networkConfigProperty.FindPropertyRelative("ProtocolVersion");
141-
allowRuntimeSceneChanges = networkConfigProperty.FindPropertyRelative("AllowRuntimeSceneChanges");
142+
allowRuntimeSceneChangesProperty = networkConfigProperty.FindPropertyRelative("AllowRuntimeSceneChanges");
142143
networkTransportProperty = networkConfigProperty.FindPropertyRelative("NetworkTransport");
143144
receiveTickrateProperty = networkConfigProperty.FindPropertyRelative("ReceiveTickrate");
144145
maxReceiveEventsPerTickRateProperty = networkConfigProperty.FindPropertyRelative("MaxReceiveEventsPerTickRate");
@@ -154,6 +155,7 @@ private void CheckNullProperties()
154155
createPlayerPrefabProperty = networkConfigProperty.FindPropertyRelative("CreatePlayerPrefab");
155156
forceSamePrefabsProperty = networkConfigProperty.FindPropertyRelative("ForceSamePrefabs");
156157
usePrefabSyncProperty = networkConfigProperty.FindPropertyRelative("UsePrefabSync");
158+
enableSceneManagementProperty = networkConfigProperty.FindPropertyRelative("EnableSceneManagement");
157159
recycleNetworkIdsProperty = networkConfigProperty.FindPropertyRelative("RecycleNetworkIds");
158160
networkIdRecycleDelayProperty = networkConfigProperty.FindPropertyRelative("NetworkIdRecycleDelay");
159161
rpcHashSizeProperty = networkConfigProperty.FindPropertyRelative("RpcHashSize");
@@ -250,8 +252,11 @@ public override void OnInspectorGUI()
250252
EditorGUILayout.Space();
251253
networkPrefabsList.DoLayoutList();
252254

253-
registeredScenesList.DoLayoutList();
254-
EditorGUILayout.Space();
255+
using (new EditorGUI.DisabledScope(!networkingManager.NetworkConfig.EnableSceneManagement))
256+
{
257+
registeredScenesList.DoLayoutList();
258+
EditorGUILayout.Space();
259+
}
255260

256261

257262
EditorGUILayout.LabelField("General", EditorStyles.boldLabel);
@@ -315,7 +320,23 @@ public override void OnInspectorGUI()
315320
EditorGUILayout.LabelField("Spawning", EditorStyles.boldLabel);
316321
EditorGUILayout.PropertyField(createPlayerPrefabProperty);
317322
EditorGUILayout.PropertyField(forceSamePrefabsProperty);
318-
EditorGUILayout.PropertyField(usePrefabSyncProperty);
323+
324+
using (new EditorGUI.DisabledScope(!networkingManager.NetworkConfig.EnableSceneManagement))
325+
{
326+
bool value = networkingManager.NetworkConfig.UsePrefabSync;
327+
328+
if (!networkingManager.NetworkConfig.EnableSceneManagement)
329+
{
330+
usePrefabSyncProperty.boolValue = true;
331+
}
332+
333+
EditorGUILayout.PropertyField(usePrefabSyncProperty);
334+
335+
if (!networkingManager.NetworkConfig.EnableSceneManagement)
336+
{
337+
usePrefabSyncProperty.boolValue = value;
338+
}
339+
}
319340

320341
EditorGUILayout.PropertyField(recycleNetworkIdsProperty);
321342

@@ -328,8 +349,13 @@ public override void OnInspectorGUI()
328349
EditorGUILayout.PropertyField(rpcHashSizeProperty);
329350

330351
EditorGUILayout.LabelField("Scene Management", EditorStyles.boldLabel);
331-
EditorGUILayout.PropertyField(loadSceneTimeOutProperty);
332-
EditorGUILayout.PropertyField(allowRuntimeSceneChanges);
352+
EditorGUILayout.PropertyField(enableSceneManagementProperty);
353+
354+
using (new EditorGUI.DisabledScope(!networkingManager.NetworkConfig.EnableSceneManagement))
355+
{
356+
EditorGUILayout.PropertyField(loadSceneTimeOutProperty);
357+
EditorGUILayout.PropertyField(allowRuntimeSceneChangesProperty);
358+
}
333359

334360
EditorGUILayout.LabelField("Cryptography", EditorStyles.boldLabel);
335361
EditorGUILayout.PropertyField(enableEncryptionProperty);

MLAPI/Configuration/NetworkConfig.cs

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -126,6 +126,13 @@ public class NetworkConfig
126126
[Tooltip("Ensures that NetworkedVars can be read even if a client accidental writes where its not allowed to. This will cost some CPU time and bandwidth")]
127127
public bool EnsureNetworkedVarLengthSafety = false;
128128
/// <summary>
129+
/// Enables scene management. This will allow network scene switches and automatic scene diff corrections upon connect.
130+
/// SoftSynced scene objects wont work with this disabled. That means that disabling SceneManagement also enables PrefabSync.
131+
/// </summary>
132+
[Tooltip("Enables scene management. This will allow network scene switches and automatic scene diff corrections upon connect.\n" +
133+
"SoftSynced scene objects wont work with this disabled. That means that disabling SceneManagement also enables PrefabSync.")]
134+
public bool EnableSceneManagement = true;
135+
/// <summary>
129136
/// Whether or not the MLAPI should check for differences in the prefabs at connection.
130137
/// If you dynamically add prefabs at runtime, turn this OFF
131138
/// </summary>
@@ -243,6 +250,7 @@ public string ToBase64()
243250
writer.WriteBits((byte)config.RpcHashSize, 3);
244251
writer.WriteBool(ForceSamePrefabs);
245252
writer.WriteBool(UsePrefabSync);
253+
writer.WriteBool(EnableSceneManagement);
246254
writer.WriteBool(RecycleNetworkIds);
247255
writer.WriteSinglePacked(NetworkIdRecycleDelay);
248256
writer.WriteBool(EnableNetworkedVar);
@@ -290,6 +298,7 @@ public void FromBase64(string base64)
290298
config.RpcHashSize = (HashSize)reader.ReadBits(3);
291299
config.ForceSamePrefabs = reader.ReadBool();
292300
config.UsePrefabSync = reader.ReadBool();
301+
config.EnableSceneManagement = reader.ReadBool();
293302
config.RecycleNetworkIds = reader.ReadBool();
294303
config.NetworkIdRecycleDelay = reader.ReadSinglePacked();
295304
config.EnableNetworkedVar = reader.ReadBool();
@@ -339,6 +348,7 @@ public ulong GetConfig(bool cache = true)
339348
writer.WriteBool(EnableNetworkedVar);
340349
writer.WriteBool(ForceSamePrefabs);
341350
writer.WriteBool(UsePrefabSync);
351+
writer.WriteBool(EnableSceneManagement);
342352
writer.WriteBool(EnsureNetworkedVarLengthSafety);
343353
writer.WriteBool(EnableEncryption);
344354
writer.WriteBool(SignKeyExchange);

MLAPI/Core/NetworkingManager.cs

Lines changed: 22 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -368,16 +368,19 @@ private void Init(bool server)
368368
if (LogHelper.CurrentLogLevel <= LogLevel.Error) LogHelper.LogError("Importing of certificate failed: " + ex.ToString());
369369
}
370370

371-
NetworkConfig.RegisteredScenes.Sort();
372-
373-
for (int i = 0; i < NetworkConfig.RegisteredScenes.Count; i++)
371+
if (NetworkConfig.EnableSceneManagement)
374372
{
375-
NetworkSceneManager.registeredSceneNames.Add(NetworkConfig.RegisteredScenes[i]);
376-
NetworkSceneManager.sceneIndexToString.Add((uint) i, NetworkConfig.RegisteredScenes[i]);
377-
NetworkSceneManager.sceneNameToIndex.Add(NetworkConfig.RegisteredScenes[i], (uint) i);
378-
}
373+
NetworkConfig.RegisteredScenes.Sort();
374+
375+
for (int i = 0; i < NetworkConfig.RegisteredScenes.Count; i++)
376+
{
377+
NetworkSceneManager.registeredSceneNames.Add(NetworkConfig.RegisteredScenes[i]);
378+
NetworkSceneManager.sceneIndexToString.Add((uint)i, NetworkConfig.RegisteredScenes[i]);
379+
NetworkSceneManager.sceneNameToIndex.Add(NetworkConfig.RegisteredScenes[i], (uint)i);
380+
}
379381

380-
NetworkSceneManager.SetCurrentSceneIndex();
382+
NetworkSceneManager.SetCurrentSceneIndex();
383+
}
381384

382385
for (int i = 0; i < NetworkConfig.NetworkedPrefabs.Count; i++)
383386
{
@@ -913,16 +916,13 @@ private void HandleIncomingData(ulong clientId, string channelName, ArraySegment
913916
}
914917

915918
#region INTERNAL MESSAGE
916-
917919
switch (messageType)
918920
{
919921
case MLAPIConstants.MLAPI_CONNECTION_REQUEST:
920-
if (IsServer)
921-
InternalMessageHandler.HandleConnectionRequest(clientId, messageStream);
922+
if (IsServer) InternalMessageHandler.HandleConnectionRequest(clientId, messageStream);
922923
break;
923924
case MLAPIConstants.MLAPI_CONNECTION_APPROVED:
924-
if (IsClient)
925-
InternalMessageHandler.HandleConnectionApproved(clientId, messageStream, receiveTime);
925+
if (IsClient) InternalMessageHandler.HandleConnectionApproved(clientId, messageStream, receiveTime);
926926
break;
927927
case MLAPIConstants.MLAPI_ADD_OBJECT:
928928
if (IsClient) InternalMessageHandler.HandleAddObject(clientId, messageStream);
@@ -931,7 +931,7 @@ private void HandleIncomingData(ulong clientId, string channelName, ArraySegment
931931
if (IsClient) InternalMessageHandler.HandleDestroyObject(clientId, messageStream);
932932
break;
933933
case MLAPIConstants.MLAPI_SWITCH_SCENE:
934-
if (IsClient) InternalMessageHandler.HandleSwitchScene(clientId, messageStream);
934+
if (IsClient && NetworkConfig.EnableSceneManagement) InternalMessageHandler.HandleSwitchScene(clientId, messageStream);
935935
break;
936936
case MLAPIConstants.MLAPI_CHANGE_OWNER:
937937
if (IsClient) InternalMessageHandler.HandleChangeOwner(clientId, messageStream);
@@ -987,13 +987,12 @@ private void HandleIncomingData(ulong clientId, string channelName, ArraySegment
987987
break;
988988
#endif
989989
case MLAPIConstants.MLAPI_CLIENT_SWITCH_SCENE_COMPLETED:
990-
if (IsServer) InternalMessageHandler.HandleClientSwitchSceneCompleted(clientId, messageStream);
990+
if (IsServer && NetworkConfig.EnableSceneManagement) InternalMessageHandler.HandleClientSwitchSceneCompleted(clientId, messageStream);
991991
break;
992992
default:
993993
if (LogHelper.CurrentLogLevel <= LogLevel.Error) LogHelper.LogError("Read unrecognized messageType " + messageType);
994994
break;
995995
}
996-
997996
#endregion
998997

999998
NetworkProfiler.EndEvent();
@@ -1154,8 +1153,11 @@ internal void HandleApproval(ulong clientId, bool createPlayerObject, ulong? pla
11541153
{
11551154
writer.WriteUInt64Packed(clientId);
11561155

1157-
writer.WriteUInt32Packed(NetworkSceneManager.currentSceneIndex);
1158-
writer.WriteByteArray(NetworkSceneManager.currentSceneSwitchProgressGuid.ToByteArray());
1156+
if (NetworkConfig.EnableSceneManagement)
1157+
{
1158+
writer.WriteUInt32Packed(NetworkSceneManager.currentSceneIndex);
1159+
writer.WriteByteArray(NetworkSceneManager.currentSceneSwitchProgressGuid.ToByteArray());
1160+
}
11591161

11601162
writer.WriteSinglePacked(Time.realtimeSinceStartup);
11611163

@@ -1185,7 +1187,7 @@ internal void HandleApproval(ulong clientId, bool createPlayerObject, ulong? pla
11851187
writer.WriteUInt64Packed(parent.NetworkId);
11861188
}
11871189

1188-
if (NetworkConfig.UsePrefabSync)
1190+
if (!NetworkConfig.EnableSceneManagement || NetworkConfig.UsePrefabSync)
11891191
{
11901192
writer.WriteUInt64Packed(observedObject.PrefabHash);
11911193
}
@@ -1251,7 +1253,7 @@ internal void HandleApproval(ulong clientId, bool createPlayerObject, ulong? pla
12511253
//Does not have a parent
12521254
writer.WriteBool(false);
12531255

1254-
if (NetworkConfig.UsePrefabSync)
1256+
if (!NetworkConfig.EnableSceneManagement || NetworkConfig.UsePrefabSync)
12551257
{
12561258
writer.WriteUInt64Packed(playerPrefabHash == null ? NetworkConfig.PlayerPrefabHash.Value : playerPrefabHash.Value);
12571259
}

MLAPI/Messaging/InternalMessageHandler.cs

Lines changed: 14 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -203,22 +203,29 @@ internal static void HandleConnectionApproved(ulong clientId, Stream stream, flo
203203
using (PooledBitReader reader = PooledBitReader.Get(stream))
204204
{
205205
NetworkingManager.Singleton.LocalClientId = reader.ReadUInt64Packed();
206-
207-
uint sceneIndex = reader.ReadUInt32Packed();
208-
Guid sceneSwitchProgressGuid = new Guid(reader.ReadByteArray());
206+
207+
uint sceneIndex = 0;
208+
Guid sceneSwitchProgressGuid = new Guid();
209+
210+
if (NetworkingManager.Singleton.NetworkConfig.EnableSceneManagement)
211+
{
212+
sceneIndex = reader.ReadUInt32Packed();
213+
sceneSwitchProgressGuid = new Guid(reader.ReadByteArray());
214+
}
215+
216+
bool sceneSwitch = NetworkingManager.Singleton.NetworkConfig.EnableSceneManagement && NetworkSceneManager.HasSceneMismatch(sceneIndex);
209217

210218
float netTime = reader.ReadSinglePacked();
211219
NetworkingManager.Singleton.UpdateNetworkTime(clientId, netTime, receiveTime, true);
212220

213221
NetworkingManager.Singleton.ConnectedClients.Add(NetworkingManager.Singleton.LocalClientId, new NetworkedClient() { ClientId = NetworkingManager.Singleton.LocalClientId });
214222

215-
bool sceneSwitch = NetworkSceneManager.HasSceneMismatch(sceneIndex);
216223

217224
void DelayedSpawnAction(Stream continuationStream)
218225
{
219226
using (PooledBitReader continuationReader = PooledBitReader.Get(continuationStream))
220227
{
221-
if (NetworkingManager.Singleton.NetworkConfig.UsePrefabSync)
228+
if (!NetworkingManager.Singleton.NetworkConfig.EnableSceneManagement || NetworkingManager.Singleton.NetworkConfig.UsePrefabSync)
222229
{
223230
SpawnManager.DestroySceneObjects();
224231
}
@@ -245,7 +252,7 @@ void DelayedSpawnAction(Stream continuationStream)
245252
ulong instanceId;
246253
bool softSync;
247254

248-
if (NetworkingManager.Singleton.NetworkConfig.UsePrefabSync)
255+
if (!NetworkingManager.Singleton.NetworkConfig.EnableSceneManagement || NetworkingManager.Singleton.NetworkConfig.UsePrefabSync)
249256
{
250257
softSync = false;
251258
instanceId = 0;
@@ -332,7 +339,7 @@ internal static void HandleAddObject(ulong clientId, Stream stream)
332339
ulong instanceId;
333340
bool softSync;
334341

335-
if (NetworkingManager.Singleton.NetworkConfig.UsePrefabSync)
342+
if (!NetworkingManager.Singleton.NetworkConfig.EnableSceneManagement || NetworkingManager.Singleton.NetworkConfig.UsePrefabSync)
336343
{
337344
softSync = false;
338345
instanceId = 0;

MLAPI/SceneManagement/NetworkSceneManager.cs

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@
33
using System.IO;
44
using MLAPI.Configuration;
55
using MLAPI.Exceptions;
6-
using MLAPI.Internal;
76
using MLAPI.Logging;
87
using MLAPI.Messaging;
98
using MLAPI.Security;
@@ -266,7 +265,7 @@ private static void OnSceneUnloadServer(Guid switchSceneGuid)
266265
writer.WriteUInt64Packed(parent.NetworkId);
267266
}
268267

269-
if (NetworkingManager.Singleton.NetworkConfig.UsePrefabSync)
268+
if (!NetworkingManager.Singleton.NetworkConfig.EnableSceneManagement || NetworkingManager.Singleton.NetworkConfig.UsePrefabSync)
270269
{
271270
writer.WriteUInt64Packed(newSceneObjects[i].PrefabHash);
272271

@@ -312,7 +311,7 @@ private static void OnSceneUnloadServer(Guid switchSceneGuid)
312311

313312
private static void OnSceneUnloadClient(Guid switchSceneGuid, Stream objectStream)
314313
{
315-
if (NetworkingManager.Singleton.NetworkConfig.UsePrefabSync)
314+
if (!NetworkingManager.Singleton.NetworkConfig.EnableSceneManagement || NetworkingManager.Singleton.NetworkConfig.UsePrefabSync)
316315
{
317316
SpawnManager.DestroySceneObjects();
318317

0 commit comments

Comments
 (0)