如何为多人交易卡牌游戏添加匹配机制

关键洞察

关键洞察

关键洞察

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

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

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

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

如何将对局配对集成到您的多人交易卡片游戏 (TCG)

-> 本文基于 對局配對文档。如果您遇到问题或不一致之处,请务必参考 原始指南,因为它们更新的频率更高。

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

  • 在共享主机集群上创建匹配器实例,

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

  • 最后,使用我们的玩家票证测试玩家流程并管理它API

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

  1. 第一步是创建一个帐户并使用我们的 TCG 游戏示例。Voilà,您(技术上)完成了一半!您只需要将匹配器集成到您的游戏中(请参见第 5 步)。

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

  3. 步骤 3(“审查实例详细信息”)涵盖您的个人具体匹配器,以确保它已部署并与您的游戏设计相结合。

  4. 步骤 4,顾名思义(“4. 测试票证 API”),是关于测试玩家的對局配對请求是否被匹配器接收,称为票证

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

如果您遇到故障排除问题,我们的学习中心提供了更多故障排除提示。

1. 设置免费层

注册您的免费 Edgegap 帐户,并导航到 Matchmaker 仪表板页面

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

  • 匹配器的名称 - 仅供您参考,例如 quickstart-dev

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

独特的 TCG 游戏规则

专门针对 TCG 游戏,您可以为特定游戏模式的规则和设置定义多个 对局配对配置文件

  • 在两个玩家之间的差异内限制等级以便进行更休闲的游戏,

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

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

  • 添加 集线器选择 UI 以限制对手到指定的 Ping 信标

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

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

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

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

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

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

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

  • 增加扩展之间的时间以获得最高等级(挑战者),因为可用玩家较少。

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

定义单独的作弊者配置文件,以确保标记的作弊者或具有大量管理报告的玩家不会对公平玩家的排名赛体验产生负面影响。

语义化版本控制

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

  • major 版本包括破坏性更改并需要集成审查,

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

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

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

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

我們的對局配對邏輯的核心配置在 對局配對配置文件中。每個配置文件都是一個完全隔離的對局配對隊列,指向具有預定義的CPU和內存(RAM)資源量的應用版本

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

  • 自定义名称,例如 比赛大小

  • 规则类型,也称为操作符,例如 player_count

  • 最后是操作符属性,例如 team_count 或 team_size

玩家数量规则

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

  • team_count 指的是队伍数量,1 个团队可能用于合作或自由游戏模式,

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

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

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

延迟规则

使用此规则可以为所有玩家提供尽可能低的 ping 值。一旦客户端测量并提交他们相对于所有可用信标的往返时间(ping),Gen2 只会考虑匹配在特定Ping 信标内的difference 测量的 ping 值。这提供了一种“软”解决方案来分割玩家群体,允许与相邻地区进行匹配,尤其是提高较不发达地区的匹配速度。使用 max_latency防止与位置遥远的玩家匹配。

您现在可以进入下一步。

我们的示例 beacons 规则初始值为 "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. 审查实例详细信息

在初始化后,在仪表板中审查您的新匹配器的详细信息:

状态 表示服务健康状况,可能为在线、离线或错误。

  • 标识符 帮助 Edgegap 员工快速找到您的匹配器,如果您需要帮助进行故障排除。

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

  • 大小 对应于我们的一价格等级

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

  • Swagger URL 是我们提供的一个方便的 openAPI 规范 GUI,用于探索 API 模式。

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

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

您现在可以进入下一步。

4. 测试票证 API

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

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

将此页另存为文件(CTRL/CMD+S

打开您的 Postman 应用程序 并登录您的免费帐户。

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

  • 保持 Postman 收集 选中状态,

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

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

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

  • 认证类型 - API 密钥

  • 密钥 - “授权

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

  • 添加到 - Header

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

在 Matchmaker 集合中,选择 票证 和 创建對局配對票证,打开一个新标签页。

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

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

  • profile 指的是您的 對局配對配置文件

  • attributes 包括匹配器规则的值,在本例中为 延迟 规则,

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

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

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

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

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

  • group_id 是每个票证发放的唯一组 ID,单个玩家被表示为1人队伍,

    • 请参见 加入小组 以与您的朋友或大厅一起进行對局配對,

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

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

  • created_at 提供有关何时为游戏 UI 创建玩家票证的信息,

  • status 指示票证的当前状态,所有票证都以 SEARCHING 开始(请参见 對局配對过程 了解详细信息)。

通过再次点击 发送 创建第二张票证,因此我们的两位玩家匹配并启动了一个服务器。

在 Matchmaker 集合中,选择 {ticketId} 和 读取對局配對票证

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

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

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

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

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

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

  • 注意每次部署都带有所有票证 ID 和配置文件的标签,以增强可追溯性。

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

一旦您确认能够在您的部署中无障碍连接并完成测试,停止您的部署以便在您的帐户中为下一个构建释放容量。

您现在可以进入下一步。

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

Edgegap 的對局配對集成:

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

  • 与 游戏服务器 ,以:

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

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

对于 游戏客户端 ,我们建议通过在游戏 UI 中提供票证状态更新来改善玩家体验。请参阅:

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

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

  • HTTP 500 Internal Server Error - 临时服务中断。

在 游戏服务器 中,处理玩家偏好和初始服务器上下文。无需 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