2015-05-28 35 views
3

我想为我的坦克游戏2D(Unity)建立一个在线游戏服务器。在我的比赛中,将有2-4名球员控制他们的坦克并相互对抗。建立一个简单的Unity游戏服务器

  • 我试图用统一的网络,它是不是真的适合我的比赛,因为我们要选择在房间内的玩家1成为“服务器”,这是不是我真的灵活未来的发展(例如,当“服务器”退出时,我必须做很多工作才能保持其他玩家之间的联系)。

  • 然后我试着用Nodejslàsocket.io构建我自己的服务器来进行服务器 - 客户端通信。非常简单:从一个接收数据并将它们广播给其他人。在物理部分进入之前,它似乎仍然正常工作:服务器在他们说有某些事件正在被击中或爆炸时必须相信客户端,然后将其广播给其他客户端。更不用说被欺骗的客户端,在网络延迟的情况下,客户端的物理模拟会有所不同。例如,这个客户可能会碰到一个坦克,但它应该被覆盖在另一个坦克的后面,并且保持活着,但由于延迟,他身后的坦克会抓住子弹并爆炸。在这些情况下,服务器不知道应该听哪一个。

更新

  • 作为@Catwood下文提到的,光子潘对我来说是另一种选择。我之前使用过他们的一个教程,我之前使用过 。 Photon不需要一个玩家就像Unity网络一样成为“服务器”。但是,我如何在服务器上实现我的游戏逻辑? (用于权威服务器的目的)
  • 显然Smartfoxserver是另一个好的(和昂贵的)选项。我没有深入了解他们的API文档。我不知道我是否可以实现我的游戏逻辑和规则(为了简单起见,他们的教程略过这一部分)。

最后,我需要一个建议,我的游戏服务器:

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

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

我对这个领域很新,任何事情都将不胜感激!

回答

6

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

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

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

它似乎正常工作,直到物理部分进来:服务器必须信任客户端,当他们说有东西被击中或爆炸,然后广播给其他客户端。

当创建你的服务器时,你必须做出所有重要的决定,而不是客户端的服务器端。 这是谁开始了党的服务器,因此服务器必须具有以下信息

  • 地图的大小
  • 球员
  • 数据关于每个运动员(健康点,位置,大小数,攻击速度......)
  • 做出决定

现在所需的任何其他信息,客户端应该始终非常小信号发送到服务器,如以下

  • 向左移动
  • 加入党
  • 拍摄
  • 向右旋转
  • 等...

基于用户的行为和用户的数据,服务器可以运行“模拟“的游戏。

  • 检查的动作是允许
  • 如果它是允许的,模拟的动作。如果不是的话,把它放在一个队列
  • 发送给用户的信息正在发生的事情(玩家一重击,玩家两个芯片,播放四步棋左等)

这样,服务器知道事情发生并决定发生了什么。您不依赖客户端信息,您只能接收玩家所需的操作。

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

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

但是,为了避免客户端显示的内容与服务器仿真中发生的巨大差异,客户端和服务器会定期进行“同步”。

例如,如果你决定向左移动,客户知道你的移动速度,因此它可以不依靠服务器上显示的运动。

当同步发生时,服务器发送给客户端的重要信息,并在客户端改变当前显示的任何信息什么的服务器发送。如果您的移动速度与服务器和客户端不同,当客户端收到同步订单时,您会注意到您的播放器将从显示位置“传送”到另一个位置。如果某些数据包丢失或高延迟,也会发生这种情况。

处理lantency是一个巨大的挑战,创造对服务器和客户端的网络游戏都当它不是这个问题的话题。

总之,您的服务器应该

  • 是自制
  • 只有从客户收到的行动
  • 模拟游戏
  • 发送关于什么是在定期间隔发生
  • 同步客户端的信息客户

希望得到这个帮助=)


下面是关于如何在服务器中添加逻辑的一些解释。 之前的小声明,我从来没有使用NodeJS,所以我不知道这是否可以使用NodeJS实现,我通常使用C++。

现在你的游戏,我假设玩家只能用实际行动上来。

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

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

当客户想要移动时,他发送一个数据包到服务器,说他想移动。你可以使用任何你想要的协议中为客户< - >服务器的通信,我用的是二进制protocal但是让我们假设你使用JSON

{action: move; value: left}; 

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

在有规律的时间间隔,您的服务器将发送到客户端的玩家的当前位置。

+0

谢谢你的信息。我相信你在谈论客户端预测,内插和服务器对账。我一直在为此工作一两天。在你的回答中,我认为“服务器应该模拟游戏”部分是我现在的问题,因为我的服务器只是一个“愚蠢的服务器”,我不知道如何在模拟上实现一些逻辑=) – FlySoFast

+1

@FlySoFast好吧,这并不难,但主要取决于你的游戏在做什么。我会编辑我的答案,添加一些presicion –

+0

是的,这很简单。但是,当一名球员被射门撞到他后面的岩石,然后以不同的旋转方向弹回到另一个方向时,那么他怎么样?这是他被第二颗子弹击中并爆炸的地方?男人,这里真的很复杂,我认为服务器必须有一些物理引擎,而不是一些简单的代码。我在想错误的方向吗? – FlySoFast

1

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

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

+1

Remember Photon限制了20个并发用户。 目前还有ulink,但将不得不购买许可证,但它的教程很容易与光子相比。然后有黑暗的裂痕也是免费的,但它有20个并发用户相同的限制。 宇联:http://developer.muchdifferent.com/unitypark/Downloads 黑暗的裂痕:https://www.assetstore.unity3d.com/en/#!/content/16711 –

+0

我不知道有关20个并发用户。这是非常有限的,这是一个耻辱。 – Catwood

+1

你真的但ulink没有它,你可以使用它进行测试,因为它是一个评估版本,但在发布之前你需要许可证。其实我还没有找到任何真正免费的多人插件;虽然黑暗裂痕提供插件黑暗裂纹亲50美元为200并发用户 黑暗裂谷专业:https://www.assetstore.unity3d.com/en/#!/content/16712 然后,他们有一个650美元的无限制并发用户之一 –