Unity自定义Server-Client UDP

问题描述

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

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

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

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

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

解决方法

你真的要走很长的路!

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

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

  1. 发送给所有连接的人

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

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

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

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

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

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

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

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

那么在 clientA 中,您将有一个名为“SpawnARobot(position)”之类的函数

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

下面是一些命令(即,只是一些文本)到达的例子,然后是相关的函数/被调用的东西:

enter image description here

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

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

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

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

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

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...