Skip to content

fix: [NGOv2.x] Add OnPreShutdown to NetworkManager #3366

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 5 commits into from
Mar 29, 2025
Merged
Show file tree
Hide file tree
Changes from all 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 @@ -10,6 +10,7 @@ Additional documentation and release notes are available at [Multiplayer Documen

### Added

- Added `NetworkManager.OnPreShutdown` which is called before the NetworkManager cleans up and shuts down. (#3366)
- Added interpolator types as an inspector view selection for position, rotation, and scale. (#3337)
- Added a new smooth dampening interpolator type that provides a nice balance between precision and smoothing results. (#3337)
- Added `NetworkTimeSystem.TickLatency` property that provides the average latency of a client. (#3337)
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