为Unity构建一个简单的在线游戏服务器

时间:2015-05-28 09:20:33

标签: unity3d game-engine multiplayer

我正在尝试为我的坦克游戏2D(Unity)构建一个在线游戏服务器。在我的游戏中,将有2-4名玩家控制他们的坦克并互相争斗。

  • 我尝试使用Unity网络,它不适合我的游戏,因为我们必须选择房间中的一个玩家成为“服务器”,这对我的未来不是很灵活开发(例如,当“服务器”退出时,我必须做很多工作来保持其他玩家之间的联系)。

  • 然后我尝试用Nodejllàsocket.io构建我自己的服务器,用于服务器 - 客户端通信。它非常简单:从一个接收数据并将其广播到其他人。它似乎工作正常,直到物理部分进入:服务器必须信任客户端,当他们说有什么东西被击中或爆炸,然后广播到其他客户端。更不用说受骗的客户端,由于网络延迟,客户端的物理模拟会有所不同。例如,一个坦克可能会被撞到这个客户端,但是它应该被覆盖在另一个的墙壁后面并保持活着,但是由于延迟,他身后的坦克会抓住子弹并爆炸。在这些情况下,服务器不知道要听哪一个。

更新

  • 正如下面提到的@Catwood,Photon PUN对我来说是另一种选择。一世 曾经按照他们的一个教程。 Photon不需要播放器就像Unity网络一样是“服务器”。但是如何在服务器上实现我的游戏逻辑呢? (用于权威服务器目的)
  • 显然,Smartfoxserver是另一个优秀(且价格昂贵)的选择。我没有深入了解他们的API文档。我不知道我是否可以实现我的游戏逻辑和规则(为简单起见,他们的教程跳过这一部分)。

总之,我需要一个关于我的游戏服务器的建议:

  • 是权威服务器
  • 可以处理游戏规则并决定会发生什么(可能应该有自己的物理引擎)
  • 适用于Unity2D
  • Javascript,C#,Java是首选!

我是否正确的方向,因为看起来像一些游戏服务器服务(如Photon,Unity网络)只是不关心如何在服务器上实现游戏逻辑。它是否使它们不是权威服务器?

我对这个领域很新,任何事情都会受到赞赏!

2 个答案:

答案 0 :(得分:8)

我建议您为自己的游戏创建自己的服务器,就像使用NodeJS一样。我所知道的大多数解决方案都很难使用,无法做你想要的任何事情。

例如,暴雪游戏的Hearthstone基于Unity为客户端而且有一个定制的服务器端。

以下是有关如何创建游戏服务器的一些建议。

  

在物理部分出现之前似乎工作正常:服务器必须信任客户端,当他们说某些东西被点击或爆炸时,然后将其广播给其他客户端。

创建服务器时,您必须在服务器端做出每个重要的决策,而不是客户端。 启动聚会的是服务器,因此服务器必须具有以下信息

  • 地图的大小
  • 玩家数量
  • 每位玩家的数据(健康点,位置,大小,攻击速度......)
  • 作出决定所需的任何其他信息

现在,客户端应始终向服务器发送非常小的信号,如下所示

  • 向左移动
  • 加入派对
  • 向右旋转
  • 等...

根据用户的操作和用户数据,服务器可以运行游戏的“模拟”。

  • 检查是否允许采取行动
  • 如果允许,请模拟动作。如果不是,请将其放入队列
  • 向用户发送有关正在发生的事情的信息(玩家一击,玩家二人死亡,玩家四人左移等)。

有了这个,服务器知道什么时候发生了什么并决定发生了什么。您不依赖客户端信息,只接受玩家所需的操作。

但是,正如您所说,由于延迟和其他网络因素,您的客户端不能过于依赖服务器。在现代游戏中,客户端拥有与服务器相同的关于播放器的数据,并不总是依赖服务器在屏幕上显示正在发生的事情。

如果您玩过一些在线游戏,您可能已经注意到当与服务器的连接丢失时,您可以继续玩(移动,拍摄等)的时间很短,但除了您。 这是因为即使没有服务器信息,客户端也会根据您的操作继续“运行”游戏。

但是,为了避免客户端向播放器显示的内容与服务器模拟中发生的事情之间存在巨大差异,客户端和服务器会定期“同步”。

例如,如果您决定向左移动,则客户端会知道您的移动速度,以便它可以在不依赖服务器的情况下显示移动。

当同步发生时,服务器向客户端发送关键信息,客户端用服务器发送的内容更改当前显示的任何信息。

左移动示例,如果您在服务器和客户端上的移动速度不同,当客户端收到同步订单时,您会注意到您的播放器将从显示位置“传送”到另一个位置。如果某些数据包丢失或由于高延迟,也会发生这种情况。

在服务器端和客户端创建在线游戏时,处理lanncy是一个巨大的挑战,而且这不是这个问题的主题。

总结一下,您的服务器应该

  • 是自制的
  • 仅接收来自客户的操作
  • 模拟游戏
  • 向客户发送有关正在发生的事情的信息
  • 定期与客户同步

希望这个帮助=)

<小时/> 以下是有关如何在服务器中添加逻辑的一些说明。 之前的小免责声明,我从未使用过NodeJS,因此我不知道这是否可以使用NodeJS实现,我通常使用C ++。

现在,对于你的游戏,我假设玩家只能使用动作MOVE。

当用户连接到您的服务器时,您可以启动游戏。 因为您的用户可以移动,这意味着存在2D地图,您的用户具有大小,初始位置和速度。 所以你的服务器应该启动一个新的“GameParty”并初始化上面的数据。 对于该示例,我们假设设置了以下默认值。

map_width = 512;
map_height = 512;
user_width = 2;
user_height = 2;
user_speed = 1;
user_posx = 20;  
user_posy = 20;

当客户想要移动时,他会向服务器发送一个包,表示他想移动。你可以使用你想要的任何协议进行客户端&lt; - &gt;服务器通信,我使用二进制协议,但是假设你使用Json

{action: move; value: left};

这样,您的服务器就会知道用户想要向左移动。 因此,您只需将值user_posx减少user_speed即可获得服务器端的新职位。如果此位置位于地图的边缘,则有两种选择,使用户出现在地图的另一边禁止操作。

在规定的时间间隔内,您的服务器会向玩家发送玩家的当前位置。

答案 1 :(得分:2)

资产商店中有一个名为Photon的资产是权威服务器。对于非移动设备也是免费的。这肯定会处理你问题的第一部分。

这个伟大的Tutorial会有所帮助。