【发布时间】:2021-10-05 03:51:50
【问题描述】:
我正在尝试制作一款使用与 Jackbox 游戏类似的设置的游戏。这基本上意味着您有一个主机客户端,移动客户端可以通过转到https://jackbox.tv 并输入房间代码+玩家名称来访问它。无需在手机上下载。
这是我的设置:
- Unity 主机客户端 - 将用于建立房间。 (C#、.NET 2.0 标准)
- React Native Player Client - 玩家将使用它与游戏互动。 (JavaScript,世博会)
- 服务器客户端 - 使用 SignalR 作为后端技术将游戏和玩家链接在一起的服务器。 (C#、.NET 5)
我现在的问题是我不太清楚如何让我的两个集线器相互通信。这两个中心是:
- HostHub - 这是 Unity 客户端连接的地方,以便服务器知道哪些游戏可用以及哪些玩家可用。
- GameHub - 这是玩家客户端连接的地方,并将被分配到房间。
我在服务器客户端上有一个 ServerManager 的 Singleton 实例,用于保存 Game 和 Player 对象以及检索它们(稍后我将添加适当的持久性管理)。
所以当我尝试在我的 Host- 或 GameHub 中使用这样的 C# 事件时:
...
ServerManager.Instance.OnPlayerJoinedRoom += ServerManager_OnPlayerJoinedRoom;
...
private void ServerManager_OnPlayerJoinedRoom(object sender, (string, string, string) info)
{
IClientProxy host = Clients.Client(info.Item1);
host.SendAsync("PlayerJoined", Extensions.ParamArray(info.Item2, info.Item3));
}
我收到一条错误消息,提示 Clients 已处置,因此我无法访问它。我发现这是因为这些是非常轻的物体,按照设计,它们的使用寿命很短。
那么我还能做些什么来让 Hub 相互通信,或者这不是 SignalR 的方法?
【问题讨论】:
-
这与让 2 个控制器相互通信基本相同 -> 它不应该发生,并且 SDK 没有提供实现它的简单方法。但是,目前还不清楚集线器之间是如何相互通信的,您能否扩展您的示例代码?
-
哦,好吧。那么这就解释了这个问题。我确实理解控制器的类比。
-
基本上我试图做的是说
ServerManager类将充当“桥梁”,并且简单地具有任一集线器可以通过某些方法调用触发的事件。然后接收中心可以通过ServerManager订阅这些事件。但如果这不可能,那么我将不得不重做我的结构。 -
看起来您应该尝试使用
IHubContext<YourHub>。这是一种从集线器外部向客户端发送消息的方法,docs.microsoft.com/aspnet/core/signalr/… -
您应该只有一个信号但有多个集线器。这样 HostHub 和 GameHub 可以共享相同的上下文和集合:docs.microsoft.com/en-us/aspnet/signalr/overview/…
标签: c# signalr signalr-hub