Skip to content
Merged
Show file tree
Hide file tree
Changes from 4 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions com.unity.netcode.gameobjects/CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ Additional documentation and release notes are available at [Multiplayer Documen
- Added `NetworkTimeSystem.TickLatency` property that provides the average latency of a client. (#3337)
- Added `FastBufferReader(ArraySegment<byte> buffer, Allocator copyAllocator)` constructor that uses the `ArraySegment.Offset` as the `FastBufferReader` offset and the `ArraySegment.Count` as the `FastBufferReader` length. (#3321)
- Added `FastBufferReader(ArraySegment<byte> buffer, Allocator copyAllocator, int length = -1)` constructor that uses the `ArraySegment.Offset` as the `FastBufferReader` offset. (#3321)
- Added `NetworkManager.OnPreShutdown` which is called before the NetworkManager cleans up and shuts down. (#3366)

### Fixed

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -807,6 +807,12 @@ public struct ConnectionApprovalRequest
/// </summary>
public event Action OnClientStarted = null;

/// <summary>
/// Subscribe to this event to get notifications before a <see cref="NetworkManager"/> instance is being destroyed.
/// This is useful if you want to use the state of anything the NetworkManager cleans up during its shutdown.
/// </summary>
public event Action OnPreShutdown = null;

/// <summary>
/// This callback is invoked once the local server is stopped.
/// </summary>
Expand Down Expand Up @@ -1481,6 +1487,8 @@ internal void ShutdownInternal()
NetworkLog.LogInfo(nameof(ShutdownInternal));
}

OnPreShutdown?.Invoke();

this.UnregisterAllNetworkUpdates();

// Everything is shutdown in the order of their dependencies
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -236,6 +236,46 @@ public IEnumerator OnClientAndServerStartedCalledWhenHostStarts()
Assert.AreEqual(2, callbacksInvoked, "either OnServerStarted or OnClientStarted wasn't invoked");
}

[UnityTest]
public IEnumerator OnPreShutdownCalledWhenShuttingDown()
{
bool preShutdownInvoked = false;
bool shutdownInvoked = false;
var gameObject = new GameObject(nameof(OnPreShutdownCalledWhenShuttingDown));
m_ServerManager = gameObject.AddComponent<NetworkManager>();

// Set dummy transport that does nothing
var transport = gameObject.AddComponent<DummyTransport>();
m_ServerManager.NetworkConfig = new NetworkConfig() { NetworkTransport = transport };

Action onPreShutdown = () =>
{
preShutdownInvoked = true;
Assert.IsFalse(shutdownInvoked, "OnPreShutdown was invoked after OnServerStopped");
};

Action<bool> onServerStopped = (bool wasAlsoClient) =>
{
shutdownInvoked = true;
Assert.IsTrue(preShutdownInvoked, "OnPreShutdown wasn't invoked before OnServerStopped");
};

// Start server to cause initialization process
Assert.True(m_ServerManager.StartServer());
Assert.True(m_ServerManager.IsListening);

m_ServerManager.OnPreShutdown += onPreShutdown;
m_ServerManager.OnServerStopped += onServerStopped;
m_ServerManager.Shutdown();
Object.DestroyImmediate(gameObject);

yield return WaitUntilManagerShutsdown();

Assert.False(m_ServerManager.IsListening);
Assert.True(preShutdownInvoked, "OnPreShutdown wasn't invoked");
Assert.True(shutdownInvoked, "OnServerStopped wasn't invoked");
}

private IEnumerator WaitUntilManagerShutsdown()
{
/* Need two updates to actually shut down. First one to see the transport failing, which
Expand Down