Skip to content

Commit 1bbe95f

Browse files
authored
refactor!: Unified Shutdown (#1108)
BREAKING CHANGE: NetworkManager.StopX is replaced with NetworkManager.Shutdown
1 parent 5ed41b9 commit 1bbe95f

File tree

14 files changed

+141
-164
lines changed

14 files changed

+141
-164
lines changed

com.unity.netcode.gameobjects/Editor/NetworkManagerEditor.cs

Lines changed: 1 addition & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -352,18 +352,7 @@ public override void OnInspectorGUI()
352352

353353
if (GUILayout.Button(new GUIContent("Stop " + instanceType, "Stops the " + instanceType + " instance.")))
354354
{
355-
if (m_NetworkManager.IsHost)
356-
{
357-
m_NetworkManager.StopHost();
358-
}
359-
else if (m_NetworkManager.IsServer)
360-
{
361-
m_NetworkManager.StopServer();
362-
}
363-
else if (m_NetworkManager.IsClient)
364-
{
365-
m_NetworkManager.StopClient();
366-
}
355+
m_NetworkManager.Shutdown();
367356
}
368357
}
369358
}

com.unity.netcode.gameobjects/Runtime/Core/NetworkManager.cs

Lines changed: 59 additions & 92 deletions
Original file line numberDiff line numberDiff line change
@@ -724,94 +724,6 @@ public SocketTasks StartClient()
724724
return socketTasks;
725725
}
726726

727-
/// <summary>
728-
/// Stops the running server
729-
/// </summary>
730-
public void StopServer()
731-
{
732-
if (NetworkLog.CurrentLogLevel <= LogLevel.Developer)
733-
{
734-
NetworkLog.LogInfo(nameof(StopServer));
735-
}
736-
737-
var disconnectedIds = new HashSet<ulong>();
738-
739-
//Don't know if I have to disconnect the clients. I'm assuming the NetworkTransport does all the cleaning on shtudown. But this way the clients get a disconnect message from server (so long it does't get lost)
740-
741-
// make sure all messages are flushed before transport disconnect clients
742-
if (MessageQueueContainer != null)
743-
{
744-
MessageQueueContainer.ProcessAndFlushMessageQueue(
745-
queueType: MessageQueueContainer.MessageQueueProcessingTypes.Send,
746-
NetworkUpdateStage.PostLateUpdate); // flushing messages in case transport's disconnect
747-
}
748-
749-
foreach (KeyValuePair<ulong, NetworkClient> pair in ConnectedClients)
750-
{
751-
if (!disconnectedIds.Contains(pair.Key))
752-
{
753-
disconnectedIds.Add(pair.Key);
754-
755-
if (pair.Key == NetworkConfig.NetworkTransport.ServerClientId)
756-
{
757-
continue;
758-
}
759-
760-
NetworkConfig.NetworkTransport.DisconnectRemoteClient(pair.Key);
761-
}
762-
}
763-
764-
foreach (KeyValuePair<ulong, PendingClient> pair in PendingClients)
765-
{
766-
if (!disconnectedIds.Contains(pair.Key))
767-
{
768-
disconnectedIds.Add(pair.Key);
769-
if (pair.Key == NetworkConfig.NetworkTransport.ServerClientId)
770-
{
771-
continue;
772-
}
773-
774-
NetworkConfig.NetworkTransport.DisconnectRemoteClient(pair.Key);
775-
}
776-
}
777-
778-
IsServer = false;
779-
Shutdown();
780-
}
781-
782-
/// <summary>
783-
/// Stops the running host
784-
/// </summary>
785-
public void StopHost()
786-
{
787-
if (NetworkLog.CurrentLogLevel <= LogLevel.Developer)
788-
{
789-
NetworkLog.LogInfo(nameof(StopHost));
790-
}
791-
792-
IsServer = false;
793-
IsClient = false;
794-
StopServer();
795-
796-
//We don't stop client since we dont actually have a transport connection to our own host. We just handle host messages directly in the netcode
797-
}
798-
799-
/// <summary>
800-
/// Stops the running client
801-
/// </summary>
802-
public void StopClient()
803-
{
804-
if (NetworkLog.CurrentLogLevel <= LogLevel.Developer)
805-
{
806-
NetworkLog.LogInfo(nameof(StopClient));
807-
}
808-
809-
IsClient = false;
810-
NetworkConfig.NetworkTransport.DisconnectLocalClient();
811-
IsConnectedClient = false;
812-
Shutdown();
813-
}
814-
815727
/// <summary>
816728
/// Starts a Host
817729
/// </summary>
@@ -940,13 +852,71 @@ private void OnDestroy()
940852
}
941853
}
942854

855+
/// <summary>
856+
/// Globally shuts down the library.
857+
/// Disconnects clients if connected and stops server if running.
858+
/// </summary>
943859
public void Shutdown()
944860
{
945861
if (NetworkLog.CurrentLogLevel <= LogLevel.Developer)
946862
{
947863
NetworkLog.LogInfo(nameof(Shutdown));
948864
}
949865

866+
if (IsServer)
867+
{
868+
// make sure all messages are flushed before transport disconnect clients
869+
if (MessageQueueContainer != null)
870+
{
871+
MessageQueueContainer.ProcessAndFlushMessageQueue(
872+
queueType: MessageQueueContainer.MessageQueueProcessingTypes.Send,
873+
NetworkUpdateStage.PostLateUpdate); // flushing messages in case transport's disconnect
874+
}
875+
876+
var disconnectedIds = new HashSet<ulong>();
877+
878+
//Don't know if I have to disconnect the clients. I'm assuming the NetworkTransport does all the cleaning on shutdown. But this way the clients get a disconnect message from server (so long it does't get lost)
879+
880+
foreach (KeyValuePair<ulong, NetworkClient> pair in ConnectedClients)
881+
{
882+
if (!disconnectedIds.Contains(pair.Key))
883+
{
884+
disconnectedIds.Add(pair.Key);
885+
886+
if (pair.Key == NetworkConfig.NetworkTransport.ServerClientId)
887+
{
888+
continue;
889+
}
890+
891+
NetworkConfig.NetworkTransport.DisconnectRemoteClient(pair.Key);
892+
}
893+
}
894+
895+
foreach (KeyValuePair<ulong, PendingClient> pair in PendingClients)
896+
{
897+
if (!disconnectedIds.Contains(pair.Key))
898+
{
899+
disconnectedIds.Add(pair.Key);
900+
if (pair.Key == NetworkConfig.NetworkTransport.ServerClientId)
901+
{
902+
continue;
903+
}
904+
905+
NetworkConfig.NetworkTransport.DisconnectRemoteClient(pair.Key);
906+
}
907+
}
908+
}
909+
910+
if (IsClient)
911+
{
912+
// Client only, send disconnect to server
913+
NetworkConfig.NetworkTransport.DisconnectLocalClient();
914+
}
915+
916+
IsConnectedClient = false;
917+
IsServer = false;
918+
IsClient = false;
919+
950920
// Unregister INetworkUpdateSystem before shutting down the MessageQueueContainer
951921
this.UnregisterAllNetworkUpdates();
952922

@@ -969,8 +939,6 @@ public void Shutdown()
969939
NetworkTickSystem = null;
970940
}
971941

972-
IsServer = false;
973-
IsClient = false;
974942
NetworkConfig.NetworkTransport.OnTransportEvent -= HandleRawTransportPoll;
975943

976944
if (SpawnManager != null)
@@ -1201,8 +1169,7 @@ private void HandleRawTransportPoll(NetworkEvent networkEvent, ulong clientId, N
12011169
}
12021170
else
12031171
{
1204-
IsConnectedClient = false;
1205-
StopClient();
1172+
Shutdown();
12061173
}
12071174

12081175
OnClientDisconnectCallback?.Invoke(clientId);

com.unity.netcode.gameobjects/Runtime/Transports/Tests/Editor/TransportTest.cs

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,6 @@ public void UNetCustomChannelRegistrationTest()
4747
Assert.Fail("The UNet transport won't allow registration of a legit user channel");
4848
}
4949

50-
nm.StopServer();
5150
nm.Shutdown();
5251

5352
ut.Channels.Clear();
@@ -64,7 +63,6 @@ public void UNetCustomChannelRegistrationTest()
6463
Debug.Log(ex.Message);
6564
}
6665

67-
nm.StopServer();
6866
nm.Shutdown();
6967
}
7068
}

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -108,7 +108,7 @@ public void MessageHandlerReceivedMessageServerClient()
108108
networkManager.HandleIncomingData(0, NetworkChannel.Internal, new ArraySegment<byte>(messageStream10.GetBuffer(), 0, (int)messageStream10.Length), 0);
109109

110110
// Stop server to trigger full shutdown
111-
networkManager.StopServer();
111+
networkManager.Shutdown();
112112

113113
// Replace the real message handler with a dummy one that just prints a result
114114
networkManager.MessageHandler = new DummyMessageHandler(networkManager);
@@ -196,7 +196,7 @@ public void MessageHandlerReceivedMessageServerClient()
196196
networkManager.HandleIncomingData(0, NetworkChannel.Internal, new ArraySegment<byte>(messageStream21.GetBuffer(), 0, (int)messageStream21.Length), 0);
197197

198198
// Full cleanup
199-
networkManager.StopClient();
199+
networkManager.Shutdown();
200200

201201
// Ensure no missmatches with expectations
202202
LogAssert.NoUnexpectedReceived();
Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
using NUnit.Framework;
2+
using UnityEngine;
3+
4+
namespace Unity.Netcode.EditorTests
5+
{
6+
public class StartStopTests
7+
{
8+
private NetworkManager m_NetworkManager;
9+
10+
[SetUp]
11+
public void Setup()
12+
{
13+
// Create the reusable NetworkManager
14+
m_NetworkManager = new GameObject(nameof(NetworkManager)).AddComponent<NetworkManager>();
15+
var transport = m_NetworkManager.gameObject.AddComponent<DummyTransport>();
16+
17+
m_NetworkManager.NetworkConfig = new NetworkConfig()
18+
{
19+
NetworkTransport = transport
20+
};
21+
}
22+
23+
[Test]
24+
public void TestStopAndRestartForExceptions()
25+
{
26+
m_NetworkManager.StartServer();
27+
m_NetworkManager.Shutdown();
28+
m_NetworkManager.StartServer();
29+
m_NetworkManager.Shutdown();
30+
}
31+
32+
[Test]
33+
public void TestStartupServerState()
34+
{
35+
m_NetworkManager.StartServer();
36+
37+
Assert.True(m_NetworkManager.IsServer);
38+
Assert.False(m_NetworkManager.IsClient);
39+
Assert.False(m_NetworkManager.IsHost);
40+
41+
m_NetworkManager.Shutdown();
42+
}
43+
44+
[Test]
45+
public void TestFlagShutdown()
46+
{
47+
m_NetworkManager.StartServer();
48+
m_NetworkManager.Shutdown();
49+
50+
Assert.False(m_NetworkManager.IsServer);
51+
Assert.False(m_NetworkManager.IsClient);
52+
Assert.False(m_NetworkManager.IsHost);
53+
}
54+
55+
[TearDown]
56+
public void Teardown()
57+
{
58+
// Cleanup
59+
Object.DestroyImmediate(m_NetworkManager.gameObject);
60+
}
61+
}
62+
}

com.unity.netcode.gameobjects/Tests/Editor/StartStopTests.cs.meta

Lines changed: 3 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

com.unity.netcode.gameobjects/Tests/Runtime/Helpers/NetworkManagerHelper.cs

Lines changed: 1 addition & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -198,27 +198,7 @@ private static void StartNetworkManagerMode(NetworkManagerOperatingMode managerM
198198
/// </summary>
199199
private static void StopNetworkManagerMode()
200200
{
201-
switch (CurrentNetworkManagerMode)
202-
{
203-
case NetworkManagerOperatingMode.Host:
204-
{
205-
// Stop the host
206-
NetworkManagerObject.StopHost();
207-
break;
208-
}
209-
case NetworkManagerOperatingMode.Server:
210-
{
211-
// Stop the server
212-
NetworkManagerObject.StopServer();
213-
break;
214-
}
215-
case NetworkManagerOperatingMode.Client:
216-
{
217-
// Stop the client
218-
NetworkManagerObject.StopClient();
219-
break;
220-
}
221-
}
201+
NetworkManagerObject.Shutdown();
222202

223203
Debug.Log($"{CurrentNetworkManagerMode} stopped.");
224204
CurrentNetworkManagerMode = NetworkManagerOperatingMode.None;

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

Lines changed: 2 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,7 @@ public static bool CreateNewClients(int clientCount, out NetworkManager[] client
8888
/// <param name="clientToStop"></param>
8989
public static void StopOneClient(NetworkManager clientToStop)
9090
{
91-
clientToStop.StopClient();
91+
clientToStop.Shutdown();
9292
Object.Destroy(clientToStop.gameObject);
9393
NetworkManagerInstances.Remove(clientToStop);
9494
}
@@ -109,18 +109,7 @@ public static void Destroy()
109109
// Shutdown the server which forces clients to disconnect
110110
foreach (var networkManager in NetworkManagerInstances)
111111
{
112-
if (networkManager.IsHost)
113-
{
114-
networkManager.StopHost();
115-
}
116-
else if (networkManager.IsServer)
117-
{
118-
networkManager.StopServer();
119-
}
120-
else if (networkManager.IsClient)
121-
{
122-
networkManager.StopClient();
123-
}
112+
networkManager.Shutdown();
124113
}
125114

126115
// Destroy the network manager instances

testproject/Assets/Scripts/ExitButtonScript.cs

Lines changed: 1 addition & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -14,18 +14,7 @@ public void OnExitScene()
1414
{
1515
if (NetworkManager.Singleton)
1616
{
17-
if (NetworkManager.Singleton.IsHost)
18-
{
19-
NetworkManager.Singleton.StopHost();
20-
}
21-
else if (NetworkManager.Singleton.IsClient)
22-
{
23-
NetworkManager.Singleton.StopClient();
24-
}
25-
else if (NetworkManager.Singleton.IsServer)
26-
{
27-
NetworkManager.Singleton.StopServer();
28-
}
17+
NetworkManager.Singleton.Shutdown();
2918
Destroy(NetworkManager.Singleton.gameObject);
3019
}
3120

testproject/Assets/Tests/Runtime/DontDestroyOnLoadTests.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -59,10 +59,10 @@ public IEnumerator Setup()
5959
[UnityTearDown]
6060
public IEnumerator Teardown()
6161
{
62-
m_ServerNetworkManager.StopHost();
62+
m_ServerNetworkManager.Shutdown();
6363
foreach (var networkManager in m_ClientNetworkManagers)
6464
{
65-
networkManager.StopClient();
65+
networkManager.Shutdown();
6666
}
6767
int nextFrameNumber = Time.frameCount + 4;
6868
yield return new WaitUntil(() => Time.frameCount >= nextFrameNumber);

0 commit comments

Comments
 (0)