@@ -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