diff --git a/com.unity.multiplayer.mlapi/Runtime/Core/NetworkManager.cs b/com.unity.multiplayer.mlapi/Runtime/Core/NetworkManager.cs index aac6634178..cea24793ac 100644 --- a/com.unity.multiplayer.mlapi/Runtime/Core/NetworkManager.cs +++ b/com.unity.multiplayer.mlapi/Runtime/Core/NetworkManager.cs @@ -95,6 +95,8 @@ public class NetworkManager : MonoBehaviour, INetworkUpdateSystem, IProfilableTr /// public NetworkSpawnManager SpawnManager { get; private set; } + public CustomMessagingManager CustomMessagingManager { get; private set; } + internal BufferManager BufferManager { get; private set; } // Has to have setter for tests @@ -207,7 +209,7 @@ public ulong LocalClientId #if UNITY_EDITOR internal static bool IsTestRun = false; - + private void OnValidate() { if (NetworkConfig == null) @@ -298,6 +300,8 @@ private void Init(bool server) // Create spawn manager instance SpawnManager = new NetworkSpawnManager(this); + CustomMessagingManager = new CustomMessagingManager(this); + BufferManager = new BufferManager(); if (MessageHandler == null) @@ -700,6 +704,11 @@ public void Shutdown() MessageHandler = null; } + if (CustomMessagingManager != null) + { + CustomMessagingManager = null; + } + //The Transport is set during Init time, thus it is possible for the Transport to be null NetworkConfig?.NetworkTransport?.Shutdown(); } diff --git a/com.unity.multiplayer.mlapi/Runtime/Messaging/CustomMessageManager.cs b/com.unity.multiplayer.mlapi/Runtime/Messaging/CustomMessageManager.cs index 481efe9dde..60e6568887 100644 --- a/com.unity.multiplayer.mlapi/Runtime/Messaging/CustomMessageManager.cs +++ b/com.unity.multiplayer.mlapi/Runtime/Messaging/CustomMessageManager.cs @@ -14,8 +14,15 @@ namespace MLAPI.Messaging /// The manager class to manage custom messages, note that this is different from the NetworkManager custom messages. /// These are named and are much easier to use. /// - public static class CustomMessagingManager + public class CustomMessagingManager { + private NetworkManager m_NetworkManager { get; } + + internal CustomMessagingManager(NetworkManager networkManager) + { + m_NetworkManager = networkManager; + } + #region Unnamed /// @@ -28,9 +35,9 @@ public static class CustomMessagingManager /// /// Event invoked when unnamed messages arrive /// - public static event UnnamedMessageDelegate OnUnnamedMessage; + public event UnnamedMessageDelegate OnUnnamedMessage; - internal static void InvokeUnnamedMessage(ulong clientId, Stream stream) => OnUnnamedMessage?.Invoke(clientId, stream); + internal void InvokeUnnamedMessage(ulong clientId, Stream stream) => OnUnnamedMessage?.Invoke(clientId, stream); /// /// Sends unnamed message to a list of clients @@ -38,9 +45,9 @@ public static class CustomMessagingManager /// The clients to send to, sends to everyone if null /// The message stream containing the data /// The channel to send the data on - public static void SendUnnamedMessage(List clientIds, NetworkBuffer buffer, NetworkChannel networkChannel = NetworkChannel.Internal) + public void SendUnnamedMessage(List clientIds, NetworkBuffer buffer, NetworkChannel networkChannel = NetworkChannel.Internal) { - if (!NetworkManager.Singleton.IsServer) + if (!m_NetworkManager.IsServer) { if (NetworkLog.CurrentLogLevel <= LogLevel.Error) { @@ -60,7 +67,7 @@ public static void SendUnnamedMessage(List clientIds, NetworkBuffer buffe /// The client to send the message to /// The message stream containing the data /// The channel tos end the data on - public static void SendUnnamedMessage(ulong clientId, NetworkBuffer buffer, NetworkChannel networkChannel = NetworkChannel.Internal) + public void SendUnnamedMessage(ulong clientId, NetworkBuffer buffer, NetworkChannel networkChannel = NetworkChannel.Internal) { InternalMessageSender.Send(clientId, NetworkConstants.UNNAMED_MESSAGE, networkChannel, buffer); PerformanceDataManager.Increment(ProfilerConstants.UnnamedMessageSent); @@ -75,12 +82,12 @@ public static void SendUnnamedMessage(ulong clientId, NetworkBuffer buffer, Netw /// public delegate void HandleNamedMessageDelegate(ulong sender, Stream payload); - private static Dictionary s_NamedMessageHandlers32 = new Dictionary(); - private static Dictionary s_NamedMessageHandlers64 = new Dictionary(); + private Dictionary s_NamedMessageHandlers32 = new Dictionary(); + private Dictionary s_NamedMessageHandlers64 = new Dictionary(); - internal static void InvokeNamedMessage(ulong hash, ulong sender, Stream stream) + internal void InvokeNamedMessage(ulong hash, ulong sender, Stream stream) { - if (NetworkManager.Singleton == null) + if (m_NetworkManager == null) { // We dont know what size to use. Try every (more collision prone) if (s_NamedMessageHandlers32.ContainsKey(hash)) @@ -96,7 +103,7 @@ internal static void InvokeNamedMessage(ulong hash, ulong sender, Stream stream) else { // Only check the right size. - switch (NetworkManager.Singleton.NetworkConfig.RpcHashSize) + switch (m_NetworkManager.NetworkConfig.RpcHashSize) { case HashSize.VarIntFourBytes: if (s_NamedMessageHandlers32.ContainsKey(hash)) @@ -119,7 +126,7 @@ internal static void InvokeNamedMessage(ulong hash, ulong sender, Stream stream) /// /// Name of the message. /// The callback to run when a named message is received. - public static void RegisterNamedMessageHandler(string name, HandleNamedMessageDelegate callback) + public void RegisterNamedMessageHandler(string name, HandleNamedMessageDelegate callback) { s_NamedMessageHandlers32[XXHash.Hash32(name)] = callback; s_NamedMessageHandlers64[XXHash.Hash64(name)] = callback; @@ -129,7 +136,7 @@ public static void RegisterNamedMessageHandler(string name, HandleNamedMessageDe /// Unregisters a named message handler. /// /// The name of the message. - public static void UnregisterNamedMessageHandler(string name) + public void UnregisterNamedMessageHandler(string name) { s_NamedMessageHandlers32.Remove(XXHash.Hash32(name)); s_NamedMessageHandlers64.Remove(XXHash.Hash64(name)); @@ -142,10 +149,10 @@ public static void UnregisterNamedMessageHandler(string name) /// The client to send the message to /// The message stream containing the data /// The channel to send the data on - public static void SendNamedMessage(string name, ulong clientId, Stream stream, NetworkChannel networkChannel = NetworkChannel.Internal) + public void SendNamedMessage(string name, ulong clientId, Stream stream, NetworkChannel networkChannel = NetworkChannel.Internal) { ulong hash = 0; - switch (NetworkManager.Singleton.NetworkConfig.RpcHashSize) + switch (m_NetworkManager.NetworkConfig.RpcHashSize) { case HashSize.VarIntFourBytes: hash = XXHash.Hash32(name); @@ -174,10 +181,10 @@ public static void SendNamedMessage(string name, ulong clientId, Stream stream, /// The clients to send to, sends to everyone if null /// The message stream containing the data /// The channel to send the data on - public static void SendNamedMessage(string name, List clientIds, Stream stream, NetworkChannel networkChannel = NetworkChannel.Internal) + public void SendNamedMessage(string name, List clientIds, Stream stream, NetworkChannel networkChannel = NetworkChannel.Internal) { ulong hash = 0; - switch (NetworkManager.Singleton.NetworkConfig.RpcHashSize) + switch (m_NetworkManager.NetworkConfig.RpcHashSize) { case HashSize.VarIntFourBytes: hash = XXHash.Hash32(name); @@ -194,7 +201,7 @@ public static void SendNamedMessage(string name, List clientIds, Stream s messageBuffer.CopyFrom(stream); - if (!NetworkManager.Singleton.IsServer) + if (!m_NetworkManager.IsServer) { if (NetworkLog.CurrentLogLevel <= LogLevel.Error) { diff --git a/com.unity.multiplayer.mlapi/Runtime/Messaging/InternalMessageHandler.cs b/com.unity.multiplayer.mlapi/Runtime/Messaging/InternalMessageHandler.cs index 1f9d6001b4..e69d2e486e 100644 --- a/com.unity.multiplayer.mlapi/Runtime/Messaging/InternalMessageHandler.cs +++ b/com.unity.multiplayer.mlapi/Runtime/Messaging/InternalMessageHandler.cs @@ -557,7 +557,7 @@ public void HandleUnnamedMessage(ulong clientId, Stream stream) #if DEVELOPMENT_BUILD || UNITY_EDITOR s_HandleUnnamedMessage.Begin(); #endif - CustomMessagingManager.InvokeUnnamedMessage(clientId, stream); + NetworkManager.CustomMessagingManager.InvokeUnnamedMessage(clientId, stream); #if DEVELOPMENT_BUILD || UNITY_EDITOR s_HandleUnnamedMessage.End(); #endif @@ -574,7 +574,7 @@ public void HandleNamedMessage(ulong clientId, Stream stream) { ulong hash = reader.ReadUInt64Packed(); - CustomMessagingManager.InvokeNamedMessage(hash, clientId, stream); + NetworkManager.CustomMessagingManager.InvokeNamedMessage(hash, clientId, stream); } #if DEVELOPMENT_BUILD || UNITY_EDITOR s_HandleNamedMessage.End(); diff --git a/com.unity.multiplayer.mlapi/Tests/Editor/NetworkManagerCustomMessageManagerTests.cs b/com.unity.multiplayer.mlapi/Tests/Editor/NetworkManagerCustomMessageManagerTests.cs new file mode 100644 index 0000000000..60a3a36f3d --- /dev/null +++ b/com.unity.multiplayer.mlapi/Tests/Editor/NetworkManagerCustomMessageManagerTests.cs @@ -0,0 +1,40 @@ +using System.Collections.Generic; +using MLAPI.Configuration; +using MLAPI.Messaging; +using NUnit.Framework; +using UnityEngine; +using UnityEngine.SceneManagement; + +namespace MLAPI.EditorTests +{ + public class NetworkManagerCustomMessageManagerTests + { + [Test] + public void CustomMessageManagerAssigned() + { + var gameObject = new GameObject(nameof(CustomMessageManagerAssigned)); + var networkManager = gameObject.AddComponent(); + var transport = gameObject.AddComponent(); + + // MLAPI sets this in validate + networkManager.NetworkConfig = new NetworkConfig() + { + // Set the current scene to prevent unexpected log messages which would trigger a failure + RegisteredScenes = new List() {SceneManager.GetActiveScene().name} + }; + + // Set dummy transport that does nothing + networkManager.NetworkConfig.NetworkTransport = transport; + + CustomMessagingManager preManager = networkManager.CustomMessagingManager; + + // Start server to cause init + networkManager.StartServer(); + + Debug.Assert(preManager == null); + Debug.Assert(networkManager.CustomMessagingManager != null); + + Object.DestroyImmediate(gameObject); + } + } +} diff --git a/com.unity.multiplayer.mlapi/Tests/Editor/NetworkManagerCustomMessageManagerTests.cs.meta b/com.unity.multiplayer.mlapi/Tests/Editor/NetworkManagerCustomMessageManagerTests.cs.meta new file mode 100644 index 0000000000..a25df43a27 --- /dev/null +++ b/com.unity.multiplayer.mlapi/Tests/Editor/NetworkManagerCustomMessageManagerTests.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 315ffe39806441839400d21871d566a0 +timeCreated: 1618478909 \ No newline at end of file