From ddbfd6d9d2a5277419105166b05bd92b57a6e2f9 Mon Sep 17 00:00:00 2001 From: Noellie Velez Date: Mon, 15 Jun 2026 18:46:44 +0200 Subject: [PATCH 1/3] General cleanup Make lists readonly, internal to private, foreach instead of fo, TryGet instead of ContainsKey and get, comments typos fix, remove unused code --- .../Runtime/SceneManagement/SceneEventData.cs | 135 ++++++++---------- 1 file changed, 58 insertions(+), 77 deletions(-) diff --git a/com.unity.netcode.gameobjects/Runtime/SceneManagement/SceneEventData.cs b/com.unity.netcode.gameobjects/Runtime/SceneManagement/SceneEventData.cs index 0ad4e96864..5688f44240 100644 --- a/com.unity.netcode.gameobjects/Runtime/SceneManagement/SceneEventData.cs +++ b/com.unity.netcode.gameobjects/Runtime/SceneManagement/SceneEventData.cs @@ -130,21 +130,21 @@ internal class SceneEventData : IDisposable /// was synchronizing (if so server will send another message back to the client informing the client of NetworkObjects to remove) /// spawned during an initial synchronization. /// - private List m_NetworkObjectsSync = new List(); + private readonly List m_NetworkObjectsSync; - private List m_DespawnedInSceneObjectsSync = new List(); + private readonly List m_DespawnedInSceneObjectsSync; /// /// Server Side Re-Synchronization: /// If there happens to be NetworkObjects in the final Event_Sync_Complete message that are no longer spawned, /// the server will compile a list and send back an Event_ReSync message to the client. /// - private List m_NetworkObjectsToBeRemoved = new List(); + private readonly List m_NetworkObjectsToBeRemoved; private bool m_HasInternalBuffer; - internal FastBufferReader InternalBuffer; + private FastBufferReader m_InternalBuffer; - private NetworkManager m_NetworkManager; + private readonly NetworkManager m_NetworkManager; internal List ClientsCompleted; internal List ClientsTimedOut; @@ -571,7 +571,7 @@ internal void Serialize(FastBufferWriter writer) private unsafe void CopyInternalBuffer(ref FastBufferWriter writer) { - writer.WriteBytesSafe(InternalBuffer.GetUnsafePtrAtCurrentPosition(), InternalBuffer.Length); + writer.WriteBytesSafe(m_InternalBuffer.GetUnsafePtrAtCurrentPosition(), m_InternalBuffer.Length); } /// @@ -579,7 +579,7 @@ private unsafe void CopyInternalBuffer(ref FastBufferWriter writer) /// Called at the end of a event once the scene is loaded and scene placed NetworkObjects /// have been locally spawned /// - internal void WriteSceneSynchronizationData(FastBufferWriter writer) + private void WriteSceneSynchronizationData(FastBufferWriter writer) { var builder = (StringBuilder)null; if (EnableSerializationLogs) @@ -604,11 +604,10 @@ internal void WriteSceneSynchronizationData(FastBufferWriter writer) return; } - // Size Place Holder -- Start + // Size Placeholder -- Start // !!NOTE!!: Since this is a placeholder to be set after we know how much we have written, // for stream offset purposes this MUST not be a packed value! writer.WriteValueSafe(0); - int totalBytes = 0; // Write the number of NetworkObjects we are serializing writer.WriteValueSafe(m_NetworkObjectsSync.Count); @@ -619,16 +618,14 @@ internal void WriteSceneSynchronizationData(FastBufferWriter writer) var distributedAuthority = m_NetworkManager.DistributedAuthorityMode; // Serialize all NetworkObjects that are spawned - for (var i = 0; i < m_NetworkObjectsSync.Count; ++i) + foreach (var networkObject in m_NetworkObjectsSync) { - var networkObject = m_NetworkObjectsSync[i]; var noStart = writer.Position; // In distributed authority mode, we send the currently known observers of each NetworkObject to the client being synchronized. - var serializedObject = m_NetworkObjectsSync[i].Serialize(TargetClientId, distributedAuthority); + var serializedObject = networkObject.Serialize(TargetClientId, distributedAuthority); serializedObject.Serialize(writer); var noStop = writer.Position; - totalBytes += noStop - noStart; if (EnableSerializationLogs) { var offStart = noStart - (positionStart + sizeof(int)); @@ -645,16 +642,13 @@ internal void WriteSceneSynchronizationData(FastBufferWriter writer) // Write the number of despawned in-scene placed NetworkObjects writer.WriteValueSafe(m_DespawnedInSceneObjectsSync.Count); // Write the scene handle and GlobalObjectIdHash value - for (var i = 0; i < m_DespawnedInSceneObjectsSync.Count; ++i) + foreach (var despawnedInSceneObject in m_DespawnedInSceneObjectsSync) { - var noStart = writer.Position; - writer.WriteValueSafe(m_DespawnedInSceneObjectsSync[i].GetSceneOriginHandle()); - writer.WriteValueSafe(m_DespawnedInSceneObjectsSync[i].GlobalObjectIdHash); - var noStop = writer.Position; - totalBytes += noStop - noStart; + writer.WriteValueSafe(despawnedInSceneObject.GetSceneOriginHandle()); + writer.WriteValueSafe(despawnedInSceneObject.GlobalObjectIdHash); } - // Size Place Holder -- End + // Size Placeholder -- End var positionEnd = writer.Position; var bytesWritten = (uint)(positionEnd - (positionStart + sizeof(uint))); writer.Seek(positionStart); @@ -673,12 +667,12 @@ internal void WriteSceneSynchronizationData(FastBufferWriter writer) /// have been locally spawned /// Maximum number of objects that could theoretically be synchronized is 65536 /// - internal void SerializeScenePlacedObjects(FastBufferWriter writer) + private void SerializeScenePlacedObjects(FastBufferWriter writer) { var numberOfObjects = (ushort)0; var headPosition = writer.Position; - // Write our count place holder (must not be packed!) + // Write our count placeholder (must not be packed!) writer.WriteValueSafe((ushort)0); var distributedAuthority = m_NetworkManager.DistributedAuthorityMode; // If distributed authority mode and sending to the service, then ignore observers @@ -712,10 +706,10 @@ internal void SerializeScenePlacedObjects(FastBufferWriter writer) // Write the number of despawned in-scene placed NetworkObjects writer.WriteValueSafe(m_DespawnedInSceneObjectsSync.Count); // Write the scene handle and GlobalObjectIdHash value - for (var i = 0; i < m_DespawnedInSceneObjectsSync.Count; ++i) + foreach (var despawnedInSceneObject in m_DespawnedInSceneObjectsSync) { - writer.WriteValueSafe(m_DespawnedInSceneObjectsSync[i].GetSceneOriginHandle()); - writer.WriteValueSafe(m_DespawnedInSceneObjectsSync[i].GlobalObjectIdHash); + writer.WriteValueSafe(despawnedInSceneObject.GetSceneOriginHandle()); + writer.WriteValueSafe(despawnedInSceneObject.GlobalObjectIdHash); } var tailPosition = writer.Position; @@ -802,7 +796,7 @@ internal void Deserialize(FastBufferReader reader) // be processed once we are done loading. m_HasInternalBuffer = true; // We use Allocator.Persistent since scene loading could take longer than 4 frames - InternalBuffer = new FastBufferReader(reader.GetUnsafePtrAtCurrentPosition(), Allocator.Persistent, reader.Length - reader.Position); + m_InternalBuffer = new FastBufferReader(reader.GetUnsafePtrAtCurrentPosition(), Allocator.Persistent, reader.Length - reader.Position); } break; } @@ -828,7 +822,7 @@ internal void Deserialize(FastBufferReader reader) /// into the internal buffer to be used throughout the synchronization process. /// /// - internal void CopySceneSynchronizationData(FastBufferReader reader) + private void CopySceneSynchronizationData(FastBufferReader reader) { m_NetworkObjectsSync.Clear(); reader.ReadValueSafe(out uint[] scenesToSynchronize); @@ -850,10 +844,10 @@ internal void CopySceneSynchronizationData(FastBufferReader reader) m_HasInternalBuffer = true; // We use Allocator.Persistent since scene synchronization will most likely take longer than 4 frames - InternalBuffer = new FastBufferReader(reader.GetUnsafePtrAtCurrentPosition(), Allocator.Persistent, sizeToCopy); + m_InternalBuffer = new FastBufferReader(reader.GetUnsafePtrAtCurrentPosition(), Allocator.Persistent, sizeToCopy); if (EnableSerializationLogs) { - LogArray(InternalBuffer.ToArray()); + LogArray(m_InternalBuffer.ToArray()); } } } @@ -868,12 +862,12 @@ internal void DeserializeScenePlacedObjects() try { // is not packed! - InternalBuffer.ReadValueSafe(out ushort newObjectsCount); + m_InternalBuffer.ReadValueSafe(out ushort newObjectsCount); var sceneObjects = new List(); for (ushort i = 0; i < newObjectsCount; i++) { var serializedObject = new NetworkObject.SerializedObject(); - serializedObject.Deserialize(InternalBuffer); + serializedObject.Deserialize(m_InternalBuffer); if (serializedObject.IsSceneObject) { @@ -881,7 +875,7 @@ internal void DeserializeScenePlacedObjects() m_NetworkManager.SceneManager.SetTheSceneBeingSynchronized(serializedObject.NetworkSceneHandle); } - var networkObject = NetworkObject.Deserialize(serializedObject, InternalBuffer, m_NetworkManager); + var networkObject = NetworkObject.Deserialize(serializedObject, m_InternalBuffer, m_NetworkManager); if (serializedObject.IsSceneObject) { @@ -900,7 +894,7 @@ internal void DeserializeScenePlacedObjects() } finally { - InternalBuffer.Dispose(); + m_InternalBuffer.Dispose(); m_HasInternalBuffer = false; } } @@ -912,7 +906,7 @@ internal void DeserializeScenePlacedObjects() /// client handles any returned values by the server. /// /// - internal void ReadClientReSynchronizationData(FastBufferReader reader) + private void ReadClientReSynchronizationData(FastBufferReader reader) { reader.ReadValueSafe(out uint[] networkObjectsToRemove); @@ -949,7 +943,7 @@ internal void ReadClientReSynchronizationData(FastBufferReader reader) /// the server will compile a list and send back an Event_ReSync message to the client. /// /// - internal void WriteClientReSynchronizationData(FastBufferWriter writer) + private void WriteClientReSynchronizationData(FastBufferWriter writer) { //Write how many objects need to be removed writer.WriteValueSafe(m_NetworkObjectsToBeRemoved.ToArray()); @@ -973,7 +967,7 @@ internal bool ClientNeedsReSynchronization() /// have since been despawned. /// /// - internal void CheckClientSynchronizationResults(FastBufferReader reader) + private void CheckClientSynchronizationResults(FastBufferReader reader) { m_NetworkObjectsToBeRemoved.Clear(); reader.ReadValueSafe(out uint networkObjectIdCount); @@ -990,12 +984,12 @@ internal void CheckClientSynchronizationResults(FastBufferReader reader) /// /// Client Side: /// During the deserialization process of the servers Event_Sync, the client builds a list of - /// all NetworkObjectIds that were spawned. Upon responding to the server with the Event_Sync_Complete + /// all NetworkObjectIds that were spawned. Upon responding to the server with the Event_Sync_Complete, /// this list is included for the server to review over and determine if the client needs a minor resynchronization /// of NetworkObjects that might have been despawned while the client was processing the Event_Sync. /// /// - internal void WriteClientSynchronizationResults(FastBufferWriter writer) + private void WriteClientSynchronizationResults(FastBufferWriter writer) { //Write how many objects were spawned writer.WriteValueSafe((uint)m_NetworkObjectsSync.Count); @@ -1012,14 +1006,14 @@ internal void WriteClientSynchronizationResults(FastBufferWriter writer) private void DeserializeDespawnedInScenePlacedNetworkObjects() { // Process all de-spawned in-scene NetworkObjects for this network session - InternalBuffer.ReadValueSafe(out int despawnedObjectsCount); + m_InternalBuffer.ReadValueSafe(out int despawnedObjectsCount); var sceneCache = new Dictionary>(); for (int i = 0; i < despawnedObjectsCount; i++) { // We just need to get the scene - InternalBuffer.ReadValueSafe(out NetworkSceneHandle networkSceneHandle); - InternalBuffer.ReadValueSafe(out uint globalObjectIdHash); + m_InternalBuffer.ReadValueSafe(out NetworkSceneHandle networkSceneHandle); + m_InternalBuffer.ReadValueSafe(out uint globalObjectIdHash); // Check if we already have processed the objects in this scene if (!sceneCache.TryGetValue(networkSceneHandle, out var sceneRelativeNetworkObjects)) @@ -1095,30 +1089,30 @@ internal void SynchronizeSceneNetworkObjects(NetworkManager networkManager) try { // Process all spawned NetworkObjects for this network session - InternalBuffer.ReadValueSafe(out int newObjectsCount); + m_InternalBuffer.ReadValueSafe(out int newObjectsCount); if (EnableSerializationLogs) { - builder.AppendLine($"[Read][Synchronize Objects][WPos: {InternalBuffer.Position}][NO-Count: {newObjectsCount}] Begin:"); + builder.AppendLine($"[Read][Synchronize Objects][WPos: {m_InternalBuffer.Position}][NO-Count: {newObjectsCount}] Begin:"); } for (int i = 0; i < newObjectsCount; i++) { - var noStart = InternalBuffer.Position; + var noStart = m_InternalBuffer.Position; var serializedObject = new NetworkObject.SerializedObject(); - serializedObject.Deserialize(InternalBuffer); + serializedObject.Deserialize(m_InternalBuffer); // If the sceneObject is in-scene placed, then set the scene being synchronized if (serializedObject.IsSceneObject) { m_NetworkManager.SceneManager.SetTheSceneBeingSynchronized(serializedObject.NetworkSceneHandle); } - var spawnedNetworkObject = NetworkObject.Deserialize(serializedObject, InternalBuffer, networkManager); + var spawnedNetworkObject = NetworkObject.Deserialize(serializedObject, m_InternalBuffer, networkManager); - var noStop = InternalBuffer.Position; + var noStop = m_InternalBuffer.Position; if (EnableSerializationLogs) { builder.AppendLine($"[Head: {noStart}][Tail: {noStop}][Size: {noStop - noStart}][{spawnedNetworkObject.name}][NID-{spawnedNetworkObject.NetworkObjectId}][Children: {spawnedNetworkObject.ChildNetworkBehaviours.Count}]"); - LogArray(InternalBuffer.ToArray(), noStart, noStop, builder); + LogArray(m_InternalBuffer.ToArray(), noStart, noStop, builder); } // If we failed to deserialize the NetworkObject then don't add null to the list if (spawnedNetworkObject != null) @@ -1157,7 +1151,7 @@ internal void SynchronizeSceneNetworkObjects(NetworkManager networkManager) } finally { - InternalBuffer.Dispose(); + m_InternalBuffer.Dispose(); m_HasInternalBuffer = false; } } @@ -1166,7 +1160,7 @@ internal void SynchronizeSceneNetworkObjects(NetworkManager networkManager) /// Writes the all clients loaded or unloaded completed and timed out lists /// /// - internal void WriteSceneEventProgressDone(FastBufferWriter writer) + private void WriteSceneEventProgressDone(FastBufferWriter writer) { writer.WriteValueSafe((ushort)ClientsCompleted.Count); foreach (var clientId in ClientsCompleted) @@ -1185,7 +1179,7 @@ internal void WriteSceneEventProgressDone(FastBufferWriter writer) /// Reads the all clients loaded or unloaded completed and timed out lists /// /// - internal void ReadSceneEventProgressDone(FastBufferReader reader) + private void ReadSceneEventProgressDone(FastBufferReader reader) { reader.ReadValueSafe(out ushort completedCount); ClientsCompleted = new List(); @@ -1251,19 +1245,13 @@ private void DeserializeObjectsMovedIntoNewScene(FastBufferReader reader) var sceneManager = m_NetworkManager.SceneManager; var spawnManager = m_NetworkManager.SpawnManager; - var numberOfScenes = 0; - NetworkSceneHandle sceneHandle; - var objectCount = 0; - var networkObjectId = (ulong)0; - - var ownerID = (ulong)0; - reader.ReadValueSafe(out ownerID); + reader.ReadValueSafe(out ulong ownerID); m_OwnerId = ownerID; - reader.ReadValueSafe(out numberOfScenes); + reader.ReadValueSafe(out int numberOfScenes); for (int i = 0; i < numberOfScenes; i++) { - reader.ReadValueSafe(out sceneHandle); + reader.ReadValueSafe(out NetworkSceneHandle sceneHandle); if (!sceneManager.ObjectsMigratedIntoNewScene.TryGetValue(sceneHandle, out var migratedObjects)) { migratedObjects = new Dictionary>(); @@ -1275,16 +1263,16 @@ private void DeserializeObjectsMovedIntoNewScene(FastBufferReader reader) migratedObjects.Add(ownerID, new List()); } - reader.ReadValueSafe(out objectCount); + reader.ReadValueSafe(out int objectCount); for (int j = 0; j < objectCount; j++) { - reader.ReadValueSafe(out networkObjectId); - if (!spawnManager.SpawnedObjects.ContainsKey(networkObjectId)) + reader.ReadValueSafe(out ulong networkObjectId); + if (!spawnManager.SpawnedObjects.TryGetValue(networkObjectId, out var networkObject)) { NetworkLog.LogError($"[Object Scene Migration] Trying to synchronize NetworkObjectId ({networkObjectId}) but it was not spawned or no longer exists!!"); continue; } - var networkObject = spawnManager.SpawnedObjects[networkObjectId]; + // Add NetworkObject scene migration to ObjectsMigratedIntoNewScene dictionary that is processed migratedObjects[ownerID].Add(networkObject); } @@ -1301,15 +1289,8 @@ private void DeserializeObjectsMovedIntoNewScene(FastBufferReader reader) private void DeferObjectsMovedIntoNewScene(FastBufferReader reader) { var sceneManager = m_NetworkManager.SceneManager; - var spawnManager = m_NetworkManager.SpawnManager; - var ownerId = (ulong)0; - var numberOfScenes = 0; - NetworkSceneHandle sceneHandle; - var objectCount = 0; - var networkObjectId = (ulong)0; - - reader.ReadValueSafe(out ownerId); + reader.ReadValueSafe(out ulong ownerId); var deferredObjectsMovedEvent = new NetworkSceneManager.DeferredObjectsMovedEvent() { @@ -1318,16 +1299,16 @@ private void DeferObjectsMovedIntoNewScene(FastBufferReader reader) }; - reader.ReadValueSafe(out numberOfScenes); + reader.ReadValueSafe(out int numberOfScenes); for (int i = 0; i < numberOfScenes; i++) { - reader.ReadValueSafe(out sceneHandle); + reader.ReadValueSafe(out NetworkSceneHandle sceneHandle); var objectsMigrated = new List(); deferredObjectsMovedEvent.ObjectsMigratedTable.Add(sceneHandle, objectsMigrated); - reader.ReadValueSafe(out objectCount); + reader.ReadValueSafe(out int objectCount); for (int j = 0; j < objectCount; j++) { - reader.ReadValueSafe(out networkObjectId); + reader.ReadValueSafe(out ulong networkObjectId); objectsMigrated.Add(networkObjectId); } } @@ -1382,7 +1363,7 @@ public void Dispose() { if (m_HasInternalBuffer) { - InternalBuffer.Dispose(); + m_InternalBuffer.Dispose(); m_HasInternalBuffer = false; } } From 4cdc76fc30fb3a5eede251c19eefa3c054a53742 Mon Sep 17 00:00:00 2001 From: Noellie Velez Date: Wed, 17 Jun 2026 20:15:46 +0200 Subject: [PATCH 2/3] fix: revert readonly initializer removal --- .../Runtime/SceneManagement/SceneEventData.cs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/com.unity.netcode.gameobjects/Runtime/SceneManagement/SceneEventData.cs b/com.unity.netcode.gameobjects/Runtime/SceneManagement/SceneEventData.cs index 5688f44240..5cacd1adde 100644 --- a/com.unity.netcode.gameobjects/Runtime/SceneManagement/SceneEventData.cs +++ b/com.unity.netcode.gameobjects/Runtime/SceneManagement/SceneEventData.cs @@ -130,16 +130,16 @@ internal class SceneEventData : IDisposable /// was synchronizing (if so server will send another message back to the client informing the client of NetworkObjects to remove) /// spawned during an initial synchronization. /// - private readonly List m_NetworkObjectsSync; + private readonly List m_NetworkObjectsSync = new List(); - private readonly List m_DespawnedInSceneObjectsSync; + private readonly List m_DespawnedInSceneObjectsSync = new List(); /// /// Server Side Re-Synchronization: /// If there happens to be NetworkObjects in the final Event_Sync_Complete message that are no longer spawned, /// the server will compile a list and send back an Event_ReSync message to the client. /// - private readonly List m_NetworkObjectsToBeRemoved; + private readonly List m_NetworkObjectsToBeRemoved = new List(); private bool m_HasInternalBuffer; private FastBufferReader m_InternalBuffer; From 08be50d2ca76393165f53f665c78dd4758803e85 Mon Sep 17 00:00:00 2001 From: Noellie Velez Date: Wed, 17 Jun 2026 20:16:33 +0200 Subject: [PATCH 3/3] refactir: TryAdd usage + small clanup --- .../Runtime/SceneManagement/SceneEventData.cs | 50 ++++++++----------- 1 file changed, 20 insertions(+), 30 deletions(-) diff --git a/com.unity.netcode.gameobjects/Runtime/SceneManagement/SceneEventData.cs b/com.unity.netcode.gameobjects/Runtime/SceneManagement/SceneEventData.cs index 5cacd1adde..4840944117 100644 --- a/com.unity.netcode.gameobjects/Runtime/SceneManagement/SceneEventData.cs +++ b/com.unity.netcode.gameobjects/Runtime/SceneManagement/SceneEventData.cs @@ -391,12 +391,12 @@ internal void AddDespawnedInSceneNetworkObjects() /// internal void AddNetworkObjectForSynch(uint sceneIndex, NetworkObject networkObject) { - if (!m_SceneNetworkObjects.ContainsKey(sceneIndex)) + if (!m_SceneNetworkObjects.TryGetValue(sceneIndex, out var sceneNetworkObject)) { - m_SceneNetworkObjects.Add(sceneIndex, new List()); + sceneNetworkObject = new List(); + m_SceneNetworkObjects.Add(sceneIndex, sceneNetworkObject); } - - m_SceneNetworkObjects[sceneIndex].Add(networkObject); + sceneNetworkObject.Add(networkObject); } /// @@ -581,7 +581,7 @@ private unsafe void CopyInternalBuffer(ref FastBufferWriter writer) /// private void WriteSceneSynchronizationData(FastBufferWriter writer) { - var builder = (StringBuilder)null; + StringBuilder builder = null; if (EnableSerializationLogs) { builder = new StringBuilder(); @@ -669,7 +669,7 @@ private void WriteSceneSynchronizationData(FastBufferWriter writer) /// private void SerializeScenePlacedObjects(FastBufferWriter writer) { - var numberOfObjects = (ushort)0; + ushort numberOfObjects = 0; var headPosition = writer.Position; // Write our count placeholder (must not be packed!) @@ -695,10 +695,10 @@ private void SerializeScenePlacedObjects(FastBufferWriter writer) SortObjectsToSync(); // Serialize the sorted objects to sync. - foreach (var objectToSycn in m_NetworkObjectsSync) + foreach (var objectToSync in m_NetworkObjectsSync) { // Serialize the NetworkObject - var serializedObject = objectToSycn.Serialize(TargetClientId, distributedAuthority); + var serializedObject = objectToSync.Serialize(TargetClientId, distributedAuthority); serializedObject.Serialize(writer); numberOfObjects++; } @@ -957,7 +957,7 @@ private void WriteClientReSynchronizationData(FastBufferWriter writer) /// internal bool ClientNeedsReSynchronization() { - return (m_NetworkObjectsToBeRemoved.Count > 0); + return m_NetworkObjectsToBeRemoved.Count > 0; } /// @@ -1054,15 +1054,10 @@ private void DeserializeDespawnedInScenePlacedNetworkObjects() // Since this is a NetworkObject that was never spawned, we just need to send a notification // out that it was despawned so users can make adjustments despawnedObject.InvokeBehaviourNetworkDespawn(); - if (!m_NetworkManager.SceneManager.ScenePlacedObjects.ContainsKey(globalObjectIdHash)) - { - m_NetworkManager.SceneManager.ScenePlacedObjects.Add(globalObjectIdHash, new Dictionary()); - } - if (!m_NetworkManager.SceneManager.ScenePlacedObjects[globalObjectIdHash].ContainsKey(despawnedObject.GetSceneOriginHandle())) - { - m_NetworkManager.SceneManager.ScenePlacedObjects[globalObjectIdHash].Add(despawnedObject.GetSceneOriginHandle(), despawnedObject); - } + m_NetworkManager.SceneManager.ScenePlacedObjects.TryAdd(globalObjectIdHash, new Dictionary()); + + m_NetworkManager.SceneManager.ScenePlacedObjects[globalObjectIdHash].TryAdd(despawnedObject.GetSceneOriginHandle(), despawnedObject); } else { @@ -1080,7 +1075,7 @@ private void DeserializeDespawnedInScenePlacedNetworkObjects() /// internal void SynchronizeSceneNetworkObjects(NetworkManager networkManager) { - var builder = (StringBuilder)null; + StringBuilder builder = null; if (EnableSerializationLogs) { builder = new StringBuilder(); @@ -1221,7 +1216,7 @@ private void SerializeObjectsMovedIntoNewScene(FastBufferWriter writer) writer.WriteValueSafe(sceneManager.ObjectsMigratedIntoNewScene.Count); foreach (var sceneHandleObjects in sceneManager.ObjectsMigratedIntoNewScene) { - if (!sceneManager.ObjectsMigratedIntoNewScene[sceneHandleObjects.Key].ContainsKey(ownerId)) + if (!sceneHandleObjects.Value.ContainsKey(ownerId)) { throw new Exception($"Trying to send object scene migration for Client-{ownerId} but the client has no entries to send!"); } @@ -1258,10 +1253,7 @@ private void DeserializeObjectsMovedIntoNewScene(FastBufferReader reader) sceneManager.ObjectsMigratedIntoNewScene.Add(sceneHandle, migratedObjects); } - if (!migratedObjects.ContainsKey(ownerID)) - { - migratedObjects.Add(ownerID, new List()); - } + migratedObjects.TryAdd(ownerID, new List()); reader.ReadValueSafe(out int objectCount); for (int j = 0; j < objectCount; j++) @@ -1298,7 +1290,6 @@ private void DeferObjectsMovedIntoNewScene(FastBufferReader reader) ObjectsMigratedTable = new Dictionary>(), }; - reader.ReadValueSafe(out int numberOfScenes); for (int i = 0; i < numberOfScenes; i++) { @@ -1332,10 +1323,9 @@ internal void ProcessDeferredObjectSceneChangedEvents() migratedObjects = new Dictionary>(); sceneManager.ObjectsMigratedIntoNewScene.Add(keyEntry.Key, migratedObjects); } - if (!migratedObjects.ContainsKey(objectsMovedEvent.OwnerId)) - { - migratedObjects.Add(objectsMovedEvent.OwnerId, new List()); - } + + migratedObjects.TryAdd(objectsMovedEvent.OwnerId, new List()); + var objectList = migratedObjects[objectsMovedEvent.OwnerId]; foreach (var objectId in keyEntry.Value) { @@ -1345,9 +1335,9 @@ internal void ProcessDeferredObjectSceneChangedEvents() continue; } - if (!migratedObjects[objectsMovedEvent.OwnerId].Contains(networkObject)) + if (!objectList.Contains(networkObject)) { - migratedObjects[objectsMovedEvent.OwnerId].Add(networkObject); + objectList.Add(networkObject); } } }