如何在虚幻引擎多人游戏中添加匹配机制

如何在多人Unreal游戏中添加匹配功能
如何在多人Unreal游戏中添加匹配功能
如何在多人Unreal游戏中添加匹配功能

关键洞察

关键洞察

关键洞察

Edgegap 的 匹配系统 是一个完全托管、无限自定义的匹配系统,能够优化全球玩家的分组——在开发你的休闲多人游戏期间使用是免费的。

这也是我们所知道的 唯一 拥有 基于延迟的匹配规则 的匹配系统,能够为你的游戏提供理想的在线多人体验,无论使用何种引擎(Unity、Unreal 等)或游戏服务(EOS、UGS、PlayFab、Heroic Labs Nakama、Braincloud 等)。

由于我们的匹配系统基于参数,因此无需编写代码。集成非常简单,如果需要,我们的 入门指南 将在每一步中指导你。

当你的游戏上线时,由于我们的匹配系统是完全托管的,你无需处理基础设施、错误、停机、可扩展性或数据库管理。我们会为你处理所有的事情。将你的 DevOps 工作负载减少到几乎为零。

如何将匹配系统集成到您的虚幻引擎多人游戏中

-> 本文基于 匹配文档。如果您遇到问题或不一致,请确保参考 原始指南,因为它们通常会保持最新。

以下示例将帮助您测试虚幻引擎多人游戏的核心匹配系统玩家流程,即:

  • 在共享托管集群上创建匹配实例,

  • 在您的匹配器配置中定义规则和设置,

  • 最后,使用我们的API测试玩家流程并管理玩家票证

将我们的匹配系统实现到您的游戏中有五个步骤

  1. 第一步是创建一个账户并使用我们的简单游戏示例。,您(技术上)已经完成一半!您只需将匹配系统集成到您的游戏中(见第5步)。

  2. 现在,您绝不应该盲目遵循您在互联网上找到的JSON示例,因此强烈建议您将上述规则调整为您的回合制游戏。第2步(“探索配置”)是我们的“如何阅读”,深入探讨每个 匹配系统规则功能(“探索配置”)。

  3. 第3步(“审查实例详细信息”)涵盖您个人特定的匹配器,以确保它已部署并与您游戏的设计相匹配。

  4. 第4步,如其名所示(“4. 测试票证API”),完全是关于测试来自玩家的匹配请求是否被匹配系统接收,这称为票证

  5. 第5步(“在您的游戏中集成匹配系统”)强调如何在您引擎的项目中集成匹配器。

如果您面临故障排除挑战,我们深入的学习中心提供额外的故障排除提示。

虚幻教程 - 添加Edgegap的匹配系统

如果这看起来令人生畏,我们为您提供支持 - 观看逐步集成视频:

1.设置免费Tier

注册您的免费Edgegap账户,并导航到 匹配器仪表板页面

从那里,首先点击 创建匹配器 ,然后输入:

  • 您的匹配器的名称 – 仅供您参考,例如 quickstart-dev

  • 然后,将以下简单示例作为JSON配置上传到您的虚幻引擎游戏中:

{
  "version": "2.1.0",
  "inspect": true,
  "max_deployment_retry_count": 3,
  "ticket_expiration_period": "5m",
  "ticket_removal_period": "1m",
  "profiles": {
    "simple-example": {
      "application": {
        "name": "my-game-server",
        "version": "2024.01.30-16.23.00-UTC"
      },
      "rules": {
        "initial": {
          "match_size": {
            "type": "player_count",
            "attributes": {
              "team_count": 1,
              "team_size": 2
            }
          },
          "beacons": {
            "type": "latencies",
            "attributes": {
              "difference": 50,
              "max_latency": 200
            }
          }
        },
        "expansions": {}
      }
    }
  }
}

(友情提示,请确保更改应用程序 name 和 version 以匹配您的 应用和版本!)

如果没有出现验证错误,点击 创建并启动 ,并等待过程完成。这将导致启动一个新的免费集群,其中包含您的简单示例匹配器。

您现在可以继续到下一步。

2. 探索配置

语义版本控制

当我们发布匹配器更新时,每个新版本都使用 语义版本控制 来清晰地传达更改的影响,解释格式 major.minor.patch

  • major 版本包括重大更改,需要进行集成审查,

  • minor 版本包括实质性的向后兼容改进,

  • patch 版本包括错误修复和小改进。

一些 部署可能导致错误。我们会尝试自动重试部署,最多 max_deployment_retry_count 次(无需客户端确认)。

为确保意外的客户端崩溃或被遗弃的票证不会持续占用您的匹配系统资源,票证将在 ticket_expiration_period 后被取消,状态将变更为 CANCELLED ,并在 ticket_removal_period 后被永久删除。

我们的匹配逻辑的核心配置在 匹配配置文件中。每个配置文件都是一个完全隔离的匹配队列,指向 应用版本 ,预定义所需的CPU和内存(RAM)资源数量。

匹配规则 在初始规则集中必须满足,玩家才能被分组在一起,每个规则由三个属性定义:

  • 您选择的名称,例如: 匹配大小

  • 规则类型,也称为操作符,例如: player_count

  • 最后是操作符属性,例如 team_count 或 team_size

玩家计数规则

这是一个特殊规则,定义有多少玩家需要匹配以启动分配:

  • team_count 指团队数量,1个团队可以用于合作或自由竞技模式,

  • team_size 指每个团队的 玩家数量。

我们的简单示例展示了一个有2名玩家的合作游戏。

请注意,“玩家计数”规则是必需的,并且只能在初始配置规则中定义一次

延迟规则

使用此规则来为所有玩家提供尽可能低的延迟。一旦客户端测量并提交其往返时间(延迟)与所有可用信标进行比较,Gen2将只考虑在特定 difference 延迟值范围内的匹配,这会与 延迟信标进行测量。这提供了一种“软”的方法来拆分玩家基础,实现与邻近地区的匹配,尤其提高了人口较少地区的匹配速度。使用 max_latency防止与远离的玩家进行匹配。

您现在可以继续到下一步。

我们的示例 信标 规则如下初始为: "difference": 50, "max_latency": 200

  • Alice和Bob将匹配,因为北京被丢弃(>200),而其余的在 | A-B | < 50内:

    • Alice {Montreal: 12.3, Newark: 45.6, Dallas: 59.9, 北京: 264.4}; 和

    • Bob {Montreal: 27.3, Newark: 32.4, Dallas: 23.1, 北京: 252.2}。

  • Charlie和Dave不会匹配,因为| C-D | > 50导致达拉斯信标:

    • Alice {Montreal: 5.7, Newark: 44.2, Dallas: 59.5, 北京: 263.2}; 和

    • Bob {Montreal: 57.8, Newark: 32.0, Dallas: 24.2, 北京: 272.3}。

请注意,“延迟规则”只能在初始配置规则中定义一次

3. 审查实例详细信息

审查您新匹配器的详细信息,当它初始化时在我们的仪表板中:

状态 指示服务健康状况,可能为在线、离线或错误。

  • 标识符 帮助Edgegap工作人员快速找到您的匹配器,如果您需要帮助排除故障。

  • 启动时间 可以用于追踪最新的更新时间。

  • 大小 对应于我们的 定价层之一。

  • API URL 将被游戏客户端和游戏服务器用于与Gen2进行通信。

  • Swagger URL 是我们提供的方便的openAPI规范GUI,用于浏览API架构。

  • 身份验证令牌 是游戏客户端和游戏服务器用于身份验证的唯一秘密令牌。

要使用API测试您的新匹配器,您将需要Swagger URL、API URL和身份验证令牌。

您可以继续到下一步。

4. 测试票证API

首先, 打开您的Swagger URL 以在swagger GUI中检查您的openAPI架构

点击“匹配器”标题下的/...swagger.json URL以打开原始JSON架构:

将此页面保存为您驱动器上的文件(CTRL/CMD+S)。

打开您的 Postman应用 并登录您的免费账户。

从上一步导入您的 swagger.json 文件:

  • 保持 Postman集合 选中,

  • 选择 查看导入设置 并将设置 参数生成 更改为 示例

确认导入,这将导致在左侧集合列表中出现一个新集合,标题为匹配器。

查看更多操作,打开选项卡 授权 并选择:

  • 授权类型 - API密钥

  • 密钥 - “授权

  • 值 - 在这里插入您的 身份验证令牌 值,

  • 添加到 - 头部

按下(CTRL/CMD+S)或保存图标以 保存更改。您Postman选项卡中的橙点应该消失。

在您的匹配器集合中,选择 票证 并 创建匹配票证,打开一个新选项卡。

选择 主体 选项卡以预览您的 玩家票证请求

注意 player_ip 设置为 null- 这将导致自动使用已经添加到您请求中的IP地址(请参阅 服务器到服务器集成 以获取替代方案),

  • profile 指代您的 匹配配置文件

  • attributes 包括您的匹配规则的值,在这种情况下为 延迟 规则,

    • 规则 player_count 是唯一不要求在玩家票证中包含任何属性的规则。

注意: 请确保参考示例的 Swagger导入配置

点击 发送 并查看您玩家票证请求的响应:

  • id 是您唯一的匹配票证ID,请保留此信息以便稍后检查您的票证,

  • profile 确认选择的 匹配配置文件

  • group_id 是分配给每张票证的唯一组ID,单个玩家被表示为1的组,

  • player_ip 是玩家的已解析公共IP地址,无论使用何种识别方法,

  • assignment 被设置为 null 以指示该票证尚未匹配或分配给服务器,

  • created_at 提供有关创建玩家票证的时间的信息,供游戏UI使用,

  • status 指示票证的当前状态,所有票证开始时为 SEARCHING (请参阅 匹配过程 以获取详细信息)。

通过再次点击 发送 创建第二个票证,以便我们的两名玩家匹配并启动一个服务器。

在您的匹配器集合中,选择 {ticketId} 并 读取匹配票证

输入上一步响应中的票证ID并点击 发送

查看您玩家票证的更新分配:

  • 状态首先变更为 MATCH_FOUND ,同时保持 assignment 设置为 null 以指示玩家已匹配且正在分配服务器,

再次点击 发送 以检查您的票证,并查看您玩家票证的更新分配:

  • 状态更改为 HOST_ASSIGNED ,并且 assignment 包含已分配服务器的详细信息。

 检查您在我们的仪表板中的新部署

  • 请注意,每个部署都标记了所有票证ID和配置文件,以增加可追溯性。

尝试从您的游戏客户端连接到已分配的服务器。

一旦您确认能够顺利连接到您的部署并完成测试,请 停止您的部署 以释放您账户中下一个构建的容量。

您现在可以继续到下一步。

5. 在您的游戏中集成匹配器

Edgegap的匹配系统集成:

  • 与 游戏客户端,以管理 玩家票证

  • 与 游戏服务器,以:

    • 处理通过其票证传递的玩家偏好,

    • 可选支持 补位 以在启动后添加或替换玩家。

在 游戏客户端中,我们建议在 匹配过程中 向玩家提供票证状态更新,使用游戏内的UI以获得最佳的玩家体验。参见:

在 游戏客户端中,确保您处理不可重试的错误:

  • HTTP 404 未找到 - 票证已被删除,

  • HTTP 500 内部服务器错误 - 服务暂时中断。

在 游戏服务器中,处理玩家偏好和初始服务器上下文。不需要API集成:

  1. 读取 注入环境变量(Gen2) 以检索初始玩家匹配数据。

  2. 读取 注入环境变量(应用版本) 以获取特定于版本的参数、设置(玩家容量)和机密。

  3. 读取 注入环境变量(部署) 以获取部署信息,例如IP地址、位置或更多。

一旦玩家连接, 游戏服务器和游戏客户端 开始加载场景以执行同步步骤(例如,选择和加载地图/场景/关卡)。我们建议使用完整的3D场景、类似大厅的社交UI或带有进度条的加载屏幕,以指示初始化正在进行。

一旦 游戏客户端 完全加载,玩家加载/前往主游戏场景。

可选地, 游戏服务器 可以创建和管理 补位 和玩家容量(添加或替换离开的玩家)。

确保您的 部署在以下情况下将被正确停止 使用 注入的DELETE_URL,如果:

  • 没有玩家加入比赛,

  • 所有玩家已离开比赛,

  • 比赛正确结束。

恭喜,您已经完成Edgegap匹配器集成!如果您想了解更多,请在我们的学习中心中了解全部。

书写者

Edgegap团队