【发布时间】: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