如何为多人策略游戏添加 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. 探索配置

独特的战略游戏规则

针对战略游戏,您可以定义多个 对局配对配置文件 用于特定游戏模式的规则和设置:

  • 限制两名玩家排名差距以进行更休闲的游戏,

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

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

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

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

  • 限制 对局配对延迟 到最大的差异以最大化Ping公平性,

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

  • 以组加入 预制的大厅或在不超过队伍大小的情况下填充队伍。

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

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

  • 随时间推移逐渐增加可允许的排名差距以找到更多玩家,

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

创建具有更高等级的票证以便晋级比赛,与更强的对手匹配。

定义 单独的作弊者配置文件 以确保标记的作弊者或收到大量违规报告的玩家不会对竞争比赛中的正当玩家体验产生负面影响。

语义版本控制

每个新版本使用 语义版本控制 通过解释格式 大版本.小版本.补丁 来清楚地传达变更的影响:

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

  • 小版本 包括大量向后兼容的改进,

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

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

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

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

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

  • 您选择的名称,例如 - 比赛规模

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

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

玩家数量规则

这是一个特别的规则,定义了需要多少玩家以启动分配:

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

  • 队伍大小 指的是 每队玩家数量

我们的简单示例展示了一个由2名玩家参与的合作游戏。

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

延迟规则

使用这个规则为所有玩家提供最低的可能延迟。一旦客户端测量并提交了他们的往返时间(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以在swagger界面中检查您的openAPI架构

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

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

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

导入您之前步骤中的 swagger.json 文件:

  • 保持 Postman收集 选中,

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

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

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

  • 验证类型 - API密钥

  • 键 - “Authorization

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

  • 添加到 - 标头

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

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

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

注意 player_ip 设置为 null - 这将导致使用自动添加到请求中的IP地址(见 服务至服务集成 了解替代方案),

  • 配置文件 指您的 对局配对配置文件

  • 属性 包括您对局配对规则的值,在这种情况下,为 延迟 规则,

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

注意:请务必参考示例的Swagger的导入配置

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

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

  • 配置文件 确认选择了 对局配对配置文件

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

    • 请参见 以组加入 了解与您的朋友或大厅的配对。

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

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

  • created_at 提供有关何时创建玩家票证的信息用于游戏用户界面显示,

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

通过再次点击 发送 创建第二个票证,这样我们的两个玩家就会匹配,一个服务器被启动。

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

输入上一步响应中的票证ID并点击 发送

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

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

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

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

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

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

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

一旦您验证可以没有问题地连接到您的部署并完成测试,停止您的部署以释放您帐户中的下一次构建容量。

您现在可以继续进行下一步。

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

Edgegap的对局配对集成:

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

  • 与 游戏服务器,以:

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

    • 可选地支持 补位 在开始后添加或替换玩家。

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

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

  • HTTP 404 Not Found - 票证已被删除,

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

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

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

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

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

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

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

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

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

  • 没有玩家加入比赛,

  • 比赛中的所有玩家已离开,

  • 比赛正确结束。

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

书写者

Edgegap团队

Get your Game Online Easily & in Minutes

Get your Game Online Easily & in Minutes

Get your Game Online Easily & in Minutes