Skip to content

Commit 3249887

Browse files
committed
In DA if an object has no observers, don't send a ParentSync message
1 parent 5a3528c commit 3249887

File tree

1 file changed

+28
-35
lines changed

1 file changed

+28
-35
lines changed

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

Lines changed: 28 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -1171,7 +1171,14 @@ private bool InternalHasAuthority()
11711171
/// <summary>
11721172
/// Gets if the object is owned by the local player or if the object is the local player object
11731173
/// </summary>
1174-
public bool IsOwner => NetworkManager != null && OwnerClientId == NetworkManager.LocalClientId;
1174+
public bool IsOwner
1175+
{
1176+
get
1177+
{
1178+
Debug.Log($"[Client-{NetworkManager.LocalClientId}][Object-{NetworkObjectId}] Owned by {OwnerClientId}");
1179+
return NetworkManager != null && OwnerClientId == NetworkManager.LocalClientId;
1180+
}
1181+
}
11751182

11761183
/// <summary>
11771184
/// Gets Whether or not the object is owned by anyone
@@ -2222,6 +2229,7 @@ public bool TrySetParent(NetworkObject parent, bool worldPositionStays = true)
22222229
// If we are shutting down and don't have authority then allow it.
22232230
if (!isAuthority && !NetworkManager.ShutdownInProgress)
22242231
{
2232+
Debug.LogError("We don't have authority here");
22252233
return false;
22262234
}
22272235

@@ -2285,6 +2293,7 @@ private void OnTransformParentChanged()
22852293
// With distributed authority, we need to track "valid authoritative" parenting changes.
22862294
// So, either the authority or AuthorityAppliedParenting is considered a "valid parenting change".
22872295
isAuthority = HasAuthority || AuthorityAppliedParenting || (AllowOwnerToParent && IsOwner);
2296+
Debug.Log($"[Client-{NetworkManager.LocalClientId}][Object-{NetworkObjectId}] OnTransformParentChanged. HasAuthority={HasAuthority}, AuthorityAppliedParenting={AuthorityAppliedParenting}, AllowOwnerToParent && IsOwner={AllowOwnerToParent && IsOwner}");
22882297
var distributedAuthority = NetworkManager.DistributedAuthorityMode;
22892298

22902299
// If we do not have authority and we are spawned
@@ -2355,6 +2364,8 @@ private void OnTransformParentChanged()
23552364
var authorityApplied = AuthorityAppliedParenting;
23562365
ApplyNetworkParenting(removeParent);
23572366

2367+
2368+
23582369
var message = new ParentSyncMessage
23592370
{
23602371
NetworkObjectId = NetworkObjectId,
@@ -2376,47 +2387,29 @@ private void OnTransformParentChanged()
23762387
m_CachedWorldPositionStays = true;
23772388
}
23782389

2379-
// If we are connected to a CMB service or we are running a mock CMB service then send to the "server" identifier
2380-
if (distributedAuthority || (!distributedAuthority && AllowOwnerToParent && IsOwner && !NetworkManager.IsServer))
2390+
// If we're not the server, we should tell the server about this parent change
2391+
if (!NetworkManager.IsServer)
23812392
{
2382-
if (!NetworkManager.DAHost)
2393+
// Don't send a message in DA mode if we're the only observers of this object (we're the only authority).
2394+
if (distributedAuthority && Observers.Count <= 1)
23832395
{
2384-
NetworkManager.ConnectionManager.SendMessage(ref message, MessageDeliveryType<ParentSyncMessage>.DefaultDelivery, 0);
23852396
return;
23862397
}
2387-
else
2388-
{
2389-
foreach (var clientId in NetworkManager.ConnectionManager.ConnectedClientIds)
2390-
{
2391-
if (clientId == NetworkManager.ServerClientId)
2392-
{
2393-
continue;
2394-
}
2395-
NetworkManager.ConnectionManager.SendMessage(ref message, MessageDeliveryType<ParentSyncMessage>.DefaultDelivery, clientId);
2396-
}
2397-
}
2398+
2399+
NetworkManager.ConnectionManager.SendMessage(ref message, MessageDeliveryType<ParentSyncMessage>.DefaultDelivery, NetworkManager.ServerClientId);
2400+
return;
23982401
}
2399-
else
2402+
2403+
// Otherwise we are a Server (client-server or DAHost). Send to all observers
2404+
foreach (var clientId in NetworkManager.ConnectionManager.ConnectedClientIds)
24002405
{
2401-
// Otherwise we are running in client-server =or= this has to be a DAHost instance.
2402-
// Send to all connected clients.
2403-
unsafe
2406+
if (clientId == NetworkManager.ServerClientId)
24042407
{
2405-
var maxCount = NetworkManager.ConnectedClientsIds.Count;
2406-
ulong* clientIds = stackalloc ulong[maxCount];
2407-
int idx = 0;
2408-
foreach (var clientId in NetworkManager.ConnectionManager.ConnectedClientIds)
2409-
{
2410-
if (clientId == NetworkManager.ServerClientId)
2411-
{
2412-
continue;
2413-
}
2414-
if (Observers.Contains(clientId))
2415-
{
2416-
clientIds[idx++] = clientId;
2417-
}
2418-
}
2419-
NetworkManager.ConnectionManager.SendMessage(ref message, MessageDeliveryType<ParentSyncMessage>.DefaultDelivery, clientIds, idx);
2408+
continue;
2409+
}
2410+
if (Observers.Contains(clientId))
2411+
{
2412+
NetworkManager.ConnectionManager.SendMessage(ref message, MessageDeliveryType<ParentSyncMessage>.DefaultDelivery, clientId);
24202413
}
24212414
}
24222415
}

0 commit comments

Comments
 (0)