我为 Unity 创建了一个多人服务器,其工作方式如下:
- 每个客户端/玩家都连接到服务器并说“嗨”。
- 服务器接受玩家并将其添加到玩家在线列表中。
- 每个客户都开始发送他的位置。
- 服务器侦听客户端的位置,每秒 X 次将它们发送给所有其他在线玩家。
- 这是由所有在线玩家上的一个 bucle 制作的,因此服务器配置为每秒向所有玩家发送 10 次更新的位置。
- 每个客户端都会监听服务器以获取其他玩家的位置。当服务器说“这个玩家刚刚说他在那里”时,客户端将他移动到那里。
有了这个基本系统,我可以轻松地用 Unity 创建多人游戏(已经做到了)。但是,如果在线玩家超过几千人怎么办?然后,假设每个玩家将他的位置发送到服务器大约 10 次/秒。服务器必须将这些位置发送给周围的所有玩家,比如 100m。因此,服务器将为所有在线玩家(2000)运行一个循环,将他的位置与所有 1999 玩家进行比较,如果小于 100m,则将位置发送给玩家。或者,也许更好,将所有玩家更新的位置保存在一个数组中并将其发送给玩家。(每 10 秒向玩家发送一条消息应该比数百条消息要好,对吧?无论如何,循环必须每秒通过 2000*1999 10 次,这可能会很痛苦..
我想使用 Unity3d 作为客户端,我不想在服务器上保存任何物理,因为使用统一的物理引擎很好/快速/易于使用。而且我认为这可能就足够了,也许在服务器端进行一些反作弊检查以摆脱不良玩家。
现在,问题:)
一个合适的 mmo 服务器是如何工作的?是否每个玩家每秒将其位置发送到服务器 X 次,然后它会通过 HEAVY 循环并将其位置发送给周围的所有玩家?性能呢?
我将为下一步实施一个预测系统,并使用从服务器接收到的更新后的位置插入当前位置。这样对吗?
如果我必须检测玩家之间或与物体(子弹等)的碰撞,你会在客户端进行吗?或者在服务器端实现玩家-玩家和玩家-对象碰撞检测系统并在大循环中执行?
如果玩家移动是使用键盘,因此它没有一个位置可以移动,那么您将如何将位置发送到服务器,例如每秒 10 次,并插入其他玩家接收到的位置以创建平滑的移动?
如果玩家的移动是通过给他们设置力物理,比如你前进的时候是因为有一种力量在推动你,你会如何将此信息传递给其他客户端?仅将位置发送到服务器,然后将其发送给其他玩家?但是,物理看起来很奇怪......我想到的计划b)是将使用的力发送到服务器,每个客户端将服务器接收到的力应用到他们周围的所有玩家,这里的物理看起来很棒但是也许存在延迟问题......使用这个系统并每 X 次发送准确的位置会更好吗?说0.5秒?
好吧,我想这就是全部!我希望这篇文章对其他独立开发者有用!