文档

支持

Matchmaker

Matchmaker

匹配规则

Create rules that control how players are matched together based on their custom data and Quality of Service results.
阅读时间8 分钟最后更新于 15 天前

规则泛指一种符合逻辑的目标追寻行为。规则适用于不同级别的匹配逻辑:匹配级别和队伍级别。匹配级别规则可确保所定义匹配的有效性,而队伍级别规则可确保所定义队伍的有效性。

规则格式

{ "Type": "RuleType", "Source": "SourcePath", "Not": true/false, "EnableRule": true/false, "Relaxations": [ { Relaxation1, Relaxation2 } ]}

字段

必填

类型

描述

类型字符串要应用的规则。请参阅下方的支持的规则表。
来源字符串数据源路径。请参阅支持的数据源
参考字符串、数字或数组*供比较的参考。并非供所有规则使用。*有效引用类型取决于规则类型。
布尔值如果被设置为 true,则会将规则反转。如未提供,则默认为 false。
EnableRule布尔值如果被设置为 false,则会禁用规则。如未提供,则默认为 true。该值通常用于禁用或启用规则放宽。
放宽列表<放宽>要应用的放宽列表。请参阅规则放宽和触发器

支持的规则

规则

输入

描述

差值来源:列表<数字>

参考:数字
确保列表中所有值的差值不会超出特定范围。
均等来源:列表<字符串或数字>

参考:字符串或数字*
确保列表中的所有值相等。

*参考是来源中定义的输入类型。
LessThan来源:数字

参考:数字
确保来源值小于参考值。
LessThanEqual来源:数字

参考:数字
确保来源值小于等于参考值。
GreaterThan来源:数字

参考:数字
确保来源值大于参考值。
GreaterThanEqual来源:数字

参考:数字
确保来源值大于等于参考值。
InList来源:字符串或数字

参考:列表<字符串或数字>
确保来源值位于参考列表中。

*参考是来源中定义的输入类型。
交集来源:列表<列表<字符串或数字>>

重叠:数字
确保给定列表包含所提供重叠数字的最小交集。

支持的数据源

所有玩家的数据

由工单中各位玩家自定义的数据可依据规则使用
Players.CustomData.{your_custom_field_name}
进行访问。客户端在创建工单时,会将上述自定义数据添加到工单中。请参阅创建工单,了解如何创建工单。

所有玩家的 QoS

工单中各玩家的服务质量数据可依据规则使用
Players.QoSResults.Latency
Players.QoSResults.PacketLoss
进行访问。请参阅服务质量

Leaderboards

通过与 Unity Leaderboards 集成可以支持服务器权威匹配。 各玩家的排行榜数据可依据规则使用
Players.CustomData.ExternalData.Leaderboard.Score
Players.CustomData.ExternalData.Leaderboard.Tier
进行访问。当选择此数据源时,必须定义一个额外的
ExternalData
对象,其中包括目标排行榜的
Id
"ExternalData": { "Leaderboard": { "Id": "my-leaderboard" }}
任何可用的排行榜数据都将自动附加到传入的工单,并将根据定义的规则进行处理。如果玩家没有已定义的排行榜的数据,此玩家在添加到该排行榜时将具有分数 0。 未启用等级的排行榜与使用等级的规则不兼容。所有进入该池的工单都将无法匹配。

Cloud Save

通过与 Unity Cloud Save 集成也可以支持服务器权威匹配。 各玩家的 Cloud Save 数据可依据规则使用
Players.CustomData.ExternalData.CloudSave.{cloud_save_data_path}
进行访问。
{cloud_save_data_path}
是规则中要使用的值的句点分隔路径。数据路径的第一部分将检索该键处的 Cloud Save 项。数据路径的所有剩余部分将用于遍历检索到的项。

Cloud Save 键

Cloud Save 项

数据路径

检索到的值

Skill500Skill500
Maps
["desert", "sea"]
Maps
["desert", "sea"]
Inventory
{ "Apples": 10, "Bottles": 3 }
Inventory.Apples10
当选择 Cloud Save 数据源时,可以定义一个可选的
ExternalData
对象来配置其行为。
"ExternalData": { "CloudSave": { "AccessClass": "Protected", "Default": 0 }}
访问类指示应从哪里检索玩家数据。同一个键可能会针对不同的访问类存储不同的项。如果没有提供访问类,则将默认为
Protected
还可以定义默认值。当玩家在指定的数据路径上没有 Cloud Save 项时,便会使用此默认值。默认值的数据类型必须与定义的规则兼容。例如,Reference 数据类型为 Number 的 Equality 规则仅允许默认值数据类型为 Number,而 Reference 数据类型为 List<String> 的 InList 规则仅允许默认值数据类型为 String。 任何可用的 Cloud Save 数据都将自动附加到传入的工单,并将根据定义的规则进行处理。如果玩家没有已定义的 Cloud Save 数据路径的数据,并且没有指定默认值,则工单将与规则定义不兼容。

支持的数据运算

匹配工单中针对玩家自定义数据提供的某些输入支持通过运算来创建规则。

运算

输入

输出

描述

计数列表<*>数字获取所提供列表中元素的数量。*任何类型都有效,例如:字符串、布尔值、列表和数字。
中位数列表<数字>数字获取所提供列表中数字的中位数。
平均值列表<数字>数字获取所提供列表中数字的平均值。
求和列表<数字>数字获取所提供列表中数字的总和。
最小值列表<数字>数字获取所提供数字列表中的最小值。
最大值列表<数字>数字获取所提供数字列表中的最大值。

示例

以下示例将介绍如何访问 **Skill(技能)**字段:
{ ..."Source": "Players.CustomData.Skill"... }
以下示例将介绍如何为匹配/队伍中所有玩家的技能点数求平均值。
{ ..."Source": "Players.CustomData.Skill.Avg"... }

支持的规则示例

差值

在以下示例中,根据规则的应用方向(匹配级别或队伍级别),同一匹配或队伍中的所有玩家相互之间的技能点数差值不超过 200。
{ "Type": "Difference", "Source": "Players.CustomData.Skill", "Reference": 200 // Valid types: number}

均等

在以下示例中,队伍级别的规则可确保怪兽队伍中的所有玩家都选择此队伍:
{ "Type": "Equality", "Source": "Players.CustomData.SelectedTeam", "Reference": "Monster" // Valid types: string or number}
在以下示例中,匹配级别的规则可确保匹配中的所有玩家使用相同密码
{ "Type": "Equality", "Source": "Players.CustomData.Password" }
在以下示例中,匹配级别的规则可确保匹配中的所有玩家处于相同技能段位
{ "Type": "Equality", "Source": "Players.Custom.SkillBracket" }

LessThanEqual

在以下示例中,队伍级别的规则可确保每个队伍最多拥有两个医疗兵:
{ "Type": "LessThanEqual", "Source": "Players.CustomData.PreferMedic.Count", "Reference": 2 // Valid types: number}

GreaterThanEqual

在以下示例中,匹配级别的规则可确保匹配中所有玩家的技能点数至少为 500:
{ "Type": "GreaterThanEqual", "Source": "Players.CustomData.Skill", "Reference": 500 // Valid types: number}

InList

在以下示例中,队伍级别的规则可确保玩家选择怪物角色后会被分配到怪物队伍:
{ "Type": "InList", "Source": "Players.CustomData.ChosenCharacter", "Reference": [ "Monster1", "Monster2", "Monster3" ] // Valid types: List<string> or List<number>}

交集

在以下示例中,匹配级别的规则可确保匹配中的所有玩家至少拥有三个共同首选地图:
{ "Type": "Intersection", "Source": "Players.CustomData.PreferredMaps", "Overlap": 3 }
在以下示例中,匹配级别的规则可确保匹配中的所有玩家至少拥有参考列表中的一项:
{ "Type": "Intersection", "Source": "Players.CustomData.Items", "Overlap": 1, "Reference": [ "PluePill", "RedPill" ] // Valid types: List<string> or List<number>}

排行榜

在以下示例中,队伍级别的规则可确保队伍中所有玩家的排行榜分数彼此相差在 300 分以内。
"TeamRules": [ { "Name": "Score", "Type": "Difference", "Source": "Players.CustomData.ExternalData.Leaderboard.Score", "ExternalData": { "Leaderboard": { "Id": "my-leaderboard" } }, "Reference": 300, "Not": false, "EnableRule": true }]
在以下示例中,匹配级别的规则可确保匹配中的所有玩家必须处于相同排行榜等级。
"MatchRules": [ { "Name": "Tier", "Type": "Equality", "Source": "Players.CustomData.ExternalData.Leaderboard.Tier", "ExternalData": { "Leaderboard": { "Id": "my-leaderboard" } }, "Not": false, "EnableRule": true }]

Cloud Save

在以下示例中,队伍级别的规则可确保队伍中的所有玩家至少有一张共同的解锁地图。如果玩家在 Cloud Save 中没有键为
Maps
的项,则会为其分配
["starter"]
以用于匹配。此值不会持久保留在 Cloud Save 中。
"TeamRules": [ { "Name": "Unlocked Maps", "Type": "Intersection", "Source": "Players.CustomData.ExternalData.CloudSave.Maps.Unlocked", "ExternalData": { "CloudSave": { "AccessClass": "Protected", "Default": ["starter"] } }, "Not": false, "EnableRule": true, "Overlap": 1 }]