如何在多人第一人称射击(FPS)游戏中添加匹配机制

关键洞察

关键洞察

关键洞察

Edgegap 的 匹配系统 是一个全面管理、无限可定制的匹配系统,可以优化全球玩家的分组——在开发您第一人称射击多人游戏时,其使用是免费的。

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

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

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

如何在多人第一人称射击(FPS)游戏中集成对局配对

-> 本文基于 對局配對文档。 如果您遇到问题或差异,请确保参考 原始指南,因为它们更频繁地得到更新。

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

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

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

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

将我们的配对器实施到您的游戏中有五个步骤

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

  2. 现在,您绝不应该盲目地遵循互联网上找到的 JSON 示例,因此强烈建议将上述规则适应于您的游戏。 步骤 2(“探索配置”)是我们的“如何阅读”,深入探讨每个對局配對规则功能(“探索配置”)。

  3. 第3步(“查看实例详细信息”)涵盖您个人的,特定的配对以确保它与您的游戏设计一起部署和运行。

  4. 步骤4,顾名思义(“4. 测试票 API”),完全围绕测试您的玩家请求通过對局配對接收,称为

  5. 步骤5(“将对局配对集成到您的游戏中”)重点介绍如何在您的引擎项目中集成匹配器。

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

1. 设置免费层

注册您的免费 Edgegap 帐户,并导航至 配对仪表板页面

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

  • 匹配器的名称 - 这纯粹是为了您自己的参考,例如 quickstart-dev

  • 然后,上传以下简单示例作为您 FPS 游戏的 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. 探索配置

独特的FPS游戏规则

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

  • 限制排名仅在两名玩家之间的差异范围内,以便于更休闲的游戏,

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

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

  • 添加 枢纽选择用户界面 以限制对手到指定的 延迟信标

  • 将 对局配对延迟 限制在一个最大阈值以内,以防止匹配到太远的玩家,

  • 将 对局配对延迟 限制在最大差异范围内,以最大化延迟公平性,

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

  • 组队加入 用于预制游戏厅或在不超出队伍规模的情况下填补队伍。

从理想条件开始,并 逐步拓展限制 以确保快速比赛:

  • 随着时间的推移逐渐放松延迟限制以寻找更多玩家,

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

  • 在最高等级(挑战者)之间增加扩展时间,因为玩家较少。

以较高排名创建票以进行晋升比赛,以应对更强的对手。

定义 单独的作弊者档案 以确保标记为作弊者或受到高次数管理报告的玩家不会在排名比赛中对合法玩家的体验产生负面影响。

语义版本控制

每个新版本使用 语义版本控制 通过解释格式 主.次.修补来明确传达更改的影响:

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

  •  版本包含向后兼容的重大改进,

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

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

为确保意外的客户崩溃或被遗弃的票不会长时间停留并占用您的配对资源,票将在 票据有效期 后被取消,导致其状态变为 已取消,然后在 票删减期 后永久删除。

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

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

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

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

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

玩家数量规则

这是定义需要多少玩家配对以发起分配的特殊规则:

  • 队伍数量 指的是队伍数量,1 队可用于合作或自由模式,

  • 队伍规模 指的是每队的玩家数量

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

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

延迟规则

使用此规则为所有玩家提供最低的可能延迟。 一旦客户测量并提交他们相对所有可用信标的往返时间(延迟),Gen2 将仅考虑延迟值在特定 差异范围内的比赛,这些值相对于 延迟信标。 这提供了一种“软”方案来分裂您的玩家库,从而支持与邻近地区的匹配,特别是改善了人口较少地区的匹配速度。 使用 最大延迟来防止匹配到较远的玩家。

您现在可以继续下一步。

我们的示例 信标 规则如下,初始值为 "差异": 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 员工快速找到您的匹配器,如果您需要帮助解决问题。

  • Started at 可以帮助跟踪最新的更新时间。

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

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

  • Swagger URL 是我们提供的开放API规范 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地址(参见服务器到服务器集成了解替代方案),

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

  • 属性 包括您匹配器规则的值,此例为 延迟 规则,

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

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

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

  • id 是您独有的对局配对票ID,保存以便之后检查您的票,

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

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

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

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

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

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

  • status 指示票当前的状态,所有票都以 搜索中 开始(了解详细信息,请参见 对局配对流程)。

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

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

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

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

  • 状态更改为 找到匹配 ,而 assignment 仍然为 null,表示玩家已成功匹配并正在被分配服务器,

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

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

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

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

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

一旦您验证能够无问题地连接到您的部署并且测试完成,停止您的部署 以在您的帐户中为下一个版本释放容量。

您现在可以继续下一步。

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

Edgegap 的對局配對集成:

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

  • 与 游戏服务器,来:

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

    • 选择性地支持 回填 以在开始后添加或替换玩家。

对于游戏客户端,我们建议使用游戏内界面向玩家提供整个对局配对流程的票状态更新,以获得最佳的玩家体验。 参见:

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

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

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

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

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

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

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

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

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

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

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

  • 没有玩家加入比赛,

  • 所有玩家已离开比赛,

  • 比赛正确结束。

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

Get your Game Online Easily & in Minutes

Get your Game Online Easily & in Minutes

Get your Game Online Easily & in Minutes