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