Skip to content

Commit c013f64

Browse files
authored
fix: Avoid duplicate RPC invocation on host (#2834)
Host acts as both client and server. Both the client target and the server target points to same instance This results in two invocations on the host which is not expected Checking that the server is host and skipping the RpcTarget invocation we avoid this situation
1 parent ade472e commit c013f64

File tree

3 files changed

+31
-7
lines changed

3 files changed

+31
-7
lines changed

com.unity.netcode.gameobjects/Runtime/Messaging/RpcTargets/NotMeRpcTarget.cs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,10 @@ internal override void Send(NetworkBehaviour behaviour, ref RpcMessage message,
4949
{
5050
continue;
5151
}
52+
if (clientId == NetworkManager.ServerClientId)
53+
{
54+
continue;
55+
}
5256
m_GroupSendTarget.Add(clientId);
5357
}
5458
}

com.unity.netcode.gameobjects/Runtime/Messaging/RpcTargets/NotOwnerRpcTarget.cs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,10 @@ internal override void Send(NetworkBehaviour behaviour, ref RpcMessage message,
4040
{
4141
continue;
4242
}
43+
if (clientId == NetworkManager.ServerClientId)
44+
{
45+
continue;
46+
}
4347
if (clientId == behaviour.NetworkManager.LocalClientId)
4448
{
4549
m_LocalSendRpcTarget.Send(behaviour, ref message, delivery, rpcParams);
@@ -57,6 +61,10 @@ internal override void Send(NetworkBehaviour behaviour, ref RpcMessage message,
5761
{
5862
continue;
5963
}
64+
if (clientId == NetworkManager.ServerClientId)
65+
{
66+
continue;
67+
}
6068
if (clientId == behaviour.NetworkManager.LocalClientId)
6169
{
6270
m_LocalSendRpcTarget.Send(behaviour, ref message, delivery, rpcParams);

com.unity.netcode.gameobjects/Tests/Runtime/UniversalRpcTests.cs

Lines changed: 19 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ public class UniversalRpcNetworkBehaviour : NetworkBehaviour
2424
public string Received = string.Empty;
2525
public Tuple<int, bool, float, string> ReceivedParams = null;
2626
public ulong ReceivedFrom = ulong.MaxValue;
27+
public int ReceivedCount;
2728

2829
public void OnRpcReceived()
2930
{
@@ -32,6 +33,7 @@ public void OnRpcReceived()
3233

3334
var currentMethod = sf.GetMethod();
3435
Received = currentMethod.Name;
36+
ReceivedCount++;
3537
}
3638
public void OnRpcReceivedWithParams(int a, bool b, float f, string s)
3739
{
@@ -40,6 +42,7 @@ public void OnRpcReceivedWithParams(int a, bool b, float f, string s)
4042

4143
var currentMethod = sf.GetMethod();
4244
Received = currentMethod.Name;
45+
ReceivedCount++;
4346
ReceivedParams = new Tuple<int, bool, float, string>(a, b, f, s);
4447
}
4548

@@ -496,6 +499,7 @@ protected void Clear()
496499
foreach (var obj in Object.FindObjectsByType<UniversalRpcNetworkBehaviour>(FindObjectsSortMode.None))
497500
{
498501
obj.Received = string.Empty;
502+
obj.ReceivedCount = 0;
499503
obj.ReceivedParams = null;
500504
obj.ReceivedFrom = ulong.MaxValue;
501505
}
@@ -528,10 +532,11 @@ protected UniversalRpcNetworkBehaviour GetPlayerObject(ulong ownerClientId, ulon
528532
return m_PlayerNetworkObjects[onClient][ownerClientId].GetComponent<UniversalRpcNetworkBehaviour>();
529533
}
530534

531-
protected void VerifyLocalReceived(ulong objectOwner, ulong sender, string name, bool verifyReceivedFrom)
535+
protected void VerifyLocalReceived(ulong objectOwner, ulong sender, string name, bool verifyReceivedFrom, int expectedReceived = 1)
532536
{
533537
var obj = GetPlayerObject(objectOwner, sender);
534538
Assert.AreEqual(name, obj.Received);
539+
Assert.That(obj.ReceivedCount, Is.EqualTo(expectedReceived));
535540
Assert.IsNull(obj.ReceivedParams);
536541
if (verifyReceivedFrom)
537542
{
@@ -543,6 +548,7 @@ protected void VerifyLocalReceivedWithParams(ulong objectOwner, ulong sender, st
543548
{
544549
var obj = GetPlayerObject(objectOwner, sender);
545550
Assert.AreEqual(name, obj.Received);
551+
Assert.That(obj.ReceivedCount, Is.EqualTo(1));
546552
Assert.IsNotNull(obj.ReceivedParams);
547553
Assert.AreEqual(i, obj.ReceivedParams.Item1);
548554
Assert.AreEqual(b, obj.ReceivedParams.Item2);
@@ -556,17 +562,18 @@ protected void VerifyNotReceived(ulong objectOwner, ulong[] receivedBy)
556562
{
557563
UniversalRpcNetworkBehaviour playerObject = GetPlayerObject(objectOwner, client);
558564
Assert.AreEqual(string.Empty, playerObject.Received);
565+
Assert.That(playerObject.ReceivedCount, Is.EqualTo(0));
559566
Assert.IsNull(playerObject.ReceivedParams);
560567
}
561568
}
562569

563-
protected void VerifyRemoteReceived(ulong objectOwner, ulong sender, string message, ulong[] receivedBy, bool verifyReceivedFrom, bool waitForMessages = true)
570+
protected void VerifyRemoteReceived(ulong objectOwner, ulong sender, string message, ulong[] receivedBy, bool verifyReceivedFrom, bool waitForMessages = true, int expectedReceived = 1)
564571
{
565572
foreach (var client in receivedBy)
566573
{
567574
if (client == sender)
568575
{
569-
VerifyLocalReceived(objectOwner, sender, message, verifyReceivedFrom);
576+
VerifyLocalReceived(objectOwner, sender, message, verifyReceivedFrom, expectedReceived);
570577

571578
break;
572579
}
@@ -628,6 +635,7 @@ protected void VerifyRemoteReceived(ulong objectOwner, ulong sender, string mess
628635
{
629636
UniversalRpcNetworkBehaviour playerObject = GetPlayerObject(objectOwner, client);
630637
Assert.AreEqual(message, playerObject.Received);
638+
Assert.That(playerObject.ReceivedCount, Is.EqualTo(expectedReceived));
631639
Assert.IsNull(playerObject.ReceivedParams);
632640
if (verifyReceivedFrom)
633641
{
@@ -701,6 +709,7 @@ protected void VerifyRemoteReceivedWithParams(ulong objectOwner, ulong sender, s
701709
{
702710
UniversalRpcNetworkBehaviour playerObject = GetPlayerObject(objectOwner, client);
703711
Assert.AreEqual(message, playerObject.Received);
712+
Assert.That(playerObject.ReceivedCount, Is.EqualTo(1));
704713

705714
Assert.IsNotNull(playerObject.ReceivedParams);
706715
Assert.AreEqual(i, playerObject.ReceivedParams.Item1);
@@ -1636,17 +1645,20 @@ public void TestMutualRecursion()
16361645

16371646
VerifyNotReceived(NetworkManager.ServerClientId, s_ClientIds);
16381647

1639-
for (var i = 0; i < 10; ++i)
1648+
var clientListExpected = 1;
1649+
var serverListExpected = 2;
1650+
for (var i = 1; i <= 10; ++i)
16401651
{
16411652
WaitForMessageReceivedWithTimeTravel<RpcMessage>(clientList);
1642-
VerifyRemoteReceived(NetworkManager.ServerClientId, NetworkManager.ServerClientId, nameof(UniversalRpcNetworkBehaviour.MutualRecursionClientRpc), clientIdArray, false, false);
1653+
VerifyRemoteReceived(NetworkManager.ServerClientId, NetworkManager.ServerClientId, nameof(UniversalRpcNetworkBehaviour.MutualRecursionClientRpc), clientIdArray, false, false, clientListExpected);
16431654
VerifyNotReceived(NetworkManager.ServerClientId, serverIdArray);
1655+
clientListExpected *= 2;
16441656

16451657
Clear();
1646-
16471658
WaitForMessageReceivedWithTimeTravel<RpcMessage>(serverList);
1648-
VerifyRemoteReceived(NetworkManager.ServerClientId, NetworkManager.ServerClientId, nameof(UniversalRpcNetworkBehaviour.MutualRecursionServerRpc), serverIdArray, false, false);
1659+
VerifyRemoteReceived(NetworkManager.ServerClientId, NetworkManager.ServerClientId, nameof(UniversalRpcNetworkBehaviour.MutualRecursionServerRpc), serverIdArray, false, false, serverListExpected);
16491660
VerifyNotReceived(NetworkManager.ServerClientId, clientIdArray);
1661+
serverListExpected *= 2;
16501662

16511663
Clear();
16521664
}

0 commit comments

Comments
 (0)