如何为多人体育游戏添加匹配功能

关键洞察

关键洞察

关键洞察

Edgegap 的 匹配系统 是一个完全管理的、无限可定制的匹配系统,可以最佳地将全球玩家分组——而且在开发您的多人运动游戏期间,它的使用是免费的。

它也是 唯一的 匹配系统(我们所知)具有 基于延迟的匹配规则,为您的游戏提供理想的在线多人体验,无论是引擎(Unity、Unreal 等)还是游戏服务(EOS、UGS、PlayFab、Heroic Labs Nakama、Braincloud 等)。

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

当您的游戏上线时,由于我们的匹配系统是完全管理的,您无需处理基础设施、错误、故障、可扩展性或数据库管理。我们会为您处理所有这些,几乎将您的 DevOps 工作量减少到零。

如何将对局配对集成到您的多人在线体育游戏中

-> 本文基于對局配對文档。如果您遇到问题或差异,请务必参考原始指南,因为它们更经常更新。

以下示例将帮助您测试核心对局配对玩家流程,主要包括:

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

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

  • 最后,通过我们的玩家票API测试玩家流并进行管理。

要将我们的配对实现到您的游戏中,有五个步骤

  1. 第一步是创建一个账户并使用我们的战略游戏示例。Voilà,您(在技术上)已经完成了一半!您只需要将配对集成到您的游戏中(见步骤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 版本包括错误修复和小改进。

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

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

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

对局配对规则 在初始规则集中必须得到满足,才能将玩家组成一组,每条规则由三个属性定义:

  • 您选择的名称,例如- 比赛大小

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

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

玩家数量规则

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

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

  • 团队规模 指的是 每队玩家数。

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

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

延迟规则

使用此规则为所有玩家提供最低可能的ping。一旦客户端测量并提交他们对所有可用信标的往返时间(ping),Gen2只考虑在一个特定范围内的ping值之差的比赛,测量针对信标ping。这提供了一个“软”解决方案来分拆您的玩家群体,允许与邻近地区匹配,特别是在较少人口的地区提高比赛速度。使用 max_latency防止匹配到距离较远的玩家。

您现在可以继续下一步。

我们的示例 信标 规则在最初阶段使用 "差异": 50, "最大延迟": 200

  • 艾丽斯和鲍勃将匹配,因为北京被舍弃(>200),其余部分在 | A-B | < 50 范围内:

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

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

  • 查理和戴夫将无法匹配,因为 | C-D | > 50 对于达拉斯信标:

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

    • 戴夫 {蒙特利尔: 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密钥,

  • 键 - “授权

  • 值 - 在此插入您的 认证令牌

  • 添加到 - Header

按下(CTRL/CMD+S)或保存图标来 保存更改。您在Postman标签中的橙色点应消失。

在您的配对集合中选择 票证 和 创建对局配对票证,打开一个新标签。

选择标签 主体 以预览您的 玩家票证请求

注意 玩家_ip 设置为 null - 这将导致自动将IP地址添加到您的请求(有关替代方案,请参见 服务器到服务器集成),

  • 配置文件 指向您的 對局配對配置文件

  • 属性 包括配对规则的值,在本例中是对于 延迟 规则,

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

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

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

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

  • 配置文件 确认對局配對配置文件的选择,

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

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

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

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

  • 状态 指示票证的当前状态,所有票证从搜索中开始(有关详细信息,请参见對局配對过程)。

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

在您的配对集合中,选择{ticketId}和 读取对局配对票证

输入上一步骤中的响应中的票证ID,然后点击 发送

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

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

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

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

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

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

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

一旦您确认能够连接到您的部署且测试无问题后,停止您的部署以释放账户的容量以进行下一个构建。

您现在可以继续下一步。

5. 在您的游戏中集成配对

Edgegap的對局配對集成:

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

  • 与 游戏服务器配合,以:

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

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

对于 游戏客户端,我们建议通过游戏中UI在整个對局配對过程中向玩家提供票证状态更新,以获得最佳玩家体验。请参见:

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

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

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

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

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

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

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

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

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

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

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

  • 没有玩家加入比赛,

  • 所有玩家都已离开比赛,

  • 比赛正确结束。

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

书写者

Edgegap团队

Get your Game Online Easily & in Minutes

Get your Game Online Easily & in Minutes

Get your Game Online Easily & in Minutes