如何为多人射击游戏添加 matchmaking

关键洞察

关键洞察

关键洞察

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
            }
          }
        }
      }
    }
  }
}

(友善提醒请确保更改应用程序的 名称 和 版本 以匹配您的 应用程序和版本!)

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

您现在可以继续下一步。

2. 探索配置

独特的射击游戏规则

专为运动游戏设计,您可以为特定游戏模式的规则和设置定义多个 对局配对档案

  • 在两个玩家之间限制排名差距,以便更随意的游戏,

  • 限制排名差距,仅允许具有相同等级的对手进行排名比赛,

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

  • 添加 中心选择 UI 来限制对手在指定的 Ping 信标中,

  • 将 对局配对延迟 限制为最大阈值,以防止匹配远距离的玩家,

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

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

  • 以组的形式加入 预制大厅或无需超出团队规模即可填满团队。

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

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

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

  • 增加扩展之间的时间,以让更高等级(挑战者)的人有更多时间,因为可用玩家较少。

通过与更强对手匹配来为晋升比赛创建更高排名的票据。

定义 单独的作弊者档案 以确保被标记的作弊者或收到大量管理报告的玩家不会在排名比赛中负面影响合法玩家的体验。

语义版本控制

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

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

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

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

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

为确保意外的客户崩溃或遗留票据不会持续占用您的对局配对资源,票据将在 ticket_expiration_period 后取消,其状态将更改为 CANCELLED 并在 ticket_removal_period 后永久删除。

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

初始规则集中必须满足的对局配对规则用于将玩家分组,每个规则由三个属性定义:

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

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

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

玩家数量规则

这是一个定义需要多少玩家进行匹配以开始分配的特殊规则:

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

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

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

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

延迟规则

使用此规则为所有玩家提供最低可能的延迟。一旦客户端测量并提交他们对所有可用信标的往返时间(ping),Gen2 只会考虑在指定 差异 内的匹配,针对 Ping 信标进行测量。这是一个“软”解决方案,能够匹配邻近地区,特别是为人口较少的地区提高匹配速度。使用 max_latency防止与距离较远的玩家匹配。

您现在可以继续下一步。

我们的示例中的 信标规则与最初的 "difference": 50, "max_latency": 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. 检查实例详细信息

一旦初始化后,在我们的仪表板中查看您的新对局配对的详细信息:

状态 指示服务健康,可以是 ONLINE, OFFLINE 或 ERROR。

  • 标识符 帮助 Edgegap 员工在您需要故障排除帮助时快速找到您的对局配对。

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

  • 尺寸 对应于我们的 定价等级之一。

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

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

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

要使用 API 测试您的新对局配对,您将需要 Swagger URL, API URL 和身份验证令牌

您现在可以继续下一步。

4. 测试票据 API

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

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

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

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

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

  • 保持Postman 集合 选中,

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

确认导入,这将在左侧的集合列表中出现一个名为对局配对的新集合。

查看更多操作,打开授权 标签并选择:

  • 认证类型 - API Key

  • 密钥 - “Authorization

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

  • 添加到 - 头部

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

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

选择正文 标签以预览您的 玩家票据请求

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

  • 档案 指代您的 对局配对档案

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

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

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

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

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

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

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

  • player_ip 玩家的公共 IP 地址,无论使用的标识方法如何

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

  • created_at 提供有关何时为游戏用户界面使用创建玩家票据的信息,

  • status 指示票据的当前状态,所有票据开始于 搜索 (请参见 对局配对过程 以获取详细信息)。

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

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

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

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

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

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

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

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

  • 注意每个部署都标记有所有票据 ID 和档案,以增加可追溯性。

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

一旦您验证可以连接到您的部署而不存在问题,并完成测试,停止您的部署 以释放账户中的容量以进行下一个版本。

您现在可以继续下一步。

5. 将对局配对集成到您的游戏中

Edgegap 的对局配对集成:

  • 与 游戏客户端 集成,以管理 玩家票据

  • 与 游戏服务器 集成,以:

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

    • 可选地支持 填充 以在开始后添加或替换玩家。

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

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

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

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

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

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

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

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

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

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

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

确保您的 部署将被正确停止 使用 注入的 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