Skip to content
Merged
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
Original file line number Diff line number Diff line change
Expand Up @@ -15,8 +15,9 @@ namespace MLAPI.RuntimeTests
/// </summary>
public static class MultiInstanceHelpers
{

public static List<NetworkManager> NetworkManagerInstances = new List<NetworkManager>();
private static List<NetworkManager> s_NetworkManagerInstances = new List<NetworkManager>();
private static bool s_IsStarted;
private static int s_ClientCount;

/// <summary>
/// Creates NetworkingManagers and configures them for use in a multi instance setting.
Expand All @@ -26,7 +27,7 @@ public static class MultiInstanceHelpers
/// <param name="clients">The clients NetworkManagers</param>
public static bool Create(int clientCount, out NetworkManager server, out NetworkManager[] clients)
{
NetworkManagerInstances = new List<NetworkManager>();
s_NetworkManagerInstances = new List<NetworkManager>();

CreateNewClients(clientCount, out clients);

Expand All @@ -36,7 +37,7 @@ public static bool Create(int clientCount, out NetworkManager server, out Networ

// Create networkManager component
server = go.AddComponent<NetworkManager>();
NetworkManagerInstances.Insert(0, server);
s_NetworkManagerInstances.Insert(0, server);

// Set the NetworkConfig
server.NetworkConfig = new NetworkConfig()
Expand Down Expand Up @@ -78,7 +79,7 @@ public static bool CreateNewClients(int clientCount, out NetworkManager[] client
};
}

NetworkManagerInstances.AddRange(clients);
s_NetworkManagerInstances.AddRange(clients);
return true;
}

Expand All @@ -90,7 +91,7 @@ public static void StopOneClient(NetworkManager clientToStop)
{
clientToStop.StopClient();
Object.Destroy(clientToStop.gameObject);
NetworkManagerInstances.Remove(clientToStop);
s_NetworkManagerInstances.Remove(clientToStop);
}

/// <summary>
Expand All @@ -99,8 +100,15 @@ public static void StopOneClient(NetworkManager clientToStop)
/// </summary>
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)
{
Expand All @@ -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)
Expand All @@ -131,6 +139,14 @@ public static void Destroy()
/// <param name="clients">The Clients NetworkManager</param>
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();
Expand Down Expand Up @@ -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<NetworkObject>();

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<NetworkObject>();

for (int j = 0; j < clientNetworkObjects.Length; j++)
{
clientNetworkObjects[j].NetworkManagerOwner = clients[i];
}
}
}

/// <summary>
/// Waits on the client side to be connected.
/// </summary>
Expand Down Expand Up @@ -269,7 +311,7 @@ public static IEnumerator WaitForClientsConnected(NetworkManager[] clients, Coro
/// <param name="maxFrames">The max frames to wait for</param>
public static IEnumerator WaitForClientConnectedToServer(NetworkManager server, CoroutineResultWrapper<bool> 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);
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Nice

}

/// <summary>
Expand Down