Skip to content

Commit c9c6f98

Browse files
committed
Creating NetworkedMessageChannel
1 parent 3698f17 commit c9c6f98

File tree

3 files changed

+80
-0
lines changed

3 files changed

+80
-0
lines changed

Assets/BossRoom/Scripts/Shared/Infrastructure/PubSub/MessageChannelDIExtensions.cs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,10 @@ public static void BindMessageChannelInstance<TMessage>(this DIScope scope)
66
{
77
scope.BindInstanceAsSingle<MessageChannel<TMessage>, IPublisher<TMessage>, ISubscriber<TMessage>, IMessageChannel<TMessage>>(new MessageChannel<TMessage>());
88
}
9+
public static void BindNetworkedMessageChannelInstance<TMessage>(this DIScope scope, string name, int bufferSize) where TMessage : unmanaged
10+
{
11+
scope.BindInstanceAsSingle<NetworkedMessageChannel<TMessage>, IPublisher<TMessage>, ISubscriber<TMessage>, IMessageChannel<TMessage>>(new NetworkedMessageChannel<TMessage>(name, bufferSize));
12+
}
913

1014
public static void BindBufferedMessageChannelInstance<TMessage>(this DIScope scope)
1115
{
Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
using System;
2+
using Unity.Collections;
3+
using Unity.Netcode;
4+
using UnityEngine;
5+
6+
namespace Unity.Multiplayer.Samples.BossRoom.Shared.Infrastructure
7+
{
8+
public class NetworkedMessageChannel<T> : MessageChannel<T> where T : unmanaged
9+
{
10+
string m_Name;
11+
12+
int m_BufferSize;
13+
14+
bool m_HasRegisteredHandler;
15+
16+
public NetworkedMessageChannel(string name, int bufferSize)
17+
{
18+
m_Name = name;
19+
m_BufferSize = bufferSize;
20+
}
21+
22+
~NetworkedMessageChannel()
23+
{
24+
if (NetworkManager.Singleton != null && NetworkManager.Singleton.CustomMessagingManager != null)
25+
{
26+
NetworkManager.Singleton.CustomMessagingManager.UnregisterNamedMessageHandler(m_Name);
27+
}
28+
}
29+
30+
public override IDisposable Subscribe(Action<T> handler)
31+
{
32+
if (NetworkManager.Singleton != null && NetworkManager.Singleton.CustomMessagingManager != null)
33+
{
34+
if (!m_HasRegisteredHandler)
35+
{
36+
NetworkManager.Singleton.CustomMessagingManager.RegisterNamedMessageHandler(m_Name, ReceiveMessageThroughNetwork);
37+
m_HasRegisteredHandler = true;
38+
}
39+
40+
return base.Subscribe(handler);
41+
}
42+
43+
return null;
44+
}
45+
46+
public override void Publish(T message)
47+
{
48+
if (NetworkManager.Singleton.IsServer)
49+
{
50+
// send message to clients, then publish locally
51+
SendMessageThroughNetwork(message);
52+
base.Publish(message);
53+
}
54+
else
55+
{
56+
Debug.LogError("Only a server can publish in a NetworkedMessageChannel");
57+
}
58+
}
59+
60+
void SendMessageThroughNetwork(T message)
61+
{
62+
var writer = new FastBufferWriter(m_BufferSize, Allocator.Temp);
63+
writer.WriteValueSafe(message);
64+
NetworkManager.Singleton.CustomMessagingManager.SendNamedMessageToAll(m_Name, writer);
65+
}
66+
67+
void ReceiveMessageThroughNetwork(ulong clientID, FastBufferReader reader)
68+
{
69+
reader.ReadValueSafe(out T message);
70+
base.Publish(message);
71+
}
72+
}
73+
}

Assets/BossRoom/Scripts/Shared/Infrastructure/PubSub/NetworkedMessageChannel.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.

0 commit comments

Comments
 (0)