【问题标题】:Unity custom Server-Client UDPUnity 自定义服务器-客户端 UDP
【发布时间】:2021-07-27 14:39:03
【问题描述】:

我正在做一个学校项目,我们正在制作一个统一的游戏,它应该是多人游戏。我不允许使用任何内置的服务器/客户端库,例如 UNET 或 MIRROR,因为它是网络课程而不是游戏开发。

到目前为止,我已经有了一个可以接收和发送数据的工作 UDP .NET 服务器。每当客户端连接时,它都会存储信息(IPEndPoint),以便将来使用。每当服务器收到来自客户端的数据包时,服务器就会将数据包发送给其他所有客户端。

感谢您阅读本文。服务器是否应该告诉客户端他们拥有哪个 ClientID?我猜这个数据包必须用某种 ID 标记来识别是哪个客户端发送的。同样在 Unity 中,当我收到他们已经改变位置的数据时,我将如何去生成和“移动其他客户端游戏对象”。我已经看到 NetworkManager 和 UNET 使用 IsLocalPlayer 来识别它是否是本地播放器,我找不到底层代码,但我猜它只是你在实例化对象时设置的布尔值?

所以我现在得到的是一个游戏,客户端可以连接到服务器,客户端可以将它的 transform.position 发送到服务器,服务器打印出来并发送给其他客户端。

感谢所有帮助和想法,如果这是一个愚蠢的问题,请告诉我在哪里阅读更多内容,因为我看到的所有教程都使用网络库,如果我被允许的话,我会这样做。

【问题讨论】:

  • 欢迎新用户。你能至少说明你正在制作什么类型的游戏吗?即它是真人秀(如投球或赛车)还是更像是一个谜题(也许是国际象棋等)。
  • 我在 40 小时的工作中花了 6 个月的时间为本地网络(以及使用 Photon 的在线模式)编写我们自己的纯 c# 多用户后端......你的学校给你多少时间? ^^
  • Should the Server tell the clients which ClientID they have? 如果有更多基于客户端 ID 的事情发生,是的。 I guess the packet has to be marked with some kind of ID to identify which client sent it 不适用于服务器 -> 它已经知道每个客户端端点 .. 如果您需要接收客户端上的发件人 ID -> 是的,在包中发送它。对于转换:您需要高性能(反)序列化并希望将多个数据 sn-ps 打包到更大的 UDP 包中,因为它们有开销(20b UDP Header vs 40b 一个位置 + 旋转 + 缩放数据)
  • 一般来说,您需要 2 个通道:所有基于命令的事物的可靠 (TCP) 和所有持续更新(转换)的不可靠 (UDP) .. 是否所有客户端都知道彼此 (P2P) 或服务器充当中继取决于您..两者都有其优点和缺点
  • 嘿!我正要说的几乎与@derHugo 刚才所说的完全一样。我们之前的第二份工作是 ~35 周 使用 Unity 构建自定义 MMP 系统,因此,它是一个庞大的云系统(基本堆栈是 aws/node/express/sql),实际上是 Unity 方面。

标签: .net sockets unity3d udp multiplayer


【解决方案1】:

你真的面临着漫长的旅程!

服务器是否应该告诉客户端他们拥有哪个 ClientID?

在服务器端,您应该具备以下能力:

  1. 发送给所有连接的人

  2. 只发送到某个特定的连接

如果你不解决这个问题,你就会遇到麻烦。

服务器是否应该告诉客户端他们拥有哪个 ClientID?

这是你的选择。服务器可以“选择所有的 ID”,或者客户端可以“选择自己的 id”。

一种简单的方法是:启动客户端时,只需创建一个 UUID 并使用它。因此,在此示例中,客户端正在选择自己的 ID。与服务器的第一次通信类似于“嗨,我的 uuid is2i23u4y2i34u2y4ui,我的用户名为 Jane Jones”。在服务器端,跟踪所有 uuid 和连接以及昵称等。

(如果您还不熟悉 UUID 等数学概念,那么您将面临漫长的旅程。)

正如我所说,这是您的选择。服务器可以“选择所有的 ID”,或者客户端可以“选择自己的 id”。

“我将如何生成和移动其他客户端游戏对象等

在 clientA 中,你会有一个名为“SpawnARobot(position)”之类的函数

当命令到达客户端 A 时,您将解析这些命令。您将有一个大的 switch 语句来了解如何处理各种命令。您的命令之一可能是“spawn”,当 clientA 收到“spawn”命令时,clientA 会调用“SpawnARobot(position)”

下面是一些命令(即只是一些文本)到达的示例,然后是相关函数/被调用的任何内容:

请注意,您需要解决一些非常基本的概念。

在某些游戏中,只有服务器“决定”生成某些东西,或者其他。客户完全是愚蠢的,基本上只是“展示他们被告知的内容”。

在其他游戏中,除了传递命令之外,服务器实际上并没有做任何事情,而且,客户端自己“决定”应该生成什么东西,或者其他什么。 (这通常是一种“rpc”方法。)

另外,不要忘记...之间存在巨大的基本混淆...假设您有三部 iPhone 玩您的游戏。我们所说的“服务器”(称为“主控制器”)是这三款 iPhone 之一,因此每个 GameOnAnIPhone 都有您的“客户端”,但其中一个(仅)也是“服务器”(或“主控制器”) .与此完全相反,您可以在云中拥有真正的“服务器”,即您的代码(很可能是 Node.js)在 AWS 实例上运行,并且所有三个 GameOnAnIPhone 都连接到“服务器服务器”。

所有这些概念都非常不同,恐怕你必须理清这些基础知识。

【讨论】:

  • 我明白你所说的关于对象的服务器与客户端权限。我的想法是让服务器从客户端前转换位置接收数据,然后将其广播给其他客户端。然后另一个客户端确定应该在其本地游戏中移动哪个客户端。为什么我需要客户端告诉服务器我想要生成?客户端可以从一开始就在本地生成所有其他玩家?它不是高级游戏。截至目前,当我开始游戏时,客户端连接到服务器,服务器接收数据并将其转发给其他客户端。
猜你喜欢
  • 2020-06-22
  • 2012-01-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多