diff --git a/com.unity.multiplayer.mlapi/Tests/Runtime/MultiInstance/MultiInstanceHelpers.cs b/com.unity.multiplayer.mlapi/Tests/Runtime/MultiInstance/MultiInstanceHelpers.cs index 55d2979405..bf0a78fee3 100644 --- a/com.unity.multiplayer.mlapi/Tests/Runtime/MultiInstance/MultiInstanceHelpers.cs +++ b/com.unity.multiplayer.mlapi/Tests/Runtime/MultiInstance/MultiInstanceHelpers.cs @@ -15,8 +15,9 @@ namespace MLAPI.RuntimeTests /// public static class MultiInstanceHelpers { - - public static List NetworkManagerInstances = new List(); + private static List s_NetworkManagerInstances = new List(); + private static bool s_IsStarted; + private static int s_ClientCount; /// /// Creates NetworkingManagers and configures them for use in a multi instance setting. @@ -26,7 +27,7 @@ public static class MultiInstanceHelpers /// The clients NetworkManagers public static bool Create(int clientCount, out NetworkManager server, out NetworkManager[] clients) { - NetworkManagerInstances = new List(); + s_NetworkManagerInstances = new List(); CreateNewClients(clientCount, out clients); @@ -36,7 +37,7 @@ public static bool Create(int clientCount, out NetworkManager server, out Networ // Create networkManager component server = go.AddComponent(); - NetworkManagerInstances.Insert(0, server); + s_NetworkManagerInstances.Insert(0, server); // Set the NetworkConfig server.NetworkConfig = new NetworkConfig() @@ -78,7 +79,7 @@ public static bool CreateNewClients(int clientCount, out NetworkManager[] client }; } - NetworkManagerInstances.AddRange(clients); + s_NetworkManagerInstances.AddRange(clients); return true; } @@ -90,7 +91,7 @@ public static void StopOneClient(NetworkManager clientToStop) { clientToStop.StopClient(); Object.Destroy(clientToStop.gameObject); - NetworkManagerInstances.Remove(clientToStop); + s_NetworkManagerInstances.Remove(clientToStop); } /// @@ -99,8 +100,15 @@ public static void StopOneClient(NetworkManager clientToStop) /// public static void Destroy() { + if (!s_IsStarted) + { + throw new InvalidOperationException("MultiInstanceHelper is not started"); + } + + s_IsStarted = false; + // Shutdown the server which forces clients to disconnect - foreach (var networkManager in NetworkManagerInstances) + foreach (var networkManager in s_NetworkManagerInstances) { if (networkManager.IsServer) { @@ -109,12 +117,12 @@ public static void Destroy() } // Destroy the network manager instances - foreach (var networkManager in NetworkManagerInstances) + foreach (var networkManager in s_NetworkManagerInstances) { Object.Destroy(networkManager.gameObject); } - NetworkManagerInstances.Clear(); + s_NetworkManagerInstances.Clear(); // Destroy the temporary GameObject used to run co-routines if (s_CoroutineRunner != null) @@ -131,6 +139,14 @@ public static void Destroy() /// The Clients NetworkManager public static bool Start(bool host, NetworkManager server, NetworkManager[] clients) { + if (s_IsStarted) + { + throw new InvalidOperationException("MultiInstanceHelper already started. Did you forget to Destroy?"); + } + + s_IsStarted = true; + s_ClientCount = clients.Length; + if (host) { server.StartHost(); @@ -198,6 +214,32 @@ public static void MakeNetworkedObjectTestPrefab(NetworkObject networkObject, ui networkObject.IsSceneObject = false; } + // We use GameObject instead of SceneObject to be able to keep hierarchy + public static void MarkAsSceneObjectRoot(GameObject networkObjectRoot, NetworkManager server, NetworkManager[] clients) + { + networkObjectRoot.name += " - Server"; + + NetworkObject[] serverNetworkObjects = networkObjectRoot.GetComponentsInChildren(); + + for (int i = 0; i < serverNetworkObjects.Length; i++) + { + serverNetworkObjects[i].NetworkManagerOwner = server; + } + + for (int i = 0; i < clients.Length; i++) + { + GameObject root = Object.Instantiate(networkObjectRoot); + root.name += " - Client - " + i; + + NetworkObject[] clientNetworkObjects = root.GetComponentsInChildren(); + + for (int j = 0; j < clientNetworkObjects.Length; j++) + { + clientNetworkObjects[j].NetworkManagerOwner = clients[i]; + } + } + } + /// /// Waits on the client side to be connected. /// @@ -269,7 +311,7 @@ public static IEnumerator WaitForClientsConnected(NetworkManager[] clients, Coro /// The max frames to wait for public static IEnumerator WaitForClientConnectedToServer(NetworkManager server, CoroutineResultWrapper result = null, int maxFrames = 64) { - yield return WaitForClientsConnectedToServer(server, server.IsHost ? 2 : 1, result, maxFrames); + yield return WaitForClientsConnectedToServer(server, server.IsHost ? s_ClientCount + 1 : s_ClientCount, result, maxFrames); } ///