如何使用 Edgegap 的大厅浏览器 SDK 为任何 Unity 多人游戏添加在线大厅(如同在专用游戏服务器上一样)

我们将涵盖使用 Edgegap 的服务器浏览器 SDK 为您的 Unity 游戏添加按需多人游戏大厅系统的每个步骤,玩家将自动连接到按需专属服务器。此方法适用于任何网络代码。让我们开始吧!

此集成基于我们的专属服务器教程。它假设您已经为专属服务器设置了 Unity 项目,并且知道如何构建、容器化并上传服务器到 Edgegap。如果您还没有这样做,请先学习该教程。

第 1 部分 - 安装服务器浏览器 SDK

专用服务器教程中的 Edgegap 插件负责构建和部署您的游戏服务器。服务器浏览器(Server Browser)是一个独立的包。

在 Unity 中,从顶部导航栏中选择“Window”,然后选择“Package Management”,再选择“Package Manager”。选择“加号”图标,然后选择“Add package from git URL”。粘贴 SDK 的 URL。

https://github.com/edgegap/edgegap-unity-sdk.git

下载完成后,在 SDK 的详细信息面板中找到“Samples”选项卡,并导入“Server Browser - Auto-Assign”示例。这会向您的项目添加两个脚本:一个服务器处理程序和一个客户端处理程序。客户端处理程序会在游戏服务器上保留一个席位,并将服务器地址传给您的游戏以便进行连接。服务器处理程序在启动时会向服务器浏览器注册您的游戏服务器,并报告可用的玩家容量。这两者都会在后面的步骤中接入到场景中。

该 SDK 几乎为您处理好了一切。它留给您要做的就是添加特定于网络代码(netcode)的部分:连接您的游戏到分配的服务器的代码行、一个告诉服务器哪些玩家加入的简短握手、以及在玩家离开时释放其席位的释放机制。

免责声明

确保通过 "从 Git 添加项目" 添加 Edgegap 的 Unity 插件,以确保您使用的是项目的最新版本。

  1. 选择“窗口”,然后选择“包管理器”

  2. 点击“+”图标,然后选择“从Git添加项目”

  3. 粘贴Edgegap的Unity插件URL:“https://github.com/edgegap/edgegap-unity-plugin.git”

  4. 选择“安装”

第 2 部分 - 生成集成代码

该集成使用的是通用提示,任何 AI 编码助手都可以在任何 Unity 项目中运行。这些提示涵盖两个步骤:第一步,让助手审计您的项目以查找它是如何连接并发送消息的;第二步,在审计的基础上编写集成。这两个提示在视频的评论区均可复制。屏幕上的示例使用的是 Mirror Networking 的台球示例,但是这些提示与网络代码无关。

第一个提示是只读的,不会改变任何内容。它会让助手查找并报告几件事:您的客户端是如何使用自定义地址和端口连接到服务器的,您的网络代码是如何将较小的自定义消息从客户端发送到服务器的,它是如何发出客户端已连接的信号的,以及它是如何在服务器上发出玩家已断开连接的信号以便将座位归还到池中的。对于 Mirror 示例,审计确认了客户端通过在 Mirror 的 NetworkManager 上调用 StartClient 来进行连接(其中地址和端口设置在活动传输上),并确定了 Mirror 是如何发送网络消息和触发其客户端连接事件的。

第二个提示是让助手根据该审计进行更改。它做了三件事。第一,它创建了一个小型的独立连接器脚本,该脚本在服务器上监听每个玩家的 ID 并确认其预订,在客户端上,一旦连接就将该 ID 发送上去。第二,它使 Server Browser 客户端处理程序适配为使用 Server Browser 返回的地址和端口连接到服务器,从而通过您的网络代码启动客户端。第三,在玩家断开连接时释放其座位,这样服务器就可以为新玩家腾出空间,而不是随着时间的推移而被占满。

同样的方法也适用于其他网络代码:审计会适配您使用的任何项目,并相应地应用修改。

有一个特定于网络代码的细节值得特别指出,因为审计会为您捕捉到它。在 Mirror 中,客户端连接事件在客户端启动时会被重置,因此连接器是在客户端启动后(而不是启动前)订阅该事件的。审计发现了这一点,而修改处理了它。

第 3 部分 - 将脚本添加到场景中

代码已经存在,但在 Unity 中,脚本在附加到游戏对象之前是不起任何作用的。

首先,创建一个空的游戏对象并命名为 "Test-Connector"。添加助手生成的连接器脚本。接着,为服务器处理程序创建另一个空对象,并添加 "Server Browser Server Handler" 组件,暂时将其字段留空。然后再添加一个空的游戏对象,命名为 "Server Browser Client Handler",添加同名脚本,同样保持其组件字段为空。这些字段将在下一步中使用平台的信息进行填充。

第 4 部分 - 创建服务器浏览器

在 Edgegap 平台上,打开 "Server Browser" 并创建一个新的浏览器。给它起一个名称以供自己参考,例如 "quickstart",然后选择 "Simple Example" 配置。启动服务器浏览器 (Server Browser),稍等片刻让其上线。在免费版中,浏览器会在几个小时后自动停止,这对于测试来说完全没有问题。

一旦上线,查看其详细信息。您将看到一个 API URL 和两个独立的令牌:一个服务器令牌 (server token) 和一个客户端令牌 (client token)。这三个都是必需的,并且这两个令牌分工不同,所以请务必不要混淆它们。

回到 Unity 中,将此信息添加到这两个处理程序中。在服务器处理程序上,粘贴 API URL 和服务器令牌。在客户端处理程序上,粘贴相同的 API URL 和客户端令牌。为每个处理程序使用相应的令牌,因为不小心将它们调换会产生连接错误。最后,保存场景。

服务器令牌仅存在于运行在 Edgegap 上的无头 (headless) 服务器中,绝不会存在于玩家的机器上。将其直接粘贴到组件中可以使本教程保持简单,但在生产架构中,您将其设置为应用版本中的环境变量,这会覆盖检测器 (inspector) 的值,并使您的令牌远离项目的物理文件。

第 5 部分 - 构建并部署服务器

需要一个新的应用版本。这一步很容易被忽略,但却至关重要:服务器处理程序会从您刚刚填充的组件字段中读取 URL 和令牌信息,而以前上传的游戏服务器缺少这些信息。因此,构建并上传服务器是必须的。

打开 Edgegap 托管插件,严格按照专用服务器教程中的步骤构建、容器化并上传您的服务器,可以单独进行,也可以使用 "build from source" 按钮,该按钮可以一键执行所有这些步骤。

上传服务器后,在服务器浏览器上创建扩展策略。将其命名为 "on-demand",将 "Minimum Active Instances"(最少活动实例数)设置为 1,将其指向您刚刚上传的应用程序和版本,并将 "Private Hosts" 留空,以便将其部署到云端。最少一个活动实例是保持单个服务器始终存活并准备就绪的关键——这就是您的按需大厅。将该策略保存为激活状态,不出一分钟,它就会自动将服务器部署到 Edgegap 的网络中。在部署日志中,您应该会看到服务器注册、报告健康,并显示其处于可发现状态且有可用座位。您的按需多人游戏大厅现在已经上线了。

第 6 部分 - 测试

要使用两名玩家进行测试,请使用 Unity 的 Multiplayer Play Mode,这在专用服务器教程中有所介绍。在开始游戏时,每位玩家都会联系 Server Browser(服务器浏览器),预留一个席位,获取服务器地址,并自动连接——无需任何人输入地址。在服务器端,每位玩家都会得到确认,席位即被占用。两位玩家都会被置于同一个云服务器中,每位玩家的操作都会在对方的游戏场景中复现。

生产环境注意事项:新分配的服务器可能仍需要启动片刻,因此您需要添加一个重试功能,每隔几秒检查几次连接,以弥补这一间隔。本教程将部署到 Edgegap 的云网络,作为在开发中进行测试的一种简单方法;如果您更倾向于在开发过程中部署到类似舰队(fleet)的解决方案,请参阅相关文档。

第 7 部分 - 后续步骤

这里使用的简单示例是一个起点。从这里开始,您可以从几个方向来改进您的服务器浏览器(Server Browser)集成。

我们的文档涵盖了其他功能,例如通过区域、容量或游戏模式等参数搜索和浏览服务器,以便玩家能够选择特定服务器而不是被自动分配。您还可以通过将主机 ID 添加到缩放策略中,将您的服务器固定到保留舰队或私有舰队(Private Fleet),而不是云端。

您也可以加入我们在 Discord 上的社区,向我们的开发团队和其他工作室寻求帮助,以使服务器浏览器适应您的游戏。

代码深度解析:添加什么以及为什么

这个可选的深度解析涵盖了实际的代码,适合那些想要了解集成的人。这些更改是针对 Mirror 示例的,但该思路适用于任何网络代码:获取服务器浏览器提供给您的地址和端口,将它们放入您的网络系统中并进行连接 —— 然后告诉服务器哪些玩家刚刚加入,以便其确认预留。

第一部分是连接流程。一旦客户端与服务器进行通信,服务器浏览器仍然需要知道玩家确实已到达,以便确认他们的席位预留并保持其席位计数的准确。这是第二部分:一旦连接,客户端就会将其玩家 ID 发送给服务器,服务器再将其报告给服务器浏览器。

连接器定义了一条携带玩家 ID 的微小网络消息 —— 该 ID 与客户端用于预留席位的 ID 相同。在客户端,一旦连接,它就会将该 ID 发送到服务器。这里有一个值得重复的 Mirror 细节:它在启动客户端后订阅连接事件,因为 Mirror 会在客户端启动时重置该事件。

在客户端处理程序中,玩家 ID 在运行时全新生成,因此每个玩家(包括模拟玩家)都会获得一个唯一的 ID。

集成的核心是席位预留响应。当服务器浏览器预留席位时,它会返回服务器地址和端口。您可以在 Mirror 的 NetworkManager 及其传输上设置这些参数,启动客户端,然后订阅连接事件以便发送 ID。端口是以一种独立于网络代码的方式从活动传输中读取的,因此相同的模式也可以应用到其他网络代码 —— 只有确切的地址、传输和启动客户端调用是 Mirror 特有的。

生产环境下的最后一个注意事项:不要直接将服务器令牌粘贴到组件中,您可以在应用版本中将它们设置为环境变量 —— SB_BASE_URLSB_SERVER_TOKEN —— 这会覆盖组件的值,因此您的令牌永远不会存在于您的项目文件中。

这就是 Edgegap 服务器浏览器的全部内容。它使游戏开发者只需极少量的代码,就能在类似于大厅的系统中运行持久的专用服务器,并自动将玩家放入其中。

轻松在线游戏,尽在数分钟内

立即开始集成!

轻松在线获取游戏
及分钟内完成