如何为第三人称射击(TPS)多人游戏添加 matchmaking

关键洞察

关键洞察

关键洞察

Edgegap 的 配对系统 是一个完全管理的、无限自定义的配对系统,能够最优地将全球玩家分组——在开发您的第三人称射击多人游戏期间使用它是免费的。

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

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

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

如何将對局配對集成到您的第三人称射击(TPS)多人游戏中

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

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

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

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

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

五个步骤可以将我们的对战配对实现到您的游戏中:

  1. 第一步是创建一个账户并使用我们的TPS游戏示例。Voilà,您(技术上)已经完成一半!您只需将对战配对集成到您的游戏中(参见步骤5)。

  2. 现在,您切勿盲目遵循在互联网上找到的JSON示例,因此强烈建议您根据您的游戏调整上述规则。步骤2(“探索配置”)是我们的“如何阅读”,深入了解每个 對局配對规则的功能(“探索配置”)。

  3. 步骤3(“审查实例详细信息”)涵盖您的个人、特定对战配对,以确保它已经部署并能够与您的游戏设计配合工作。

  4. 步骤4,如名字所暗示(“4. 测试票据API”),专注于测试来自玩家的对战配对请求被对战配对接收,称为票据

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

如果您遇到故障排除挑战,我们的深入学习中心还有其他故障排除提示。

1. 设置免费层

注册您的免费Edgegap账户,然后导航到对战配对仪表板页面

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

  • 对战配对的名称——这纯粹是为了您的参考,例如quickstart-dev

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

独特的TPS游戏规则

专门为第三人称射击游戏,您可以为特定游戏模式规则和设置定义多个對局配對档案

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

  • 限制等级差异仅允许具有相同等级的对手参加排名游戏,

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

  • 添加枢纽选择界面以将对手限制在指定的Ping Beacons

  • 對局配對延迟限制为最大阈值,以防止与远处玩家配对,

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

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

  • 以组名加入以实现预制大厅或填补队伍而不超过队伍大小。

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

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

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

  • 增加高等级(挑战者)之间间隔的时间,因为可用的玩家较少。

创建更高等级的票据以进行晋升比赛,与更强大的对手匹配。

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

语义化版本控制

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

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

  • 小版本包括从后兼容的实质改进,

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

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

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

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

初始规则集中的对战配对规则必须符合玩家组队条件,每个规则由三个属性定义:

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

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

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

玩家数量规则

这是一个特殊的规则,定义了匹配多少名玩家才能启动指派:

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

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

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

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

延迟规则

使用此规则为所有玩家提供尽可能低的ping值。一旦客户端测量并提交了对所有可用信标的往返时间(ping),Gen2将只考虑在特定差异内的匹配,测量基于Ping信标。这为分割玩家群体提供了一个“软性”解决方案,允许与邻近地区配对,特别是改善了人口较少地区的匹配速度。使用max_latency防止与远处玩家匹配。

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

我们的示例信标规则在上面与"差异": 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. 审查实例详细信息

在初始化后,请在我们的仪表板中审查您的新对战配对的详细信息:

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

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

  • 启动于可以帮助跟踪最近的更新时间。

  • 大小对应于我们的价格层级之一。

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

  • Swagger URL是我们提供的一个便捷的openAPI规范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 Collection选中,

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

确认导入,这将导致一个新系列显示在左侧目录列表中,标题为对战配对。

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

  • 认证类型 - API Key

  • 键 - “授权

  • 值 - 在此处输入您的认证令牌值,

  • 添加到 - 头部

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

在您的对战配对集合中,选择票据创建一个对战配对票据,打开一个新选项卡。

选择正文选项卡以预览您的玩家票据请求

注意player_ip设置为null - 这将导致使用自动添加到您的请求的IP地址(更多详细信息请参阅服务器到服务器集成),

  • 配置文件指的是您的对战配对档案

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

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

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

点击发送并审核响应您的玩家票据请求:

  • id是您独特的對局配對票据ID,请保存以便稍后查询您的票据,

  • 配置文件确认选择的对战配对档案

  • 组ID是为每张票据发布的唯一组ID,单个玩家表示为1组,

    • 请参见按组加入以与朋友或大厅进行對局配對,

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

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

  • created_at提供关于玩家票据创建时间的信息,以便游戏UI使用,

  • 状态指示当前票据的状态,所有票据从搜索中开始(详细信息参见对战配对过程)。

通过再次点击发送创建第二张票据,这样我们的两名玩家将匹配并启动一个服务器。

在您的对战配对集合中,选择{票据ID}读取对战配对票据

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

审核您的玩家票据的更新分配:

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

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

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

 在我们仪表板中查看新部署

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

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

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

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

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

Edgegap的對局配對集成:

  • 游戏客户端一起,管理玩家票据

  • 游戏服务器一起:

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

    • 选择性支持补位以在开始后添加或替换玩家。

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

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

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

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

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

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

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

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

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

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

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

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

  • 没有玩家参加比赛,

  • 所有玩家已离开比赛,

  • 比赛正常结束。

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

Get your Game Online Easily & in Minutes

Get your Game Online Easily & in Minutes

Get your Game Online Easily & in Minutes