Skip to content

Commit 6937e4f

Browse files
committed
Merge branch 'develop-2.0.0' into chore/simplify-accessors-network-object
# Conflicts: # com.unity.netcode.gameobjects/Runtime/Core/NetworkObject.cs
2 parents c933538 + 8ba1f85 commit 6937e4f

File tree

5 files changed

+39
-22
lines changed

5 files changed

+39
-22
lines changed

com.unity.netcode.gameobjects/Runtime/Core/NetworkManager.cs

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -313,11 +313,11 @@ internal void NetworkTransformRegistration(NetworkObject networkObject, bool onU
313313

314314
private void UpdateTopology()
315315
{
316-
var transportTopology = IsListening ? NetworkConfig.NetworkTransport.CurrentTopology() : NetworkConfig.NetworkTopology;
316+
var transportTopology = IsListening && IsConnectedClient ? NetworkConfig.NetworkTransport.CurrentTopology() : NetworkConfig.NetworkTopology;
317317
if (transportTopology != NetworkConfig.NetworkTopology)
318318
{
319-
NetworkLog.LogErrorServer($"[Topology Mismatch] Transport detected an issue with the topology ({transportTopology} | {NetworkConfig.NetworkTopology}) usage or setting! Disconnecting from session.");
320-
Shutdown();
319+
NetworkLog.LogErrorServer($"[Topology Mismatch][{transportTopology}:{transportTopology.GetType().Name}][NetworkManager.NetworkConfig:{NetworkConfig.NetworkTopology}] Transport detected an issue with the topology usage or setting! Disconnecting from session.");
320+
Shutdown(true);
321321
}
322322
else
323323
{
@@ -504,6 +504,7 @@ public void NetworkUpdate(NetworkUpdateStage updateStage)
504504
ShutdownInternal();
505505
}
506506
}
507+
507508
}
508509
break;
509510
}

com.unity.netcode.gameobjects/Runtime/Core/NetworkObject.cs

Lines changed: 15 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1345,6 +1345,15 @@ public void SetSceneObjectStatus(bool isSceneObject = false)
13451345

13461346
internal readonly HashSet<ulong> Observers = new HashSet<ulong>();
13471347

1348+
[MethodImpl(MethodImplOptions.AggressiveInlining)]
1349+
internal void AddObserver(ulong clientId)
1350+
{
1351+
#if NETCODE_DEBUG_OBSERVERS
1352+
Debug.Log($"[{nameof(NetworkObject)}][{name}-{NetworkObjectId}] Adding Client-{clientId} as an observer.");
1353+
#endif
1354+
Observers.Add(clientId);
1355+
}
1356+
13481357
#if MULTIPLAYER_TOOLS
13491358
private string m_CachedNameForMetrics;
13501359
#endif
@@ -1494,7 +1503,7 @@ public void NetworkShow(ulong clientId)
14941503
return;
14951504
}
14961505
NetworkManagerOwner.SpawnManager.MarkObjectForShowingTo(this, clientId);
1497-
Observers.Add(clientId);
1506+
AddObserver(clientId);
14981507
}
14991508

15001509

@@ -3288,7 +3297,7 @@ internal static NetworkObject Deserialize(in SerializedObject serializedObject,
32883297
{
32893298
foreach (var observer in serializedObject.Observers)
32903299
{
3291-
networkObject.Observers.Add(observer);
3300+
networkObject.AddObserver(observer);
32923301
}
32933302
}
32943303

@@ -3308,11 +3317,11 @@ internal static NetworkObject Deserialize(in SerializedObject serializedObject,
33083317
if (networkObject.IsPlayerObject)
33093318
{
33103319
// If it is another player, then make sure the local player is aware of the player
3311-
playerObject.Observers.Add(networkObject.OwnerClientId);
3320+
playerObject.AddObserver(networkObject.OwnerClientId);
33123321
}
33133322

33143323
// Assure the local player has observability
3315-
networkObject.Observers.Add(playerObject.OwnerClientId);
3324+
networkObject.AddObserver(playerObject.OwnerClientId);
33163325

33173326
// If it is a player object, then add it to all known spawned NetworkObjects that spawn with observers
33183327
if (networkObject.IsPlayerObject)
@@ -3321,7 +3330,7 @@ internal static NetworkObject Deserialize(in SerializedObject serializedObject,
33213330
{
33223331
if (netObject.Value.SpawnWithObservers)
33233332
{
3324-
netObject.Value.Observers.Add(networkObject.OwnerClientId);
3333+
netObject.Value.AddObserver(networkObject.OwnerClientId);
33253334
}
33263335
}
33273336
}
@@ -3333,7 +3342,7 @@ internal static NetworkObject Deserialize(in SerializedObject serializedObject,
33333342
// Add all known players to the observers list if they don't already exist
33343343
foreach (var player in networkManager.SpawnManager.PlayerObjects)
33353344
{
3336-
networkObject.Observers.Add(player.OwnerClientId);
3345+
networkObject.AddObserver(player.OwnerClientId);
33373346
}
33383347
}
33393348
}

com.unity.netcode.gameobjects/Runtime/Messaging/Messages/ConnectionApprovedMessage.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -158,7 +158,7 @@ public void Serialize(FastBufferWriter writer, int targetVersion)
158158
{
159159
if (sobj.SpawnWithObservers && (sobj.CheckObjectVisibility == null || sobj.CheckObjectVisibility(OwnerClientId)))
160160
{
161-
sobj.Observers.Add(OwnerClientId);
161+
sobj.AddObserver(OwnerClientId);
162162
// In distributed authority mode, we send the currently known observers of each NetworkObject to the client being synchronized.
163163
var serializedObject = sobj.Serialize(OwnerClientId, IsDistributedAuthority);
164164
serializedObject.Serialize(writer);

com.unity.netcode.gameobjects/Runtime/Messaging/Messages/CreateObjectMessage.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -208,7 +208,7 @@ internal static void CreateObject(ref NetworkManager networkManager, ulong sende
208208
// Update the observers for this instance
209209
for (int i = 0; i < clientList.Count; i++)
210210
{
211-
networkObject.Observers.Add(clientList[i]);
211+
networkObject.AddObserver(clientList[i]);
212212
}
213213

214214
// Mock CMB Service and forward to all clients

com.unity.netcode.gameobjects/Runtime/Spawning/NetworkSpawnManager.cs

Lines changed: 18 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -81,26 +81,33 @@ private void AddPlayerObject(NetworkObject playerObject)
8181
}
8282
}
8383

84+
var cmbService = NetworkManager.CMBServiceConnection;
85+
var sceneManagement = NetworkManager.NetworkConfig.EnableSceneManagement;
86+
8487
foreach (var player in m_PlayerObjects)
8588
{
89+
// When connected to the CMB service, scene management is disabled, and it is the local player, we do
90+
// not want to add the newly connected player to the observers list of the local player as that will be
91+
// done when the local client shows the NetworkObject to the newly connected client.
92+
var shouldAddObserver = cmbService && !sceneManagement ? !player.IsLocalPlayer : true;
8693
// If the player's SpawnWithObservers is not set then do not add the new player object's owner as an observer.
87-
if (player.SpawnWithObservers)
94+
if (player.SpawnWithObservers && shouldAddObserver)
8895
{
89-
player.Observers.Add(playerObject.OwnerClientId);
96+
player.AddObserver(playerObject.OwnerClientId);
9097
}
9198

9299
// If the new player object's SpawnWithObservers is not set then do not add this player as an observer to the new player object.
93100
if (playerObject.SpawnWithObservers)
94101
{
95-
playerObject.Observers.Add(player.OwnerClientId);
102+
playerObject.AddObserver(player.OwnerClientId);
96103
}
97104
}
98105

99106
// Only if spawn with observers is set or we are using a distributed authority network topology and this is the client's player should we add
100107
// the owner as an observer.
101108
if (playerObject.SpawnWithObservers || (NetworkManager.DistributedAuthorityMode && NetworkManager.LocalClientId == playerObject.OwnerClientId))
102109
{
103-
playerObject.Observers.Add(playerObject.OwnerClientId);
110+
playerObject.AddObserver(playerObject.OwnerClientId);
104111
}
105112

106113
m_PlayerObjects.Add(playerObject);
@@ -1066,7 +1073,7 @@ internal void AuthorityLocalSpawn([NotNull] NetworkObject networkObject, ulong n
10661073
// (authority should not take into consideration networkObject.CheckObjectVisibility when SpawnWithObservers is false)
10671074
if (!networkObject.SpawnWithObservers)
10681075
{
1069-
networkObject.Observers.Add(ownerClientId);
1076+
networkObject.AddObserver(ownerClientId);
10701077
}
10711078
else
10721079
{
@@ -1077,15 +1084,15 @@ internal void AuthorityLocalSpawn([NotNull] NetworkObject networkObject, ulong n
10771084
{
10781085
continue;
10791086
}
1080-
networkObject.Observers.Add(clientId);
1087+
networkObject.AddObserver(clientId);
10811088
}
10821089

10831090
// Sanity check to make sure the owner is always included
10841091
// Itentionally checking as opposed to just assigning in order to generate notification.
10851092
if (!networkObject.Observers.Contains(ownerClientId))
10861093
{
10871094
Debug.LogError($"Client-{ownerClientId} is the owner of {networkObject.name} but is not an observer! Adding owner, but there is a bug in observer synchronization!");
1088-
networkObject.Observers.Add(ownerClientId);
1095+
networkObject.AddObserver(ownerClientId);
10891096
}
10901097
}
10911098
}
@@ -1174,7 +1181,7 @@ internal void SpawnNetworkObjectLocallyCommon(NetworkObject networkObject, ulong
11741181
// If running as a server only, then make sure to always add the server's client identifier
11751182
if (!NetworkManager.IsHost)
11761183
{
1177-
networkObject.Observers.Add(NetworkManager.LocalClientId);
1184+
networkObject.AddObserver(NetworkManager.LocalClientId);
11781185
}
11791186

11801187
// Add client observers
@@ -1185,7 +1192,7 @@ internal void SpawnNetworkObjectLocallyCommon(NetworkObject networkObject, ulong
11851192
{
11861193
continue;
11871194
}
1188-
networkObject.Observers.Add(NetworkManager.ConnectedClientsIds[i]);
1195+
networkObject.AddObserver(NetworkManager.ConnectedClientsIds[i]);
11891196
}
11901197
}
11911198

@@ -1745,15 +1752,15 @@ internal void UpdateObservedNetworkObjects(ulong clientId)
17451752
// If the client is not part of the observers and spawn with observers is enabled on this instance or the clientId is the server/host/DAHost
17461753
if (!sobj.Observers.Contains(clientId) && (sobj.SpawnWithObservers || clientId == NetworkManager.ServerClientId))
17471754
{
1748-
sobj.Observers.Add(clientId);
1755+
sobj.AddObserver(clientId);
17491756
}
17501757
}
17511758
else
17521759
{
17531760
// CheckObject visibility overrides SpawnWithObservers under this condition
17541761
if (sobj.CheckObjectVisibility(clientId))
17551762
{
1756-
sobj.Observers.Add(clientId);
1763+
sobj.AddObserver(clientId);
17571764
}
17581765
else // Otherwise, if the observers contains the clientId (shouldn't happen) then remove it since CheckObjectVisibility returned false
17591766
{

0 commit comments

Comments
 (0)