Skip to content

Commit ad9aafe

Browse files
Merge branch 'develop-2.0.0' into chore/findobjectsbytype-no-more-sorting-update
2 parents 8cf8de6 + 8ba35cd commit ad9aafe

File tree

5 files changed

+83
-15
lines changed

5 files changed

+83
-15
lines changed

com.unity.netcode.gameobjects/CHANGELOG.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ Additional documentation and release notes are available at [Multiplayer Documen
1010

1111
### Added
1212

13+
- The `NetworkMetricsPipelineStage` for Unity Transport is now part of the public API. This allows using it in custom implementations of `INetworkStreamDriverConstructor` that want to maintain compatibility with the multiplayer tools package. (#3853)
1314
- Added stricter checks on `InSpawned` within `NetworkObject`. (#3831)
1415
- Added a new `InvalidOperation` status to `OwnershipRequestStatus`. (#3831)
1516

@@ -29,6 +30,7 @@ Additional documentation and release notes are available at [Multiplayer Documen
2930

3031
### Fixed
3132

33+
- Prevented a `NullReferenceException` in `UnityTransport` when using a custom `INetworkStreamDriverConstructor` that doesn't use all the default pipelines and the multiplayer tools package is installed. (#3853)
3234
- Duplicate transport connection events for the same connection will now do nothing. (#3863)
3335
- Fixed memory leak in `NetworkAnimator` on clients where `RpcTarget` groups were not being properly disposed due to incorrect type casting of `ProxyRpcTargetGroup` to `RpcTargetGroup`.
3436
- Fixed issue when using a client-server topology where a `NetworkList` with owner write permissions was resetting sent time and dirty flags after having been spawned on owning clients that were not the spawn authority. (#3850)

com.unity.netcode.gameobjects/Runtime/Transports/UTP/INetworkStreamDriverConstructor.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,8 @@ namespace Unity.Netcode.Transports.UTP
3636
/// var settings = transport.GetDefaultNetworkSettings();
3737
/// driver = NetworkDriver.Create(new IPCNetworkInterface(), settings);
3838
///
39+
/// driver.RegisterPipelineStage(new NetworkMetricsPipelineStage());
40+
///
3941
/// transport.GetDefaultPipelineConfigurations(
4042
/// out var unreliableFragmentedPipelineStages,
4143
/// out var unreliableSequencedFragmentedPipelineStages,

com.unity.netcode.gameobjects/Runtime/Transports/UTP/NetworkMetricsPipelineStage.cs

Lines changed: 13 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -7,27 +7,32 @@
77

88
namespace Unity.Netcode.Transports.UTP
99
{
10+
/// <summary>
11+
/// A pipeline stage that tracks some internal metrics that are then used by the multiplayer
12+
/// tools package. This should only be used when creating a custom <see cref="NetworkDriver"/>
13+
/// with <see cref="INetworkStreamDriverConstructor"/> if compatibility with the multiplayer
14+
/// tools package is desired. In that situation, this stage needs to be registered with the
15+
/// constructed driver with <see cref="NetworkDriver.RegisterPipelineStage{T}"/>.
16+
/// </summary>
1017
[BurstCompile]
11-
internal unsafe struct NetworkMetricsPipelineStage : INetworkPipelineStage
18+
public unsafe struct NetworkMetricsPipelineStage : INetworkPipelineStage
1219
{
13-
private static TransportFunctionPointer<NetworkPipelineStage.ReceiveDelegate> s_ReceiveFunction = new TransportFunctionPointer<NetworkPipelineStage.ReceiveDelegate>(Receive);
14-
private static TransportFunctionPointer<NetworkPipelineStage.SendDelegate> s_SendFunction = new TransportFunctionPointer<NetworkPipelineStage.SendDelegate>(Send);
15-
private static TransportFunctionPointer<NetworkPipelineStage.InitializeConnectionDelegate> s_InitializeConnectionFunction = new TransportFunctionPointer<NetworkPipelineStage.InitializeConnectionDelegate>(InitializeConnection);
16-
20+
/// <inheritdoc/>
1721
public NetworkPipelineStage StaticInitialize(byte* staticInstanceBuffer,
1822
int staticInstanceBufferLength,
1923
NetworkSettings settings)
2024
{
2125
return new NetworkPipelineStage(
22-
s_ReceiveFunction,
23-
s_SendFunction,
24-
s_InitializeConnectionFunction,
26+
new TransportFunctionPointer<NetworkPipelineStage.ReceiveDelegate>(Receive),
27+
new TransportFunctionPointer<NetworkPipelineStage.SendDelegate>(Send),
28+
new TransportFunctionPointer<NetworkPipelineStage.InitializeConnectionDelegate>(InitializeConnection),
2529
ReceiveCapacity: 0,
2630
SendCapacity: 0,
2731
HeaderCapacity: 0,
2832
SharedStateCapacity: UnsafeUtility.SizeOf<NetworkMetricsContext>());
2933
}
3034

35+
/// <inheritdoc/>
3136
public int StaticSize => 0;
3237

3338
[BurstCompile(DisableDirectCall = true)]

com.unity.netcode.gameobjects/Runtime/Transports/UTP/UnityTransport.cs

Lines changed: 24 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1234,13 +1234,30 @@ private void ExtractNetworkMetricsFromPipeline(NetworkPipeline pipeline, Network
12341234
return;
12351235
}
12361236

1237-
//Don't need to dispose of the buffers, they are filled with data pointers.
1238-
m_Driver.GetPipelineBuffers(pipeline,
1239-
NetworkPipelineStageId.Get<NetworkMetricsPipelineStage>(),
1240-
networkConnection,
1241-
out _,
1242-
out _,
1243-
out var sharedBuffer);
1237+
var sharedBuffer = default(NativeArray<byte>);
1238+
1239+
try
1240+
{
1241+
// Don't need to dispose of the buffers, they are filled with data pointers.
1242+
m_Driver.GetPipelineBuffers(pipeline,
1243+
NetworkPipelineStageId.Get<NetworkMetricsPipelineStage>(),
1244+
networkConnection,
1245+
out _,
1246+
out _,
1247+
out sharedBuffer);
1248+
}
1249+
catch (InvalidOperationException)
1250+
{
1251+
// Can happen if using a custom driver that isn't configured with the metrics stage.
1252+
return;
1253+
}
1254+
1255+
// That InvalidOperationException above is only thrown in the editor. In runtime builds
1256+
// we instead get default return values when the pipeline stage is invalid.
1257+
if (sharedBuffer == default)
1258+
{
1259+
return;
1260+
}
12441261

12451262
unsafe
12461263
{

com.unity.netcode.gameobjects/Tests/Editor/Transports/UnityTransportTests.cs

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
using NUnit.Framework;
22
using Unity.Netcode.Transports.UTP;
3+
using Unity.Networking.Transport;
34
using UnityEngine;
45
using UnityEngine.TestTools;
56

@@ -229,5 +230,46 @@ public void UnityTransport_HostnameValidation((string, bool) testCase)
229230
transport.Shutdown();
230231
}
231232
#endif
233+
234+
private class IPCDriverConstructor : INetworkStreamDriverConstructor
235+
{
236+
public void CreateDriver(
237+
UnityTransport transport,
238+
out NetworkDriver driver,
239+
out NetworkPipeline unreliableFragmentedPipeline,
240+
out NetworkPipeline unreliableSequencedFragmentedPipeline,
241+
out NetworkPipeline reliableSequencedPipeline)
242+
{
243+
var settings = transport.GetDefaultNetworkSettings();
244+
driver = NetworkDriver.Create(new IPCNetworkInterface(), settings);
245+
246+
#if MULTIPLAYER_TOOLS
247+
driver.RegisterPipelineStage(new NetworkMetricsPipelineStage());
248+
#endif
249+
250+
transport.GetDefaultPipelineConfigurations(
251+
out var unreliableFragmentedPipelineStages,
252+
out var unreliableSequencedFragmentedPipelineStages,
253+
out var reliableSequencedPipelineStages);
254+
255+
unreliableFragmentedPipeline = driver.CreatePipeline(unreliableFragmentedPipelineStages);
256+
unreliableSequencedFragmentedPipeline = driver.CreatePipeline(unreliableSequencedFragmentedPipelineStages);
257+
reliableSequencedPipeline = driver.CreatePipeline(reliableSequencedPipelineStages);
258+
}
259+
}
260+
261+
[Test]
262+
public void UnityTransport_CustomDriverConstructorWithDefaultPipelines()
263+
{
264+
UnityTransport transport = new GameObject().AddComponent<UnityTransport>();
265+
UnityTransport.s_DriverConstructor = new IPCDriverConstructor();
266+
transport.Initialize();
267+
268+
Assert.True(transport.StartServer());
269+
270+
transport.Shutdown();
271+
272+
UnityTransport.s_DriverConstructor = null;
273+
}
232274
}
233275
}

0 commit comments

Comments
 (0)