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

Unity3d 为Unity构建一个简单的在线游戏服务器,unity3d,game-engine,multiplayer,Unity3d,Game Engine,Multiplayer,我正在尝试为我的坦克游戏2D(Unity)构建一个在线游戏服务器。在我的游戏中,将有2-4名玩家控制他们的坦克并互相攻击 我曾尝试使用Unity网络,但它并不适合我的游戏,因为我们必须选择房间中的一名玩家作为“服务器”,这对我未来的发展来说不是很灵活(例如,当“服务器”退出时,我必须做大量工作来保持其他玩家之间的连接) 然后,我尝试使用Nodejs lásocket.io构建自己的服务器,用于服务器-客户机通信。它非常简单:从一个接收数据并将其广播给其他人。在物理部分出现之前,它似乎工作正常

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

  • 我曾尝试使用Unity网络,但它并不适合我的游戏,因为我们必须选择房间中的一名玩家作为“服务器”,这对我未来的发展来说不是很灵活(例如,当“服务器”退出时,我必须做大量工作来保持其他玩家之间的连接)

  • 然后,我尝试使用Nodejs lásocket.io构建自己的服务器,用于服务器-客户机通信。它非常简单:从一个接收数据并将其广播给其他人。在物理部分出现之前,它似乎工作正常:当客户端说有东西被击中或爆炸时,服务器必须信任客户端,然后将其广播给其他客户端。更不用说被欺骗的客户端,随着网络延迟的增加,客户端的物理模拟也会有所不同。例如,一辆坦克可能撞到了这个客户身上,但另一辆坦克应该被挡在墙后并保持生命,但他身后的坦克被子弹击中并爆炸,这是因为潜伏期。在这些情况下,服务器不知道该听哪个

更新
  • 正如@Catwood在下面提到的,光子双关语是我的另一个选择。我 我以前听过他们的教程。光子不需要像Unity networking那样的“服务器”播放器。但是我如何在服务器上实现我的游戏逻辑呢?(用于权威服务器)
  • 显然,Smartfoxserver是另一个不错(而且价格昂贵)的选择。我还没有深入查看他们的API文档。我不知道我是否可以在这方面实现我的游戏逻辑和规则(为了简单起见,他们的教程跳过了这一部分)
总之,我需要一个关于我的游戏服务器的建议:

  • 是一个权威服务器
  • 能够处理游戏规则并决定会发生什么(也许应该有自己的物理引擎)
  • 与Unity2D配合良好
  • Javascript、C#、Java是首选
我是否走对了方向,因为似乎有些游戏服务器服务(如光子、Unity networking)根本不关心如何在服务器上实现游戏逻辑。这会让他们不是权威服务器吗


我对这个领域很陌生,任何事情都会很感激的

资产存储中有一个名为的资产,它是权威服务器。它对非移动设备也是免费的。这肯定会解决你问题的第一部分


这将很有帮助。

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

例如,暴雪游戏的炉石是基于统一的客户端,并有一个定制的服务器端

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

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

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

  • 地图的大小
  • 玩家数量
  • 每个玩家的数据(生命点、位置、大小、攻击速度…)
  • 做出决策所需的任何其他信息
现在,客户端应该始终向服务器发送非常小的信号,如下所示

  • 向左移动
  • 入党
  • 射门
  • 右转
  • 等等
根据用户的动作和数据,服务器可以对游戏进行“模拟”

  • 检查是否允许该操作
  • 如果允许,模拟动作。如果不是,请将其放入队列中
  • 向用户发送正在发生的事情的信息(玩家一次命中,玩家二次死亡,玩家四次向左移动等等)
这样,服务器就知道什么时候发生了什么,并决定发生了什么。你不依赖客户端信息,你只接收玩家想要的动作

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

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

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

例如,如果您决定向左移动,客户端知道您的移动速度,因此它可以显示移动,而无需依赖服务器

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

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

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

总之,您的服务器应该

  • 比姆
    map_width = 512;
    map_height = 512;
    user_width = 2;
    user_height = 2;
    user_speed = 1;
    user_posx = 20;  
    user_posy = 20;
    
    {action: move; value: left};