如何为多人策略游戏添加 matchmaking

关键洞察

关键洞察

关键洞察

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(“将匹配系统集成到您的游戏中”)强调了如何在您的引擎项目中集成匹配器。

如果您有故障排除的问题,我们深入的 学习中心 提供了额外的故障排除提示。

1. 设置免费层

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

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

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

  • 然后,上传以下简单示例作为您的策略游戏的 JSON 配置:

{
  "version": "1.0.0",
  "max_deployment_retry_count": 3,
  "ticket_expiration_period": "5m",
  "ticket_removal_period": "1m",
  "profiles": {
    "casual-example": {
      "application": {
        "name": "my-game-server=>CHANGE-THIS-NAME-HERE",
        "version": "2024.01.30-16.23.00-UTC=>CHANGE-THIS-HERE "
      },
      "rules": {
        "initial": {
          "match_size": {
            "type": "player_count",
            "attributes": {
              "team_count": 2,
              "team_size": 5
            }
          },
          "beacons": {
            "type": "latencies",
            "attributes": {
              "difference": 25,
              "max_latency": 100
            }
          },
          "league_rank": {
            "type": "number_difference",
            "attributes": {
              "max_difference": 1
            }
          },
          "selected_maps": {
            "type": "intersection",
            "attributes": {
              "overlap": 1
            }
          },
          "selected_beacons": {
            "type": "intersection",
            "attributes": {
              "overlap": 1
            }
          }
        },
        "expansions": {
          "10": {
            "beacons": {
              "difference": 40,
              "max_latency": 150
            }
          },
          "30": {
            "beacons": {
              "difference": 50
            }
          },
          "60": {
            "league_rank": {
              "max_difference": 2
            }
          },
          "180": {
            "beacons": {
              "difference": 100,
              "max_latency": 500
            }
          }
        }
      }
    },
    "competitive-example": {
      "application": {
        "name": "my-game-server",
        "version": "2024.01.30-16.23.00-UTC"
      },
      "rules": {
        "initial": {
          "match_size": {
            "type": "player_count",
            "attributes": {
              "team_count": 2,
              "team_size": 5
            }
          },
          "beacons": {
            "type": "latencies",
            "attributes": {
              "difference": 25,
              "max_latency": 100
            }
          },
          "league_rank": {
            "type": "number_difference",
            "attributes": {
              "max_difference": 0
            }
          },
          "selected_maps": {
            "type": "intersection",
            "attributes": {
              "overlap": 1
            }
          },
          "selected_beacons": {
            "type": "intersection",
            "attributes": {
              "overlap": 1
            }
          }
        },
        "expansions": {
          "30": {
            "beacons": {
              "difference": 40,
              "max_latency": 150
            }
          },
          "60": {
            "beacons": {
              "difference": 50
            }
          },
          "180": {
            "beacons": {
              "max_latency": 250
            }
          }
        }
      }
    },
    "challenger-example": {
      "application": {
        "name": "my-game-server",
        "version": "2024.01.30-16.23.00-UTC"
      },
      "rules": {
        "initial": {
          "match_size": {
            "type": "player_count",
            "attributes": {
              "team_count": 2,
              "team_size": 5
            }
          },
          "beacons": {
            "type": "latencies",
            "attributes": {
              "difference": 25,
              "max_latency": 100
            }
          },
          "league_rank": {
            "type": "number_difference",
            "attributes": {
              "max_difference": 0
            }
          },
          "selected_maps": {
            "type": "intersection",
            "attributes": {
              "overlap": 1
            }
          },
          "selected_beacons": {
            "type": "intersection",
            "attributes": {
              "overlap": 1
            }
          }
        },
        "expansions": {
          "30": {
            "beacons": {
              "difference": 40,
              "max_latency": 150
            }
          },
          "180": {
            "beacons": {
              "difference": 50
            }
          },
          "240": {
            "beacons": {
              "max_latency": 250
            }
          }
        }
      }
    }
  }
}

(温馨提示,请确保更改应用程序 名称 和 版本 以匹配您的 应用和版本!)

如果没有验证错误,单击 创建并开始 ,然后等待过程完成。这将导致一个新的免费集群启动,带有您的简单示例匹配器。

您现在可以继续下一步。

2. 探索配置

独特的策略游戏规则

特别针对策略游戏,您可以定义多个 匹配配置文件 以适应游戏模式特定的规则和设置:

  • 限制两名玩家之间的排名差异以用于更多休闲的游戏,

  • 限制排名差异,仅允许排名相同的对手用于排名游戏,

  • 让玩家提供他们的地图偏好,并选择适合每个人的地图,

  • 添加 中心选择界面 以限制对手到指定的 延迟信标

  • 限制 匹配延迟 到最大阈值,以防止匹配远离的玩家,

  • 将 匹配延迟 限制在最大差异内,以最大限度地提高 Ping 公平性,

  • 在允许更多玩家时,使用不同的 应用版本 分配更多 CPU 或内存,

  • 作为组加入 用于预设大厅或填补不超过团队规模的队伍。

首先设定理想条件,并 扩展限制 以确保快速匹配:

  • 随着时间推移,逐步放宽延迟限制以找到更多玩家,

  • 逐步增加允许的排名差异以找到更多玩家,

  • 对于最高排名(挑战者),在扩展之间增加时间,因为可用玩家较少。

创建更高排名的票据以进行晋升匹配,以匹配更强的对手。

定义 单独的作弊者配置文件 以确保被标记的作弊者或具有高数量的管理报告的玩家不会对合法玩家在排名游戏中的体验产生负面影响。

语义版本控制

每个新版本使用 语义版本控制 以通过解释格式 major.minor.patch 清晰传达更改的影响:

  • major 版本包括重大更改并需要集成审核,

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

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

一些 部署可能导致错误。我们将通过自动重试部署最多 max_deployment_retry_count 次来尝试解决此问题(无需客户端确认)。

为了确保意外的客户端崩溃或被放弃的票据不会滞留并占用您的匹配器资源,票据将在 ticket_expiration_period 后被取消,使其状态更改为 已取消 ,然后在 ticket_removal_period 后永久删除。

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

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

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

  • 规则类型,也称为操作符,例如 - 玩家数量

  • 最后是操作符属性,例如 团队数量 或 团队大小

玩家数量规则

这是一个特殊规则,定义需要多少玩家匹配才能开始分配:

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

  • 团队大小 指的是每个团队的玩家数量。

我们的简单示例演示了一个由2名玩家组成的合作游戏。

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

延迟规则

使用此规则为所有玩家提供尽可能低的延迟。当客户端测量并提交他们与所有可用信标的往返时间(延迟)时,Gen2将仅考虑符合特定 差异 的延迟值,这些值是针对 延迟信标 测量的。这提供了一种“软”解决方案来分割您的玩家基础,使得可以与邻近区域配对,特别是改善人烟稀少区域的匹配速度。使用 max_latency来防止与远离的玩家匹配。

您现在可以继续下一步。

我们的示例 信标 规则以上设定了 "difference": 50, "max_latency": 200 初步:

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

    • Alice {蒙特利尔: 12.3, 纽瓦克: 45.6, 达拉斯: 59.9, 北京: 264.4}; 和

    • Bob {蒙特利尔: 27.3, 纽瓦克: 32.4, 达拉斯: 23.1, 北京: 252.2}。

  • Charlie 和 Dave 将不匹配,因为对于达拉斯信标 | C-D | > 50:

    • Alice {蒙特利尔: 5.7, 纽瓦克: 44.2, 达拉斯: 59.5, 北京: 263.2}; 和

    • Bob {蒙特利尔: 57.8, 纽瓦克: 32.0, 达拉斯: 24.2, 北京: 272.3}。

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

3. 检查实例细节

在仪表板中检查您新匹配器的细节,一旦它被初始化:

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

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

  • 启动于 可能对跟踪最新更新时间有用。

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

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

  • Swagger URL 是我们提供的方便的 openAPI 规范 GUI,用以探索 API 架构。

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

要使用 API 测试您的新匹配器, 您将需要 Swagger URL、API URL 和授权令牌

您现在可以继续下一步。

4. 测试票据 API

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

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

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

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

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

  • 保持 Postman 集合 已选中,

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

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

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

  • 授权类型 - API 密钥

  • 密钥 - “授权

  • 值 - 在此处插入您的 AuthToken 值,

  • 添加到 - 头部

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

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

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

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

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

  • attributes 包含您的匹配器规则的值,在本例中为 延迟 规则,

    • 规则 玩家数量 是唯一一个在玩家票据中不需要任何属性的规则。

注意: 请确保参考样本的 Swagger 导入配置

单击 发送 并查看对您的玩家票据请求的响应:

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

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

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

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

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

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

  • status 表示票据的当前状态,所有票据开始时处于 搜索中 状态(请参见 匹配流程 以获取详细信息)。

通过再次单击 发送 来创建第二张票据,以便我们的两个玩家匹配并启动服务器。

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

输入上一步响应中的票据 ID,然后单击 发送

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

  • 状态首次更改为 找到匹配 ,同时保持 assignment 设置为 null 以指示玩家已经匹配并且正在分配服务器,

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

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

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

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

尝试从您的游戏客户端连接到指定的服务器。

一旦您验证可以无障碍连接到您的部署并完成测试, 停止您的部署 以释放您账户中的容量以用于下一个构建。

您现在可以继续下一步。

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

Edgegap 的匹配系统集成:

  • 与 游戏客户端 配合,管理 玩家票据

  • 与 游戏服务器配合,:

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

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

在 游戏客户端 中,我们建议在 匹配流程 期间,通过游戏内 UI 为玩家提供票据状态更新以获得最佳玩家体验。请见:

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

  • HTTP 404 找不到 - 票据已被删除,

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

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

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

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

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

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

一旦 游戏客户端 完全加载,玩家将加载/旅行到主要游戏场景。

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

确保您的 部署将在 符合以下条件时妥善停止:

  • 没有玩家加入比赛,

  • 所有玩家已离开比赛,

  • 比赛正确结束。

恭喜,您已完成 Edgegap 匹配器集成!如果您想了解更多信息,请在我们的 学习中心 阅读所有内容。

书写者

Edgegap团队

Get your Game Online Easily & in Minutes

Get your Game Online Easily & in Minutes