Unity3D中的MMO服务器功能

时间:2013-12-12 12:20:44

标签: algorithm unity3d protocols multiplayer mmo

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

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

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

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

现在,问题:)

  • 适当的mmo服务器如何工作?每个玩家是否每秒向服务器发送一次X次,并通过HEAVY循环并将其位置发送给周围的所有玩家?性能怎么样?

  • 我会为下一次移动实现一个预测系统,并用从服务器收到的更新的位置插入当前位置。是不是?

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

  • 如果玩家使用键盘移动,所以它不会只有一个位置,你将如何将位置发送到服务器,如每秒10次,并插入其他玩家收到的位置创造一个平稳的运动?

  • 如果玩家的动作是通过为他们设置力物理,就像你前进那样,因为有力量推动你,你会如何将这些信息传递给其他客户?只将位置发送到服务器并将其发送给其他玩家?然后,物理学看起来很奇怪......我想到的计划是将用于服务器的力量发送给每个客户将服务器接收的力量应用到他们周围的所有玩家身上,这里的物理看起来很棒但是也许存在延迟问题......使用这个系统并且每隔X次发送确切的位置会不会很好?说.5s?

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

1 个答案:

答案 0 :(得分:3)

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

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

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

  2. “共享世界”:将您的世界划分为每个由分离的物理硬件处理的扇区。实施起来更具挑战性。可以支持无缝世界。

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