如何为任何 Unity 多人游戏添加无需代码的自动對局配對

以下内容基于我们适用于 Unity 的 對局配對 SDK 文档。请务必参考我们的文档以获取最新信息。

我们将介绍使用 Edgegap 免费的 Unity 對局配對 SDK 为 Unity 多人游戏添加對局配對的每个步骤。导入现成的示例,并在数分钟内运行起一个基础的對局配對系统。它会自动将玩家分组并在全球任何地方为每场对局启动服务器。屏幕上的示例使用的是 Mirror Networking 的 Tank 示例,但该方法与网络代码无关,适用于 Mirror、Fish-Networking、Unity 的 Netcode for GameObjects 等。

本指南将紧接专用服务器教程结束的地方。它假设您已经在 Edgegap 上构建、容器化并部署了您的游戏服务器,并且您已经在该平台上运行了一个具有活跃版本的应用程序。如果您还没有完成,请先完成该教程。

让我们开始吧!

第 1 部分 - 安装 Matchmaking SDK

第 1 部分 - 安装 Matchmaking SDK

专用服务器教程中使用的 Edgegap 插件负责构建和部署您的游戏服务器。對局配對是一个单独的程序包,名为 “Edgegap Unity SDK”,需要自行安装。

在 Unity 中,从顶部导航栏中选择 Window(窗口),然后选择 Package Management(包管理),再选择 Package Manager(包管理器)。选择加号图标,然后选择 “Add package from git URL”(从 git URL 添加包)。粘贴 SDK 的 URL(见下文)并选择 Add(添加)。

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

几秒钟后,Edgegap SDK 将与托管插件一起出现在您的包列表中。

下一步,导入要使用的示例。在包管理器中,打开 Samples(示例)选项卡,找到 “Matchmaking - Simple Example”(對局配對 - 简单示例),然后将其导入。这会将一些脚本复制到您的项目 Samples 文件夹下。只需要对局配对简单示例即可,其他示例可以不管。

该 SDK 负责处理繁重的工作:它测量每个玩家到一组信标的 ping 值,为每个玩家创建對局配對票,等待分配服务器,然后将配对的玩家连接起来。它故意留下了一个空白——告诉您的游戏连接到已分配服务器的确切代码行。该代码行取决于您的网络代码,因此 SDK 无法为您编写。

第 2 部分 - 使用 AI 助手添加连接代码

第 2 部分 - 使用 AI 助手添加连接代码

要快速弥补这一空白,可以使用任何 AI 编码助手都能运行的通用提示词。它的工作分为两个部分:首先,助手对项目进行审计,以找出游戏和网络代码(netcode)目前如何连接到服务器,然后添加對局配對连接。这两个提示词都与网络代码无关。

提示词 1 — 审计项目(只读):

只读,不修改代码。我的 Unity 项目使用了一个网络代码框架,我正在添加 Edgegap 對局配對,这将在运行时为我的客户端提供服务器地址(一个 FQDN)和外部端口。请找出并告诉我:1)启动客户端连接到服务器的方法、文件和行号,以及触发它的因素;2)在连接之前在哪里设置服务器地址和端口 — 确切的属性或字段名称、正在使用的传输协议以及文件和行号。请给出文件路径和行号。请勿更改任何内容。

对于 Mirror Tank 示例,审计确认客户端通过调用 Mirror 的 NetworkManager 上的 StartClient() 进行连接,地址通过 NetworkManager.singleton.networkAddress 设置,端口在活动的 PortTransport 上设置 — 在本例中是端口 7777 上的 KCP 传输协议。

提示词 2 — 添加连接:

在 Edgegap 示例 MatchmakingClientHandler.cs 中,找到在票证状态为 "HOST_ASSIGNED" 时运行的代码块。该代码块目前仅记录分配日志。请将该占位符替换为使用我的网络代码连接到分配的服务器的代码:读取分配的服务器的 FQDN 并将其设置为网络地址,读取外部端口(它是一个字符串 — 请将其转换为我的传输协议所期望的类型)并在活动传输协议上进行设置,然后启动客户端连接。使用您在上一步中确定的连接方法、地址字段和传输端口。返回完整的更新后的代码块。

助手读取项目,识别网络代码,并使连接适应它。同样的方法也适用于其他网络代码 — 审计和修改会适应项目使用的任何连接方法。唯一的例外是将连接通过其自定义网络层进行路由而不是直接调用网络代码的项目;审计会对此进行标记,您可以提示助手相应地调整修改。

第 3 部分 - 将处理程序连接到您的场景

在您的游戏场景中,创建一个空对象:从菜单中选择 GameObject,然后选择 Create Empty。将其重命名为 "Matchmaking"。选中该对象后,在 Inspector 中选择 Add Component,然后添加 Matchmaking Client Handler。

需要填写两个字段:Base URL 和 Auth Token。这两者都来自下一步创建的配对中心。将所有其他设置保持为默认值。

第 4 部分 - 创建您的对局配对器

在 Edgegap 平台上,选择 Matchmaker,然后选择 Create Matchmaker,并为其命名以供您自己参考,例如 "quickstart-dev"。

对于配置,不需要编写或粘贴任何内容。打开下拉菜单并选择 Simple Example — 这是一个专为双人对局准备的预置设置,非常适合坦克(Tank)游戏。选择它后会自动填充您最近上传的应用程序和版本。确认这些是您打算使用的应用程序和版本;如果您有多个版本,请现在选择正确的版本。

这一配置有两个部分值得了解,因为它们是以后定制對局配對的起点:

  • 对局规模规则(match size rule)设置需要多少玩家 — 这里是一个由两名玩家组成的队伍。

  • 延迟规则(latencies rule)让每个玩家 ping 一组共享的信标,并将测试结果足够接近、能够共享低延迟对局的玩家分到一组。服务器的位置是根据分组玩家的实际位置单独选择的。

提交时,可能会出现服务器镜像未缓存的警告。这是一个提醒:生产版本受益于缓存的镜像,以便服务器能够即时部署;对于测试来说,这没关系,因此请选择 Continue(继续)。对局配对器会在免费的共享集群上启动 — 请等待几分钟进行初始化,然后最多再等待五分钟使其在网络上可达。

在线后,打开其详细信息。复制 API URL,然后返回 Unity,将其粘贴到 Matchmaking 对象的 Base URL 字段中。对 Auth Token 执行相同的操作。

此令牌仅授予访问您的对局配对器的权限,而不授予访问您账户上其他任何内容的权限,因此在开发期间将其保留在客户端中是安全的 — 不需要后端。在生产环境中,您通常会将其保留在自己的后端。这样做并不是为了隐藏令牌(因为它是对局配对范围的,很安全),而是为了让玩家先在您的后端进行身份验证,让您在创建票证之前就能执行身份、封禁和基于技能的配对。

第 5 部分 - 测试

第 5 部分 - 测试

使用 Unity 的 Multiplayer Play Mode(已在专用服务器教程中介绍)模拟两名玩家,然后进入播放模式。

配对系统会寻找足够数量的玩家,将他们分组到一局比赛中,并在最靠近该分组的地区为他们部署一个全新的游戏服务器。服务器准备就绪后,会向每位玩家提供地址和端口,连接代码将自动连接他们。两名玩家均连接到同一个按需分配的专用服务器,无需任何人输入地址,并且每位玩家的坦克都会复制到另一位玩家的窗口中。

在构建生产版本时,请注意,在找到比赛后,新分配的服务器可能仍会启动短暂的时间。您可以选择让助手添加一个基本的连接重试,以弥补这一间隔;文档中提供了一个可选的独立重试提示。确切的结果取决于您的网络代码(netcode),但这是一个有用的起点。

第 6 部分 - 后续步骤

第 6 部分 - 后续步骤

这个简单示例虽然容易理解,但大多数游戏都需要自定义逻辑。接下来有两个步骤。

首先,探索适合您游戏类型的對局配對示例。文档中提供了现成的配置,适用于合作游戏、基于技能匹配的竞争游戏、社交游戏、自定义大厅以及回填(允许玩家继续加入已在进行中的对局)。

然后,一旦您选择了最接近的示例,请了解每个规则和参数的作用,以便完全根据您的游戏定制配对器——团队规模、地图、技能范围等。

您也可以加入我们在 Discord 上的社区,向我们的开发团队和其他工作室寻求帮助,以调整您的配对器。

第 7 部分 - 代码:要添加什么以及为什么

这个可选的深入研究涵盖了 AI 助手所做的代码更改。这几行代码是针对示例项目的,但这个想法对于任何网络代码都是通用的:获取配对器提供的地址和端口,将它们传递给您的网络系统并进行连接。这里的确切名称——Mirror 的 NetworkManager、其传输协议和 StartClient() 调用——都是特定于 Mirror Networking 的;无论网络代码如何,其结构都是完全相同的,因此请查看您自己的网络代码文档以获取等效项。

唯一需要编辑的文件是 Matchmaking Client Handler。对于这种基础设置,另外两个文件(服务器处理器和自定义票据请求)可以忽略。

唯一发生变化的块是在分配了服务器且票据状态变为 HOST_ASSIGNED 时运行的块。开箱即用,该示例仅记录服务器的详细信息:

csharp

// todo join game on pre-defined game port
Debug.Log($"joining game: {assignment.Current.Assignment.Ports["gameport"].Link}"

// todo join game on pre-defined game port
Debug.Log($"joining game: {assignment.Current.Assignment.Ports["gameport"].Link}"

// todo join game on pre-defined game port
Debug.Log($"joining game: {assignment.Current.Assignment.Ports["gameport"].Link}"

默认情况下,这会将服务器的详细信息打印到控制台,但不会进行连接,因为连接方式取决于您的网络代码。将其替换为:

csharp

var deployment = assignment.Current.Assignment;
string fqdn = deployment.Fqdn;
string externalPort = deployment.Ports["gameport"].External;

Debug.Log($"[Matchmaking] Host assigned: {fqdn}:{externalPort}. Connecting...");

Mirror.NetworkManager.singleton.networkAddress = fqdn;

if (Mirror.Transport.active is Mirror.PortTransport portTransport)
{
    portTransport.Port = ushort.Parse(externalPort);
}

Mirror.NetworkManager.singleton.StartClient

var deployment = assignment.Current.Assignment;
string fqdn = deployment.Fqdn;
string externalPort = deployment.Ports["gameport"].External;

Debug.Log($"[Matchmaking] Host assigned: {fqdn}:{externalPort}. Connecting...");

Mirror.NetworkManager.singleton.networkAddress = fqdn;

if (Mirror.Transport.active is Mirror.PortTransport portTransport)
{
    portTransport.Port = ushort.Parse(externalPort);
}

Mirror.NetworkManager.singleton.StartClient

var deployment = assignment.Current.Assignment;
string fqdn = deployment.Fqdn;
string externalPort = deployment.Ports["gameport"].External;

Debug.Log($"[Matchmaking] Host assigned: {fqdn}:{externalPort}. Connecting...");

Mirror.NetworkManager.singleton.networkAddress = fqdn;

if (Mirror.Transport.active is Mirror.PortTransport portTransport)
{
    portTransport.Port = ushort.Parse(externalPort);
}

Mirror.NetworkManager.singleton.StartClient

分配服务器时,配对器会返回两个重要的信息:服务器地址和要连接的端口。代码读取服务器地址(其 FQDN)和外部端口(玩家实际连接服务器所在的端口),将地址传递给 Mirror 的 NetworkManager,将端口传递给 Mirror 的传输层(使用 Parse 将端口从文本转换为数字,因为 Mirror 需要数字),然后启动客户端,该客户端使用刚刚设置的地址和端口连接玩家。这就是全部的更改:一个文件中的一个代码块。

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

立即开始集成!

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