如何为多人对战游戏添加匹配机制

关键洞察

关键洞察

关键洞察

Edgegap 的 匹配系统 是一个完全托管、无限可定制的匹配系统,能够最佳地将全球玩家分组——在您开发战斗类多人游戏期间使用是免费的。

它也是我们所知的 唯一的 匹配系统,具有 基于延迟的匹配规则,为您的游戏提供理想的在线多人体验,无论引擎是哪个(Unity、Unreal 等)或游戏服务(EOS、UGS、PlayFab、Heroic Labs、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
            }
          }
        }
      }
    }
  }
}

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

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

您现在可以继续下一步。

2. 探索配置

独特的格斗游戏规则

针对格斗游戏,您可以定义多个 對局配對档案 用于特定游戏模式的规则和设置:

  • 限制两名玩家之间的排名差异,以进行更随意的游戏,

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

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

  • 添加 枢纽选择UI 以限制对手到指定的 Ping 灯塔

  • 限制 對局配對延迟 为最大阈值,以防止匹配太远的玩家,

  • 限制 對局配對延迟 为最大的差异,以最大化ping的公平性,

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

  • 以组加入 用于预制的大厅或填充团队而不超过团队规模。

从理想条件开始, 扩展限制 以确保快速匹配:

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

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

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

创建排名较高的票据以用于晋级匹配,与更强的对手匹配。

为标记宕机或拥有大量审核报告的玩家定义 独立的作弊者档案 以确保他们不会对合法玩家在排名比赛中的体验造成负面影响。

语义版本控制

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

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

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

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

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

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

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

對局配對规则中初始规则集中的规则必须满足玩家的分组需求,每个由三个属性定义:

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

  • 规则类型,即操作员,例如 - 玩家数,

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

玩家数量规则

这是一个特殊规则,定义了需要匹配的玩家数量以启动分配:

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

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

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

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

延迟规则

使用此规则为所有玩家提供尽可能低的ping。一旦客户端测量并提交他们对所有可用灯塔的往返时间(ping),Gen2将仅考虑在ping值的特定 差异 内的匹配,测量于 Ping 灯塔。这提供了将您的玩家基础分裂为一个“软”的解决方案,允许与邻近地区匹配,尤其改善了人口较少地区的匹配速度。使用 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. 审查实例详情

初始化后,通过我们的仪表板审查您的新匹配器的详细信息:

状态 指示服务健康状态,可能为ONLINE, OFFLINE, or ERROR。

  • 标识符 帮助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- 这将自动加入您的请求中(见 服务器到服务器集成 中的替代选项),

  • 档案 指的是您的 對局配對档案

  • 属性 包括您的匹配器规则值,在本例中用于 延迟 规则,

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

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

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

  • id 是您的唯一对局配对票据ID,保存此ID以便稍后检查您的票据,

  • 档案 确认选择的 对局配对档案

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

    • 参见 以组加入 以与您的朋友或大厅进行配对,

  • player_ip 是玩家的公共IP地址,无论使用的身份验证方法如何,

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

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

  • 状态 指示票据的当前状态,所有票据以 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或带进度条的加载画面,以指示初始化正在进展。

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

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

确保您 的部署将被正确停止 使用 注入的删除URL,如果:

  • 没有玩家加入对局,

  • 所有玩家已离开对局,

  • 对局正确结束。

恭喜,您已经完成了Edgegap Matchmaker集成!如果您想了解更多,请在我们的学习中心中阅读相关内容。

书写者

Edgegap团队

Get your Game Online Easily & in Minutes

Get your Game Online Easily & in Minutes

Get your Game Online Easily & in Minutes