匹配方案和配置示例
概述
队列和规则系统为灵活处理大量方案提供了灵活性。 下面是一些最常见的匹配用例示例及其相关队列。 其中每个都可以通过 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
}
]
}
玩家数随时间扩展
有些游戏喜欢以满场比赛开始,但随着时间的推移满足于越来越少的人员。 例如 Battle Royale(堡垒之夜 - 大逃杀)风格的游戏,开始时最好有 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 对 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"
}
]
}
Battle Royale(堡垒之夜 - 大逃杀)
Battle Royale 游戏将很多人放在一个竞技场中。 在此示例中,此游戏设置了四个团队。 目前有一个团队方案中允许 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"
}
]
}
跨设备/跨平台
要限制特定设备或平台的游戏互相匹配,可以使用字符串相等规则指定设备。 当 AttributeNotSpecifiedBehavior 为 MatchAny
时,不指定此类设备的票证可以选择与任意设备/平台匹配。 如果匹配时间比预期时间长,请考虑为每个平台创建一个单独的队列,并根据需要使用跨平台队列来支持跨平台游戏。
"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 匹配使用基于票证匹配的系统,在该系统中,游戏主机不是提前选择的。 但是,它可以通过使用 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 包时,玩家可以选择使用 SetIntersectionRule
仅查找具有匹配 DLC 的其他玩家。 各玩家传入他们所拥有的 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
}
}