|
3 | 3 | using System.Diagnostics.CodeAnalysis;
|
4 | 4 | using System.Linq;
|
5 | 5 | using System.Text;
|
| 6 | +using Unity.Collections; |
6 | 7 | using UnityEngine;
|
7 | 8 |
|
8 | 9 | namespace Unity.Netcode
|
@@ -577,12 +578,30 @@ internal void ChangeOwnership(NetworkObject networkObject, ulong clientId, bool
|
577 | 578 | // If we are connected to the CMB service or not the DAHost (i.e. pure DA-Clients only)
|
578 | 579 | if (NetworkManager.CMBServiceConnection || !NetworkManager.DAHost)
|
579 | 580 | {
|
580 |
| - // Populate valid target client identifiers that should receive this change in ownership message. |
581 |
| - message.ClientIds = NetworkManager.ConnectedClientsIds.Where((c) => !IsObjectVisibilityPending(c, ref networkObject) && networkObject.IsNetworkVisibleTo(c)).ToArray(); |
582 |
| - message.ClientIdCount = message.ClientIds.Length; |
| 581 | + // Calculate valid target client identifiers that should receive this change in ownership message. |
| 582 | + var clientIds = new List<ulong>(NetworkManager.ConnectedClientsIds.Count); |
| 583 | + foreach (var id in NetworkManager.ConnectedClientsIds) |
| 584 | + { |
| 585 | + if (id == NetworkManager.LocalClientId) |
| 586 | + { |
| 587 | + continue; |
| 588 | + } |
583 | 589 |
|
584 |
| - size = NetworkManager.ConnectionManager.SendMessage(ref message, NetworkDelivery.ReliableSequenced, NetworkManager.ServerClientId); |
585 |
| - NetworkManager.NetworkMetrics.TrackOwnershipChangeSent(NetworkManager.LocalClientId, networkObject, size); |
| 590 | + if (networkObject.IsNetworkVisibleTo(id) && !IsObjectVisibilityPending(id, ref networkObject)) |
| 591 | + { |
| 592 | + clientIds.Add(id); |
| 593 | + } |
| 594 | + } |
| 595 | + |
| 596 | + // Don't send the message if there are no valid receivers |
| 597 | + if (clientIds.Count > 0) |
| 598 | + { |
| 599 | + message.ClientIds = clientIds.ToArray(); |
| 600 | + message.ClientIdCount = clientIds.Count; |
| 601 | + |
| 602 | + size = NetworkManager.ConnectionManager.SendMessage(ref message, NetworkDelivery.ReliableSequenced, NetworkManager.ServerClientId); |
| 603 | + NetworkManager.NetworkMetrics.TrackOwnershipChangeSent(NetworkManager.LocalClientId, networkObject, size); |
| 604 | + } |
586 | 605 | }
|
587 | 606 | else // We are the DAHost so broadcast the ownership change
|
588 | 607 | {
|
|
0 commit comments