Skip to content

Commit 25ac802

Browse files
committed
Fix ilpp to log message if NetworkManager is not connected or listening
1 parent df8458c commit 25ac802

File tree

2 files changed

+41
-18
lines changed

2 files changed

+41
-18
lines changed

com.unity.netcode.gameobjects/Editor/CodeGen/NetworkBehaviourILPP.cs

Lines changed: 4 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -2229,6 +2229,7 @@ private void InjectWriteAndCallBlocks(MethodDefinition methodDefinition, CustomA
22292229
{
22302230
var returnInstr = processor.Create(OpCodes.Ret);
22312231
var lastInstr = processor.Create(OpCodes.Nop);
2232+
var logNextInstr = processor.Create(OpCodes.Nop);
22322233

22332234
// networkManager = this.NetworkManager;
22342235
instructions.Add(processor.Create(OpCodes.Ldarg_0));
@@ -2237,28 +2238,16 @@ private void InjectWriteAndCallBlocks(MethodDefinition methodDefinition, CustomA
22372238

22382239
// if (networkManager == null || !networkManager.IsListening) { ... return };
22392240
instructions.Add(processor.Create(OpCodes.Ldloc, netManLocIdx));
2240-
instructions.Add(processor.Create(OpCodes.Brfalse, returnInstr));
2241+
instructions.Add(processor.Create(OpCodes.Brfalse_S, logNextInstr));
22412242
instructions.Add(processor.Create(OpCodes.Ldloc, netManLocIdx));
22422243
instructions.Add(processor.Create(OpCodes.Callvirt, m_NetworkManager_getIsListening_MethodRef));
2243-
instructions.Add(processor.Create(OpCodes.Brtrue, lastInstr));
2244-
2245-
var logNextInstr = processor.Create(OpCodes.Nop);
2246-
2247-
// if (LogLevel.Normal > networkManager.LogLevel)
2248-
instructions.Add(processor.Create(OpCodes.Ldloc, netManLocIdx));
2249-
instructions.Add(processor.Create(OpCodes.Ldfld, m_NetworkManager_LogLevel_FieldRef));
2250-
instructions.Add(processor.Create(OpCodes.Ldc_I4, (int)LogLevel.Normal));
2251-
instructions.Add(processor.Create(OpCodes.Cgt));
2252-
instructions.Add(processor.Create(OpCodes.Ldc_I4, 0));
2253-
instructions.Add(processor.Create(OpCodes.Ceq));
2254-
instructions.Add(processor.Create(OpCodes.Brfalse, logNextInstr));
2244+
instructions.Add(processor.Create(OpCodes.Brtrue_S, lastInstr));
22552245

22562246
// Debug.LogError(...);
2247+
instructions.Add(logNextInstr);
22572248
instructions.Add(processor.Create(OpCodes.Ldstr, "Rpc methods can only be invoked after starting the NetworkManager!"));
22582249
instructions.Add(processor.Create(OpCodes.Call, m_Debug_LogError_MethodRef));
22592250

2260-
instructions.Add(logNextInstr);
2261-
22622251
instructions.Add(returnInstr);
22632252
instructions.Add(lastInstr);
22642253
}

com.unity.netcode.gameobjects/Tests/Editor/NetworkBehaviourEditorTests.cs

Lines changed: 37 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
1+
using System.Collections;
12
using NUnit.Framework;
23
using UnityEngine;
4+
using UnityEngine.TestTools;
35
using Object = UnityEngine.Object;
46

57
namespace Unity.Netcode.EditorTests
@@ -35,8 +37,6 @@ public void AccessNetworkObjectTest()
3537
var gameObject = new GameObject(nameof(AccessNetworkObjectTest));
3638
var networkBehaviour = gameObject.AddComponent<EmptyNetworkBehaviour>();
3739

38-
networkBehaviour.NoNetworkRpc();
39-
4040
Assert.That(networkBehaviour.NetworkObject, Is.Null);
4141

4242
var networkObject = gameObject.AddComponent<NetworkObject>();
@@ -71,6 +71,34 @@ public void AccessNetworkObjectTestInDerivedClassWithOverrideFunctions()
7171
Object.DestroyImmediate(gameObject);
7272
}
7373

74+
[UnityTest]
75+
public IEnumerator RpcShouldNoopWhenInvokedWithoutANetworkManagerSession()
76+
{
77+
var noNetworkError = "Rpc methods can only be invoked after starting the NetworkManager!";
78+
var gameObject = new GameObject(nameof(AccessNetworkObjectTestInDerivedClassWithOverrideFunctions));
79+
var networkBehaviour = gameObject.AddComponent<RpcNetworkBehaviour>();
80+
81+
// No networkManager exists so error should be logged
82+
LogAssert.Expect(LogType.Error, noNetworkError);
83+
networkBehaviour.NoNetworkRpc();
84+
85+
// Ensure RPC was not invoked locally
86+
yield return null;
87+
Assert.That(networkBehaviour.RpcWasInvoked, Is.False);
88+
89+
var networkManager = gameObject.AddComponent<NetworkManager>();
90+
networkManager.SetSingleton();
91+
92+
LogAssert.Expect(LogType.Error, noNetworkError);
93+
networkBehaviour.NoNetworkRpc();
94+
95+
// Ensure RPC was not invoked locally
96+
yield return null;
97+
Assert.That(networkBehaviour.RpcWasInvoked, Is.False);
98+
99+
Object.DestroyImmediate(gameObject);
100+
}
101+
74102
// Note: in order to repro https://github.com/Unity-Technologies/com.unity.netcode.gameobjects/issues/1078
75103
// this child class must be defined before its parent to assure it is processed first by ILPP
76104
internal class DerivedNetworkBehaviour : EmptyNetworkBehaviour
@@ -79,10 +107,16 @@ internal class DerivedNetworkBehaviour : EmptyNetworkBehaviour
79107

80108
internal class EmptyNetworkBehaviour : NetworkBehaviour
81109
{
110+
}
111+
112+
internal class RpcNetworkBehaviour : NetworkBehaviour
113+
{
114+
public bool RpcWasInvoked;
115+
82116
[Rpc(SendTo.Everyone)]
83117
public void NoNetworkRpc()
84118
{
85-
Debug.Log("No Network Rpc");
119+
RpcWasInvoked = true;
86120
}
87121
}
88122
}

0 commit comments

Comments
 (0)