-2

我为 Unity 创建了一个多人服务器,其工作方式如下:

  • 每个客户端/玩家都连接到服务器并说“嗨”。
  • 服务器接受玩家并将其添加到玩家在线列表中。
  • 每个客户都开始发送他的位置。
  • 服务器侦听客户端的位置,每秒 X 次将它们发送给所有其他在线玩家。
    • 这是由所有在线玩家上的一个 bucle 制作的,因此服务器配置为每秒向所有玩家发送 10 次更新的位置。
  • 每个客户端都会监听服务器以获取其他玩家的位置。当服务器说“这个玩家刚刚说他在那里”时,客户端将他移动到那里。

有了这个基本系统,我可以轻松地用 Unity 创建多人游戏(已经做到了)。但是,如果在线玩家超过几千人怎么办?然后,假设每个玩家将他的位置发送到服务器大约 10 次/秒。服务器必须将这些位置发送给周围的所有玩家,比如 100m。因此,服务器将为所有在线玩家(2000)运行一个循环,将他的位置与所有 1999 玩家进行比较,如果小于 100m,则将位置发送给玩家。或者,也许更好,将所有玩家更新的位置保存在一个数组中并将其发送给玩家。(每 10 秒向玩家发送一条消息应该比数百条消息要好,对吧?无论如何,循环必须每秒通过 2000*1999 10 次,这可能会很痛苦..

我想使用 Unity3d 作为客户端,我不想在服务器上保存任何物理,因为使用统一的物理引擎很好/快速/易于使用。而且我认为这可能就足够了,也许在服务器端进行一些反作弊检查以摆脱不良玩家。

现在,问题:)

  • 一个合适的 mmo 服务器是如何工作的?是否每个玩家每秒将其位置发送到服务器 X 次,然后它会通过 HEAVY 循环并将其位置发送给周围的所有玩家?性能呢?

  • 我将为下一步实施一个预测系统,并使用从服务器接收到的更新后的位置插入当前位置。这样对吗?

  • 如果我必须检测玩家之间或与物体(子弹等)的碰撞,你会在客户端进行吗?或者在服务器端实现玩家-玩家和玩家-对象碰撞检测系统并在大循环中执行?

  • 如果玩家移动是使用键盘,因此它没有一个位置可以移动,那么您将如何将位置发送到服务器,例如每秒 10 次,并插入其他玩家接收到的位置以创建平滑的移动?

  • 如果玩家的移动是通过给他们设置力物理,比如你前进的时候是因为有一种力量在推动你,你会如何将此信息传递给其他客户端?仅将位置发送到服务器,然后将其发送给其他玩家?但是,物理看起来很奇怪......我想到的计划b)是将使用的力发送到服务器,每个客户端将服务器接收到的力应用到他们周围的所有玩家,这里的物理看起来很棒但是也许存在延迟问题......使用这个系统并每 X 次发送准确的位置会更好吗?说0.5秒?

好吧,我想这就是全部!我希望这篇文章对其他独立开发者有用!

4

1 回答 1

3

我不会试图回答你所有的问题,对不起。这将是太长的答案。好像你需要阅读很多关于游戏物理的东西。

很快,如果您有大量在线玩家,您需要开始考虑服务器集群和扩展。主要有两种方法:

  1. 实例:您有多个虚拟世界/地图副本,每个副本由单独的物理硬件处理,并有最大玩家数量的硬性限制。然后你开始阅读有关配对的内容。

  2. “共享宇宙”:将您的世界分割成扇区,每个扇区由单独的物理硬件处理。实施起来更具挑战性。可以支持无缝世界。

您可以在www.gamedev.net上找到大量有用的信息。

于 2013-12-12T12:44:23.073 回答