概述
队列和规则系统为灵活处理大量方案提供了灵活性。 下面是一些更常见的匹配用例及其关联队列的示例。 可以使用 PlayFab API 直接提交其中每个配置。 还可以使用 Game Manager UI 设置这些选项。
我的第一个队列,即“快速匹配”
每个游戏都应从这个简单的队列开始,以便制定其基本流程。 此队列将两个玩家匹配起来,其中包含一个可选规则,要求玩家传入相同的版本字符串以便匹配。 如果未指定生成,则无论生成如何,玩家都可以与此队列中的其他玩家匹配。
"MatchmakingQueue": {
"Name": "MyFirstQueue",
"MinMatchSize": 2,
"MaxMatchSize": 2,
"ServerAllocationEnabled": false,
"Rules": [
{
"Type": "StringEqualityRule",
"Attribute": {
"Path": "Build",
"Source": "User"
},
"AttributeNotSpecifiedBehavior": "MatchAny",
"Weight": 1,
"Name": "BuildVersionRule"
}
]
}
多个游戏模式
游戏通常有不同的玩法。 如果这些玩家永远不应互相匹配,将他们放在单独的队列中可优化性能。
{
"MatchmakingQueue": {
"Name": "FreeForAllQueue",
"MinMatchSize": 4,
"MaxMatchSize": 4,
"ServerAllocationEnabled": false,
"Rules": [
]
}
}
{
"MatchmakingQueue": {
"Name": "CaptureTheFlagQueue",
"MinMatchSize": 4,
"MaxMatchSize": 4,
"ServerAllocationEnabled": false,
"Rules": [
]
}
}
交叉游戏模式搜索
如果玩家应跨游戏模式与其他玩家匹配,应使用单个队列并创建取交集规则。 玩家可以指定多种游戏模式,规则将匹配限制为所有玩家至少包含一种常见游戏模式的模式。
注意
不同模式下需要播放的玩家数必须相同,才能使此功能正常工作。
{
"MatchmakingQueue": {
"Name": "MultiGameModeSearchQueue",
"MinMatchSize": 4,
"MaxMatchSize": 4,
"ServerAllocationEnabled": false,
"Rules": [
{
"Type": "SetIntersectionRule",
"MinIntersectionSize": 1,
"Attribute": {
"Path": "GameMode",
"Source": "User"
},
"AttributeNotSpecifiedBehavior": "MatchAny",
"Weight": 1,
"Name": "GameModeRule"
}
]
}
}
基于技能的免费全能游戏,具有扩展
常见的方案是尝试根据 技能将玩家匹配在一起。 在此示例中,队列要求玩家的技能属性在 0.2 以内,这些属性随着时间推移而增加到 0.5。 对于等待超过 30 秒的票证,允许任何技能差异。
此示例的值假定可用技能的范围介于 0 和 1 之间。 调整这些值以适应游戏用于跟踪其玩家技能的值范围,以及对技能的重视程度超过比赛速度。
此外,在 30 秒时成为可选规则适用于使用不平衡技能玩游戏比根本不玩更好的游戏。 对于不均衡游戏完全是负面体验的游戏,请调整 SecondsUntilOptional。 如果完全删除,会导致此规则无限期保持活动状态。
"MatchmakingQueue": {
"Name": "SkillBasedFreeForAllQueue",
"MinMatchSize": 4,
"MaxMatchSize": 4,
"ServerAllocationEnabled": false,
"Rules": [
{
"Type": "DifferenceRule",
"Difference": 0.2,
"MergeFunction": "Average",
"DefaultAttributeValue": 0.5,
"Expansion": {
"Delta": 0.1,
"Limit": 0.5,
"Type": "Linear",
"SecondsBetweenExpansions": 5
},
"Attribute": {
"Path": "Skill",
"Source": "User"
},
"AttributeNotSpecifiedBehavior": "UseDefault",
"Weight": 1,
"Name": "SkillRule",
"SecondsUntilOptional": 30
}
]
}
自定义扩展
可以自定义扩展以在每个时间间隔内使用任意值。 例如,你可能希望允许的技能开始缓慢增长,然后随着时间推移而增长得更快。
"MatchmakingQueue": {
"Name": "SkillBasedFreeForAllCustomExpansionQueue",
"MinMatchSize": 4,
"MaxMatchSize": 4,
"ServerAllocationEnabled": false,
"Rules": [
{
"Type": "DifferenceRule",
"Difference": 0.2,
"MergeFunction": "Average",
"DefaultAttributeValue": 0.5,
"Expansion": {
"DifferenceOverrides": [
0.025,
0.05,
0.1,
0.2,
0.3,
0.5
],
"Type": "Custom",
"SecondsBetweenExpansions": 5
},
"Attribute": {
"Path": "Skill",
"Source": "User"
},
"AttributeNotSpecifiedBehavior": "UseDefault",
"Weight": 1,
"Name": "SkillRule",
"SecondsUntilOptional": 30
}
]
}
玩家数随时间扩展
一些游戏倾向于以完整匹配开头,但随着时间的推移,可能会对越来越少的人感到满意。 其中一个示例是战斗皇家风格的游戏,它设计为从最多 50 名玩家开始,但在匹配超时后可以继续使用更少的玩家。
由于 MinMatchSize 和 MaxMatchSize 不包含扩展,因此可以使用 MatchTotalRule 来修改匹配所需的玩家数。 每个玩家将关联的属性设置为 1。 规则对这些值求和,以动态强制匹配的所需玩家数。
注意
如果未指定 MaxOverrides 或 MinOverrides 数组,则会使用规则的原始 Max 或 Min 值来代替它。
"MatchmakingQueue": {
"Name": "PlayerExpansionOverTime",
"MinMatchSize": 8,
"MaxMatchSize": 50,
"ServerAllocationEnabled": false,
"Rules": [
{
"Type": "MatchTotalRule",
"Attribute": {
"Path": "PlayerCount",
"Source": "User"
},
"Min": 8,
"Max": 50,
"Weight": 1,
"Expansion": {
"MinOverrides": [
50,
45,
40,
35,
25,
16,
8
],
"Type": "Custom",
"SecondsBetweenExpansions": 10
},
"Name": "PlayersRequiredRule",
"SecondsUntilOptional": 60
}
],
}
基于技能的标准 4v4 风格
PlayFab 匹配支持面向团队的匹配。 当你指定团队时,你在同一张票证中一起提交的玩家将全部分配到一个团队中,并且他们不会被迫互相比赛。
PlayFab 匹配还支持多种团队规则,以帮助确保团队均衡。 此示例适用于 4v4 匹配,它确保团队之间的技能均衡。
"MatchmakingQueue": {
"Name": "Standard4v4TeamsQueue",
"MinMatchSize": 8,
"MaxMatchSize": 8,
"ServerAllocationEnabled": false,
"Teams": [
{
"Name": "Red",
"MinTeamSize": 4,
"MaxTeamSize": 4
},
{
"Name": "Blue",
"MinTeamSize": 4,
"MaxTeamSize": 4
}
],
"Rules": [
{
"Type": "TeamDifferenceRule",
"Attribute": {
"Path": "Skill",
"Source": "User"
},
"Difference": 0.2,
"DefaultAttributeValue": 0.5,
"Expansion": {
"Delta": 0.1,
"Limit": 0.5,
"Type": "Linear",
"SecondsBetweenExpansions": 5
},
"Name": "TeamSkillRule",
"SecondsUntilOptional": 30
}
]
}
多人游戏服务器
队列可自动送入 PlayFab 的多人游戏服务器功能,分配服务器并提供匹配玩家的列表。 此队列提供此类配置的最小示例,即 ServerAllocationEnabled 标志,还有表示应启动的服务器版本的 BuildId。
将 ServerAllocationEnabled 标志设置为 true时,还必须包含 以 RegionSelectionRule 指示应为每个匹配分配服务器的位置。
"MatchmakingQueue": {
"Name": "MultiplayerServersQueue",
"MinMatchSize": 24,
"MaxMatchSize": 24,
"ServerAllocationEnabled": true,
"BuildId": "6a4d2760-4295-417e-b149-0a12e3570d94",
"Rules": [
{
"Type": "RegionSelectionRule",
"MaxLatency": 200,
"Path": "Latency",
"Weight": 1,
"Name": "RegionSelectionRule"
}
]
}
大型团队战斗 (12 vs 12)
较大的团队游戏可能有额外的要求。 在此示例中,队列配置为创建一台多人游戏服务器,管理有这么多玩家的游戏通常会需要这样的服务器。 此配置类似于前面的示例。
除了技能,还可以添加另一个团队规则来鼓励团队相似性。 每边只允许一支大队,防止预制球队与大量随机球员匹配的常见情况。
"MatchmakingQueue": {
"Name": "LargeTeamsQueue",
"MinMatchSize": 24,
"MaxMatchSize": 24,
"ServerAllocationEnabled": true,
"BuildId": "6a4d2760-4295-417e-b149-0a12e3570d94",
"Teams": [
{
"Name": "Red",
"MinTeamSize": 12,
"MaxTeamSize": 12
},
{
"Name": "Blue",
"MinTeamSize": 12,
"MaxTeamSize": 12
}
],
"Rules": [
{
"Type": "TeamTicketSizeSimilarityRule",
"Name": "PreventLargePremadeVersusRandomsRule",
"SecondsUntilOptional": 20
},
{
"Type": "TeamDifferenceRule",
"Attribute": {
"Path": "Skill",
"Source": "User"
},
"Difference": 0.1,
"DefaultAttributeValue": 0.5,
"Expansion": {
"Delta": 0.1,
"Limit": 0.5,
"Type": "Linear",
"SecondsBetweenExpansions": 5
},
"Name": "TeamSkillRule",
"SecondsUntilOptional": 30
},
{
"Type": "RegionSelectionRule",
"MaxLatency": 200,
"Path": "Latency",
"Weight": 1,
"Name": "RegionSelectionRule"
}
]
}
战斗皇家风格游戏
战斗皇家风格的游戏让很多人进入一个竞技场。 在此示例中,此游戏设置了四个团队。 目前,在这样的团队方案中,允许 32 名玩家的限制。 将来会改进此限制。
此示例还包含针对专属服务器的多人游戏服务器设置信息,有大量玩家的游戏经常会需要专属服务器。 此配置类似于前面的示例。
"MatchmakingQueue": {
"Name": "BattleRoyaleStyleQueueWithTeams",
"MinMatchSize": 32,
"MaxMatchSize": 32,
"ServerAllocationEnabled": true,
"BuildId": "6a4d2760-4295-417e-b149-0a12e3570d94",
"Teams": [
{
"Name": "team1",
"MinTeamSize": 4,
"MaxTeamSize": 4
},
{
"Name": "team2",
"MinTeamSize": 4,
"MaxTeamSize": 4
},
{
"Name": "team3",
"MinTeamSize": 4,
"MaxTeamSize": 4
},
{
"Name": "team4",
"MinTeamSize": 4,
"MaxTeamSize": 4
},
{
"Name": "team5",
"MinTeamSize": 4,
"MaxTeamSize": 4
},
{
"Name": "team6",
"MinTeamSize": 4,
"MaxTeamSize": 4
},
{
"Name": "team7",
"MinTeamSize": 4,
"MaxTeamSize": 4
},
{
"Name": "team8",
"MinTeamSize": 4,
"MaxTeamSize": 4
}
],
"Rules": [
{
"Type": "RegionSelectionRule",
"MaxLatency": 200,
"Path": "Latency",
"Weight": 1,
"Name": "RegionSelectionRule"
}
]
}
处理非对称跨游戏首选项
由于玩家可以选择不同的跨游戏设置,因此匹配首选项是不对称的。 启用跨平台的玩家愿意与任何平台匹配,而禁用跨平台的玩家仅希望与自己的平台上的玩家进行匹配。
可以使用字符串相等规则或集交集规则来实现可以处理此类不对称的匹配队列。 此特定示例使用字符串相等性。
如果玩家禁用跨平台,则客户端会指定其 DeviceType (例如 "xbox"、 "playstation") ,并且规则会将其限制为同一平台匹配项。 如果玩家启用交叉播放,则客户端将完全省略 DeviceType 属性,并且 AttributeNotSpecifiedBehaviorMatchAny 允许它们与任何平台匹配。
注意
当一组玩家一起提交票证时,服务会将该组视为单个单元,它不会将组拆分为多个比赛或团队。 游戏客户端应在提交票证之前验证组组成。 例如,如果玩家禁用了跨平台游戏,请在创建票证之前阻止他们加入跨平台组。
如果匹配时间比预期时间长,请考虑为每个平台创建一个单独的队列,并根据需要使用跨平台队列来支持跨平台游戏。
"MatchmakingQueue": {
"Name": "CrossDeviceQueue",
"MinMatchSize": 32,
"MaxMatchSize": 32,
"ServerAllocationEnabled": false,
"BuildId": "6a4d2760-4295-417e-b149-0a12e3570d94",
"Rules": [
{
"Type": "StringEqualityRule",
"Attribute": {
"Path": "DeviceType",
"Source": "User"
},
"AttributeNotSpecifiedBehavior": "MatchAny",
"Weight": 1,
"Name": "CrossDeviceRule"
}
]
}
基于主机/搜索程序或角色的要求
PlayFab Match 使用基于票证的匹配系统,其中未提前选择游戏主机。 但是,它可以通过使用 MatchTotalRule 限制匹配中允许的主机数来模拟主机-搜索程序系统。
然后,如果票证是主机,则票证可以通过指定 1 来提前指定。 每个匹配都必须包含一台主机。
注意
如果主机数量大大超过搜索者的数量,反之亦然,这种不平衡可能会导致所有玩家的匹配时间变慢。 请考虑匹配设计的影响,以确保任何给定子填充中有足够的玩家来满足匹配规则和所需的平均匹配时间。
"MatchmakingQueue": {
"Name": "HostSearcherQueue",
"MinMatchSize": 8,
"MaxMatchSize": 8,
"ServerAllocationEnabled": false,
"BuildId": "6a4d2760-4295-417e-b149-0a12e3570d94",
"Rules": [
{
"Type": "MatchTotalRule",
"Attribute": {
"Path": "IsHost",
"Source": "User"
},
"Min": 1,
"Max": 1,
"Weight": 1,
"Name": "OneHostRule"
}
]
}
游戏可能有角色要求。 例如,一个游戏可能需要一个鼓手、两个吉他手和一个歌手。 或者一个坦克,每秒两个伤害 (DPS) ,和一个支撑。 游戏可能会使用 MatchTotalRule 来要求这些角色。
"MatchmakingQueue": {
"Name": "RoleBasedQueue",
"MinMatchSize": 4,
"MaxMatchSize": 4,
"ServerAllocationEnabled": false,
"BuildId": "6a4d2760-4295-417e-b149-0a12e3570d94",
"Rules": [
{
"Type": "MatchTotalRule",
"Attribute": {
"Path": "TankSelected",
"Source": "User"
},
"Min": 1,
"Max": 1,
"Weight": 1,
"Name": "TankRule"
},
{
"Type": "MatchTotalRule",
"Attribute": {
"Path": "DPSSelected",
"Source": "User"
},
"Min": 2,
"Max": 2,
"Weight": 1,
"Name": "DPSRule"
},
{
"Type": "MatchTotalRule",
"Attribute": {
"Path": "SupportSelected",
"Source": "User"
},
"Min": 1,
"Max": 1,
"Weight": 1,
"Name": "SupportRule"
}
]
}
具有不同重要性的规则
规则通过限制哪些票证有资格匹配和选择票证的选取顺序来指导匹配。 当存在多个规则时,系统会考虑其所有限制。 但是,游戏可能会优先处理规则优先于剩余符合条件的票证。
在此示例中,玩家必须处于技能和经验级别。 但是,如果许多票证属于指定的技能和经验边界,则此队列首选技能更接近的票证,而不是经验级别更接近的票证。
在评估满足限制的票证时,技能差异是经验差异的 三倍 。
"MatchmakingQueue": {
"Name": "WeightingQueue",
"MinMatchSize": 4,
"MaxMatchSize": 4,
"ServerAllocationEnabled": false,
"BuildId": "6a4d2760-4295-417e-b149-0a12e3570d94",
"Rules": [
{
"Type": "DifferenceRule",
"Difference": 1,
"MergeFunction": "Average",
"Attribute": {
"Path": "skill",
"Source": "User"
},
"AttributeNotSpecifiedBehavior": "MatchAny",
"Weight": 3,
"Name": "SkillRule"
},
{
"Type": "DifferenceRule",
"Difference": 5,
"MergeFunction": "Average",
"Attribute": {
"Path": "experience",
"Source": "User"
},
"AttributeNotSpecifiedBehavior": "MatchAny",
"Weight": 1,
"Name": "ExperienceRule"
}
]
}
DLC 包
通过使用各种 DLC 包,玩家可以选择仅使用 来查找具有匹配 DLC SetIntersectionRule的其他玩家。 各玩家传入他们所拥有的 DLC 包,匹配要求一组至少共享一个 DLC 包。
注意
30 秒后,规则变为可选,因此玩家无需共享 DLC 即可进行匹配。
"MatchmakingQueue": {
"Name": "DlcQueue",
"MinMatchSize": 4,
"MaxMatchSize": 4,
"ServerAllocationEnabled": false,
"BuildId": "6a4d2760-4295-417e-b149-0a12e3570d94",
"Rules": [
{
"Type": "SetIntersectionRule",
"MinIntersectionSize": 1,
"Attribute": {
"Path": "DlcPacks",
"Source": "User"
},
"AttributeNotSpecifiedBehavior": "MatchAny",
"Weight": 1,
"Name": "DlcRule",
"SecondsUntilOptional": 30
}
]
}
启用统计信息
启用统计信息后,游戏可以显示有关队列的信息。 此信息可用于设置玩家在选择想要玩的游戏模式时的期望值。
相反,游戏可能希望隐藏此信息 - 出于商业智能目的,或避免将玩家定向到高流量队列。
通过此队列,可以查看队列中存在的玩家数和票证匹配的估计时间。
注意
服务器始终可以检索此信息。 以下配置仅控制是否也允许用户进行此调用。
"MatchmakingQueue": {
"Name": "StatisticsEnabledQueue",
"MinMatchSize": 8,
"MaxMatchSize": 8,
"ServerAllocationEnabled": false,
"Rules": [],
"StatisticsVisibilityToPlayers": {
"ShowNumberOfPlayersMatching": true,
"ShowTimeToMatch": true
}
}