diff --git a/MLAPI-Editor/NetworkingManagerEditor.cs b/MLAPI-Editor/NetworkingManagerEditor.cs
index ac8bd7de61..72af7da169 100644
--- a/MLAPI-Editor/NetworkingManagerEditor.cs
+++ b/MLAPI-Editor/NetworkingManagerEditor.cs
@@ -6,7 +6,6 @@
using UnityEditorInternal;
using MLAPI;
using MLAPI.Transports;
-using UnityEditor.Callbacks;
[CustomEditor(typeof(NetworkingManager), true)]
[CanEditMultipleObjects]
@@ -22,7 +21,7 @@ public class NetworkingManagerEditor : Editor
// NetworkConfig fields
private SerializedProperty protocolVersionProperty;
- private SerializedProperty allowRuntimeSceneChanges;
+ private SerializedProperty allowRuntimeSceneChangesProperty;
private SerializedProperty networkTransportProperty;
private SerializedProperty receiveTickrateProperty;
private SerializedProperty maxReceiveEventsPerTickRateProperty;
@@ -38,6 +37,7 @@ public class NetworkingManagerEditor : Editor
private SerializedProperty createPlayerPrefabProperty;
private SerializedProperty forceSamePrefabsProperty;
private SerializedProperty usePrefabSyncProperty;
+ private SerializedProperty enableSceneManagementProperty;
private SerializedProperty recycleNetworkIdsProperty;
private SerializedProperty networkIdRecycleDelayProperty;
private SerializedProperty rpcHashSizeProperty;
@@ -100,7 +100,7 @@ private void Init()
// NetworkConfig properties
protocolVersionProperty = networkConfigProperty.FindPropertyRelative("ProtocolVersion");
- allowRuntimeSceneChanges = networkConfigProperty.FindPropertyRelative("AllowRuntimeSceneChanges");
+ allowRuntimeSceneChangesProperty = networkConfigProperty.FindPropertyRelative("AllowRuntimeSceneChanges");
networkTransportProperty = networkConfigProperty.FindPropertyRelative("NetworkTransport");
receiveTickrateProperty = networkConfigProperty.FindPropertyRelative("ReceiveTickrate");
maxReceiveEventsPerTickRateProperty = networkConfigProperty.FindPropertyRelative("MaxReceiveEventsPerTickRate");
@@ -116,6 +116,7 @@ private void Init()
createPlayerPrefabProperty = networkConfigProperty.FindPropertyRelative("CreatePlayerPrefab");
forceSamePrefabsProperty = networkConfigProperty.FindPropertyRelative("ForceSamePrefabs");
usePrefabSyncProperty = networkConfigProperty.FindPropertyRelative("UsePrefabSync");
+ enableSceneManagementProperty = networkConfigProperty.FindPropertyRelative("EnableSceneManagement");
recycleNetworkIdsProperty = networkConfigProperty.FindPropertyRelative("RecycleNetworkIds");
networkIdRecycleDelayProperty = networkConfigProperty.FindPropertyRelative("NetworkIdRecycleDelay");
rpcHashSizeProperty = networkConfigProperty.FindPropertyRelative("RpcHashSize");
@@ -138,7 +139,7 @@ private void CheckNullProperties()
// NetworkConfig properties
protocolVersionProperty = networkConfigProperty.FindPropertyRelative("ProtocolVersion");
- allowRuntimeSceneChanges = networkConfigProperty.FindPropertyRelative("AllowRuntimeSceneChanges");
+ allowRuntimeSceneChangesProperty = networkConfigProperty.FindPropertyRelative("AllowRuntimeSceneChanges");
networkTransportProperty = networkConfigProperty.FindPropertyRelative("NetworkTransport");
receiveTickrateProperty = networkConfigProperty.FindPropertyRelative("ReceiveTickrate");
maxReceiveEventsPerTickRateProperty = networkConfigProperty.FindPropertyRelative("MaxReceiveEventsPerTickRate");
@@ -154,6 +155,7 @@ private void CheckNullProperties()
createPlayerPrefabProperty = networkConfigProperty.FindPropertyRelative("CreatePlayerPrefab");
forceSamePrefabsProperty = networkConfigProperty.FindPropertyRelative("ForceSamePrefabs");
usePrefabSyncProperty = networkConfigProperty.FindPropertyRelative("UsePrefabSync");
+ enableSceneManagementProperty = networkConfigProperty.FindPropertyRelative("EnableSceneManagement");
recycleNetworkIdsProperty = networkConfigProperty.FindPropertyRelative("RecycleNetworkIds");
networkIdRecycleDelayProperty = networkConfigProperty.FindPropertyRelative("NetworkIdRecycleDelay");
rpcHashSizeProperty = networkConfigProperty.FindPropertyRelative("RpcHashSize");
@@ -250,8 +252,11 @@ public override void OnInspectorGUI()
EditorGUILayout.Space();
networkPrefabsList.DoLayoutList();
- registeredScenesList.DoLayoutList();
- EditorGUILayout.Space();
+ using (new EditorGUI.DisabledScope(!networkingManager.NetworkConfig.EnableSceneManagement))
+ {
+ registeredScenesList.DoLayoutList();
+ EditorGUILayout.Space();
+ }
EditorGUILayout.LabelField("General", EditorStyles.boldLabel);
@@ -315,7 +320,23 @@ public override void OnInspectorGUI()
EditorGUILayout.LabelField("Spawning", EditorStyles.boldLabel);
EditorGUILayout.PropertyField(createPlayerPrefabProperty);
EditorGUILayout.PropertyField(forceSamePrefabsProperty);
- EditorGUILayout.PropertyField(usePrefabSyncProperty);
+
+ using (new EditorGUI.DisabledScope(!networkingManager.NetworkConfig.EnableSceneManagement))
+ {
+ bool value = networkingManager.NetworkConfig.UsePrefabSync;
+
+ if (!networkingManager.NetworkConfig.EnableSceneManagement)
+ {
+ usePrefabSyncProperty.boolValue = true;
+ }
+
+ EditorGUILayout.PropertyField(usePrefabSyncProperty);
+
+ if (!networkingManager.NetworkConfig.EnableSceneManagement)
+ {
+ usePrefabSyncProperty.boolValue = value;
+ }
+ }
EditorGUILayout.PropertyField(recycleNetworkIdsProperty);
@@ -328,8 +349,13 @@ public override void OnInspectorGUI()
EditorGUILayout.PropertyField(rpcHashSizeProperty);
EditorGUILayout.LabelField("Scene Management", EditorStyles.boldLabel);
- EditorGUILayout.PropertyField(loadSceneTimeOutProperty);
- EditorGUILayout.PropertyField(allowRuntimeSceneChanges);
+ EditorGUILayout.PropertyField(enableSceneManagementProperty);
+
+ using (new EditorGUI.DisabledScope(!networkingManager.NetworkConfig.EnableSceneManagement))
+ {
+ EditorGUILayout.PropertyField(loadSceneTimeOutProperty);
+ EditorGUILayout.PropertyField(allowRuntimeSceneChangesProperty);
+ }
EditorGUILayout.LabelField("Cryptography", EditorStyles.boldLabel);
EditorGUILayout.PropertyField(enableEncryptionProperty);
diff --git a/MLAPI/Configuration/NetworkConfig.cs b/MLAPI/Configuration/NetworkConfig.cs
index 20d328f097..42f079a373 100644
--- a/MLAPI/Configuration/NetworkConfig.cs
+++ b/MLAPI/Configuration/NetworkConfig.cs
@@ -126,6 +126,13 @@ public class NetworkConfig
[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")]
public bool EnsureNetworkedVarLengthSafety = false;
///
+ /// Enables scene management. This will allow network scene switches and automatic scene diff corrections upon connect.
+ /// SoftSynced scene objects wont work with this disabled. That means that disabling SceneManagement also enables PrefabSync.
+ ///
+ [Tooltip("Enables scene management. This will allow network scene switches and automatic scene diff corrections upon connect.\n" +
+ "SoftSynced scene objects wont work with this disabled. That means that disabling SceneManagement also enables PrefabSync.")]
+ public bool EnableSceneManagement = true;
+ ///
/// Whether or not the MLAPI should check for differences in the prefabs at connection.
/// If you dynamically add prefabs at runtime, turn this OFF
///
@@ -243,6 +250,7 @@ public string ToBase64()
writer.WriteBits((byte)config.RpcHashSize, 3);
writer.WriteBool(ForceSamePrefabs);
writer.WriteBool(UsePrefabSync);
+ writer.WriteBool(EnableSceneManagement);
writer.WriteBool(RecycleNetworkIds);
writer.WriteSinglePacked(NetworkIdRecycleDelay);
writer.WriteBool(EnableNetworkedVar);
@@ -290,6 +298,7 @@ public void FromBase64(string base64)
config.RpcHashSize = (HashSize)reader.ReadBits(3);
config.ForceSamePrefabs = reader.ReadBool();
config.UsePrefabSync = reader.ReadBool();
+ config.EnableSceneManagement = reader.ReadBool();
config.RecycleNetworkIds = reader.ReadBool();
config.NetworkIdRecycleDelay = reader.ReadSinglePacked();
config.EnableNetworkedVar = reader.ReadBool();
@@ -339,6 +348,7 @@ public ulong GetConfig(bool cache = true)
writer.WriteBool(EnableNetworkedVar);
writer.WriteBool(ForceSamePrefabs);
writer.WriteBool(UsePrefabSync);
+ writer.WriteBool(EnableSceneManagement);
writer.WriteBool(EnsureNetworkedVarLengthSafety);
writer.WriteBool(EnableEncryption);
writer.WriteBool(SignKeyExchange);
diff --git a/MLAPI/Core/NetworkingManager.cs b/MLAPI/Core/NetworkingManager.cs
index 5496ad706c..5ce21760ab 100644
--- a/MLAPI/Core/NetworkingManager.cs
+++ b/MLAPI/Core/NetworkingManager.cs
@@ -368,16 +368,19 @@ private void Init(bool server)
if (LogHelper.CurrentLogLevel <= LogLevel.Error) LogHelper.LogError("Importing of certificate failed: " + ex.ToString());
}
- NetworkConfig.RegisteredScenes.Sort();
-
- for (int i = 0; i < NetworkConfig.RegisteredScenes.Count; i++)
+ if (NetworkConfig.EnableSceneManagement)
{
- NetworkSceneManager.registeredSceneNames.Add(NetworkConfig.RegisteredScenes[i]);
- NetworkSceneManager.sceneIndexToString.Add((uint) i, NetworkConfig.RegisteredScenes[i]);
- NetworkSceneManager.sceneNameToIndex.Add(NetworkConfig.RegisteredScenes[i], (uint) i);
- }
+ NetworkConfig.RegisteredScenes.Sort();
+
+ for (int i = 0; i < NetworkConfig.RegisteredScenes.Count; i++)
+ {
+ NetworkSceneManager.registeredSceneNames.Add(NetworkConfig.RegisteredScenes[i]);
+ NetworkSceneManager.sceneIndexToString.Add((uint)i, NetworkConfig.RegisteredScenes[i]);
+ NetworkSceneManager.sceneNameToIndex.Add(NetworkConfig.RegisteredScenes[i], (uint)i);
+ }
- NetworkSceneManager.SetCurrentSceneIndex();
+ NetworkSceneManager.SetCurrentSceneIndex();
+ }
for (int i = 0; i < NetworkConfig.NetworkedPrefabs.Count; i++)
{
@@ -913,16 +916,13 @@ private void HandleIncomingData(ulong clientId, string channelName, ArraySegment
}
#region INTERNAL MESSAGE
-
switch (messageType)
{
case MLAPIConstants.MLAPI_CONNECTION_REQUEST:
- if (IsServer)
- InternalMessageHandler.HandleConnectionRequest(clientId, messageStream);
+ if (IsServer) InternalMessageHandler.HandleConnectionRequest(clientId, messageStream);
break;
case MLAPIConstants.MLAPI_CONNECTION_APPROVED:
- if (IsClient)
- InternalMessageHandler.HandleConnectionApproved(clientId, messageStream, receiveTime);
+ if (IsClient) InternalMessageHandler.HandleConnectionApproved(clientId, messageStream, receiveTime);
break;
case MLAPIConstants.MLAPI_ADD_OBJECT:
if (IsClient) InternalMessageHandler.HandleAddObject(clientId, messageStream);
@@ -931,7 +931,7 @@ private void HandleIncomingData(ulong clientId, string channelName, ArraySegment
if (IsClient) InternalMessageHandler.HandleDestroyObject(clientId, messageStream);
break;
case MLAPIConstants.MLAPI_SWITCH_SCENE:
- if (IsClient) InternalMessageHandler.HandleSwitchScene(clientId, messageStream);
+ if (IsClient && NetworkConfig.EnableSceneManagement) InternalMessageHandler.HandleSwitchScene(clientId, messageStream);
break;
case MLAPIConstants.MLAPI_CHANGE_OWNER:
if (IsClient) InternalMessageHandler.HandleChangeOwner(clientId, messageStream);
@@ -987,13 +987,12 @@ private void HandleIncomingData(ulong clientId, string channelName, ArraySegment
break;
#endif
case MLAPIConstants.MLAPI_CLIENT_SWITCH_SCENE_COMPLETED:
- if (IsServer) InternalMessageHandler.HandleClientSwitchSceneCompleted(clientId, messageStream);
+ if (IsServer && NetworkConfig.EnableSceneManagement) InternalMessageHandler.HandleClientSwitchSceneCompleted(clientId, messageStream);
break;
default:
if (LogHelper.CurrentLogLevel <= LogLevel.Error) LogHelper.LogError("Read unrecognized messageType " + messageType);
break;
}
-
#endregion
NetworkProfiler.EndEvent();
@@ -1154,8 +1153,11 @@ internal void HandleApproval(ulong clientId, bool createPlayerObject, ulong? pla
{
writer.WriteUInt64Packed(clientId);
- writer.WriteUInt32Packed(NetworkSceneManager.currentSceneIndex);
- writer.WriteByteArray(NetworkSceneManager.currentSceneSwitchProgressGuid.ToByteArray());
+ if (NetworkConfig.EnableSceneManagement)
+ {
+ writer.WriteUInt32Packed(NetworkSceneManager.currentSceneIndex);
+ writer.WriteByteArray(NetworkSceneManager.currentSceneSwitchProgressGuid.ToByteArray());
+ }
writer.WriteSinglePacked(Time.realtimeSinceStartup);
@@ -1185,7 +1187,7 @@ internal void HandleApproval(ulong clientId, bool createPlayerObject, ulong? pla
writer.WriteUInt64Packed(parent.NetworkId);
}
- if (NetworkConfig.UsePrefabSync)
+ if (!NetworkConfig.EnableSceneManagement || NetworkConfig.UsePrefabSync)
{
writer.WriteUInt64Packed(observedObject.PrefabHash);
}
@@ -1251,7 +1253,7 @@ internal void HandleApproval(ulong clientId, bool createPlayerObject, ulong? pla
//Does not have a parent
writer.WriteBool(false);
- if (NetworkConfig.UsePrefabSync)
+ if (!NetworkConfig.EnableSceneManagement || NetworkConfig.UsePrefabSync)
{
writer.WriteUInt64Packed(playerPrefabHash == null ? NetworkConfig.PlayerPrefabHash.Value : playerPrefabHash.Value);
}
diff --git a/MLAPI/Messaging/InternalMessageHandler.cs b/MLAPI/Messaging/InternalMessageHandler.cs
index 4442051148..abb475bab8 100644
--- a/MLAPI/Messaging/InternalMessageHandler.cs
+++ b/MLAPI/Messaging/InternalMessageHandler.cs
@@ -203,22 +203,29 @@ internal static void HandleConnectionApproved(ulong clientId, Stream stream, flo
using (PooledBitReader reader = PooledBitReader.Get(stream))
{
NetworkingManager.Singleton.LocalClientId = reader.ReadUInt64Packed();
-
- uint sceneIndex = reader.ReadUInt32Packed();
- Guid sceneSwitchProgressGuid = new Guid(reader.ReadByteArray());
+
+ uint sceneIndex = 0;
+ Guid sceneSwitchProgressGuid = new Guid();
+
+ if (NetworkingManager.Singleton.NetworkConfig.EnableSceneManagement)
+ {
+ sceneIndex = reader.ReadUInt32Packed();
+ sceneSwitchProgressGuid = new Guid(reader.ReadByteArray());
+ }
+
+ bool sceneSwitch = NetworkingManager.Singleton.NetworkConfig.EnableSceneManagement && NetworkSceneManager.HasSceneMismatch(sceneIndex);
float netTime = reader.ReadSinglePacked();
NetworkingManager.Singleton.UpdateNetworkTime(clientId, netTime, receiveTime, true);
NetworkingManager.Singleton.ConnectedClients.Add(NetworkingManager.Singleton.LocalClientId, new NetworkedClient() { ClientId = NetworkingManager.Singleton.LocalClientId });
- bool sceneSwitch = NetworkSceneManager.HasSceneMismatch(sceneIndex);
void DelayedSpawnAction(Stream continuationStream)
{
using (PooledBitReader continuationReader = PooledBitReader.Get(continuationStream))
{
- if (NetworkingManager.Singleton.NetworkConfig.UsePrefabSync)
+ if (!NetworkingManager.Singleton.NetworkConfig.EnableSceneManagement || NetworkingManager.Singleton.NetworkConfig.UsePrefabSync)
{
SpawnManager.DestroySceneObjects();
}
@@ -245,7 +252,7 @@ void DelayedSpawnAction(Stream continuationStream)
ulong instanceId;
bool softSync;
- if (NetworkingManager.Singleton.NetworkConfig.UsePrefabSync)
+ if (!NetworkingManager.Singleton.NetworkConfig.EnableSceneManagement || NetworkingManager.Singleton.NetworkConfig.UsePrefabSync)
{
softSync = false;
instanceId = 0;
@@ -332,7 +339,7 @@ internal static void HandleAddObject(ulong clientId, Stream stream)
ulong instanceId;
bool softSync;
- if (NetworkingManager.Singleton.NetworkConfig.UsePrefabSync)
+ if (!NetworkingManager.Singleton.NetworkConfig.EnableSceneManagement || NetworkingManager.Singleton.NetworkConfig.UsePrefabSync)
{
softSync = false;
instanceId = 0;
diff --git a/MLAPI/SceneManagement/NetworkSceneManager.cs b/MLAPI/SceneManagement/NetworkSceneManager.cs
index f8200f9822..b66b7f0a07 100644
--- a/MLAPI/SceneManagement/NetworkSceneManager.cs
+++ b/MLAPI/SceneManagement/NetworkSceneManager.cs
@@ -3,7 +3,6 @@
using System.IO;
using MLAPI.Configuration;
using MLAPI.Exceptions;
-using MLAPI.Internal;
using MLAPI.Logging;
using MLAPI.Messaging;
using MLAPI.Security;
@@ -266,7 +265,7 @@ private static void OnSceneUnloadServer(Guid switchSceneGuid)
writer.WriteUInt64Packed(parent.NetworkId);
}
- if (NetworkingManager.Singleton.NetworkConfig.UsePrefabSync)
+ if (!NetworkingManager.Singleton.NetworkConfig.EnableSceneManagement || NetworkingManager.Singleton.NetworkConfig.UsePrefabSync)
{
writer.WriteUInt64Packed(newSceneObjects[i].PrefabHash);
@@ -312,7 +311,7 @@ private static void OnSceneUnloadServer(Guid switchSceneGuid)
private static void OnSceneUnloadClient(Guid switchSceneGuid, Stream objectStream)
{
- if (NetworkingManager.Singleton.NetworkConfig.UsePrefabSync)
+ if (!NetworkingManager.Singleton.NetworkConfig.EnableSceneManagement || NetworkingManager.Singleton.NetworkConfig.UsePrefabSync)
{
SpawnManager.DestroySceneObjects();
diff --git a/MLAPI/Spawning/SpawnManager.cs b/MLAPI/Spawning/SpawnManager.cs
index 363e00c95b..c065cadfa2 100644
--- a/MLAPI/Spawning/SpawnManager.cs
+++ b/MLAPI/Spawning/SpawnManager.cs
@@ -247,7 +247,7 @@ internal static NetworkedObject CreateLocalNetworkedObject(bool softCreate, ulon
if (LogHelper.CurrentLogLevel <= LogLevel.Normal) LogHelper.LogWarning("Cannot find parent. Parent objects always have to be spawned and replicated BEFORE the child");
}
- if (NetworkingManager.Singleton.NetworkConfig.UsePrefabSync || !softCreate)
+ if (!NetworkingManager.Singleton.NetworkConfig.EnableSceneManagement || NetworkingManager.Singleton.NetworkConfig.UsePrefabSync || !softCreate)
{
// Create the object
if (customSpawnHandlers.ContainsKey(prefabHash))
@@ -419,7 +419,7 @@ internal static void WriteSpawnCallForObject(Serialization.BitStream stream, ulo
writer.WriteUInt64Packed(parent.NetworkId);
}
- if (NetworkingManager.Singleton.NetworkConfig.UsePrefabSync)
+ if (!NetworkingManager.Singleton.NetworkConfig.EnableSceneManagement || NetworkingManager.Singleton.NetworkConfig.UsePrefabSync)
{
writer.WriteUInt64Packed(netObject.PrefabHash);
}