Amazon GameLift
开发人员指南 (版本 )
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

设计 FlexMatch 规则集

在最基本的层面上,对战规则集有两个作用:安排对战游戏的团队结构和规模,以及告知对战构建器如何评估玩家以查找可能的最佳匹配。但是,它能够做的比这些要多得多。例如,您还可以通过规则集解决地址匹配问题,如:

  • 为大型对战(> 40 位玩家)触发特殊的匹配处理。

  • 强制实施最低玩家延迟要求来保护玩家的游戏体验。

  • 如果没有可以进行的匹配,逐渐放宽团队要求或匹配规则。

  • 为包含多个玩家(各方聚合)的对战请求定义特殊处理。

本主题介绍规则集的基本结构以及如何将它们用于最多 40 位玩家的对战游戏。超过 40 位玩家的对战游戏需要不同的规则集结构,因为 FlexMatch 使用简化的算法来快速匹配大量玩家。在 设计 FlexMatch 大型对战规则集 中了解有关构建大型对战游戏的更多信息。

主题

定义规则集组件

所有规则集均指定以下部分或全部组件。规则集必须至少指定规则语言版本,定义一个团队并设置一条规则。大多数情况下,您还需要声明玩家属性并将其用于自定义规则。

大型对战的规则集架构 中查看一般规则集架构。

创建大型对战游戏(超过 40 位玩家)的规则集存在更多要求。在 设计 FlexMatch 大型对战规则集 中了解有关大型对战游戏的更多信息。

描述规则集

提供规则集的详细信息。

  • name(可选)– 这是规则集语法中的描述性标签,不能供 Amazon GameLift 以任何有意义的方式使用。不要将此值与规则集名称混淆,规则集名称在创建规则集时与规则集语法一同设置。

  • ruleLanguageVersion(必需)– 这是用于创建 FlexMatch 规则的属性表达式语言的版本。此值必须等于“1.0”。

声明玩家属性

规则可能会根据各个玩家的特性选择对战游戏的玩家。如果您创建了依赖于玩家属性的规则,则必须在本部分中声明。声明的玩家属性的值应该包含在使用此规则集发送对战构建器的每个对战请求中。

您可能还需要将某些玩家属性传递到游戏会话中,即使规则集在玩家评估期间不使用这些属性。例如,您可以传递选择的玩家角色。要执行此操作,请在此处声明您的玩家属性,并在对战请求中包含每个玩家的属性值。

在声明玩家属性时,请包含以下信息:

  • name(必需)– 此值在规则集中必须唯一。

  • type(必需)– 这是属性值的数据类型。有效数据类型为数字、字符串或字符串映射。

  • default(可选)– 输入在未为玩家提供值时要使用的默认值。如果没有声明默认值,玩家也没有提供值,则无法匹配该玩家。

定义团队

描述对战游戏的团队的结构和规模。每个对战游戏必须至少有一个团队,您可以根据需要定义任意数量的团队。您的团队的玩家数量可以相同,也可以不同。例如,您可以定义有一个玩家的怪物团队和有 10 个玩家的猎人团队。

FlexMatch 根据规则集如何定义团队规模将对战请求处理为小型对战或大型对战。最多 40 位玩家的潜在对战游戏属于小型对战,而超过 40 位玩家的对战游戏则属于大型对战。要确定规则集的潜在对战游戏规模,请为在规则集中定义的所有团队添加 maxPlayer 设置。

  • name(必需)– 为每个团队分配一个唯一名称。此名称在规则和扩展中使用,并在用于游戏会话的对战数据中引用。

  • maxPlayers(必需)– 指定可以分配给团队的玩家的最大数量。

  • minPlayers(必需)– 指定要使对战成功必须分配给团队的玩家的最小数量。

  • quantity(可选)– 如果您希望 FlexMatch 根据此定义创建多个团队,请指定数量。FlexMatch 创建对战游戏时,会为这些团队提供指定名称并附加一个编号。例如,“Red-Team_1”、“Red-Team_2”、“Red-Team_3”等。

FlexMatch 始终会尝试将团队填充到最大玩家规模,但在创建团队时则会设置最小玩家规模允许的较少的玩家数量。如果您希望对战游戏的所有团队都具有相同规模,可以创建相应的规则。有关“EqualTeamSizes”规则的示例,请参阅 FlexMatch, 规则集示例主题。

设置玩家匹配规则

创建一组定义如何评估玩家在对战游戏中的接受情况的规则语句。规则可以设置应用于单个玩家、团队或整个对战的要求。当 GameLift 处理对战请求时,它将从可用玩家池中最早的玩家开始,围绕该玩家构建对战。

  • name(必需)– 这是用于在规则集中唯一标识规则的有意义的名称。规则名称也可在跟踪与此规则相关的活动的事件日志和指标中引用。

  • description(可选)– 使用此元素可附加自由格式文本描述。此信息不可供对战构建器使用。

  • type(必需)– 类型元素标识处理规则时要使用的操作。每个规则类型都需要一组额外属性。例如,若干规则类型需要一个引用值来衡量玩家的属性。有关有效的规则类型和属性的列表,请参阅 FlexMatch 规则语言

  • 规则类型属性(可能是必需的)– 根据定义的规则类型,您可能需要设置某些规则属性。例如,对于距离和比较规则,必须指定要衡量的玩家属性。在 FlexMatch 规则语言 中了解有关属性以及如何使用 FlexMatch 属性表达式语言的更多信息。

随时间推移放宽匹配要求

当有可能没有有效匹配时,扩展允许您随着时间的推移放宽匹配条件。此功能可确保在不可能有完美匹配时,进行“现有最佳”匹配。您可以使用扩展来放宽玩家技能要求,提高可接受的玩家延迟级别,或降低所需的最少玩家数量。通过利用扩展放宽规则,您将逐渐扩大可以匹配的玩家池。

  • target(必需)– 确定要放宽的规则集元素。您可以放宽规则或团队属性。

  • steps(必需)– 您可以分多个阶段放宽规则。对于每个步骤,请指定要应用的等待时间和新值。对于规则集扩展,等待时间是绝对,表示对战创建开始后的秒数。对于包含多个步骤的扩展,每个步骤的等待时间必须大于前一个步骤。最后一个步骤的等待时间不能长于对战请求允许的时间,此时间在对战配置中设置。

    • waitTimeSeconds

如果此规则集由启用了自动回填的对战构建器使用,不要过快放宽玩家计数要求。新游戏会话需要几秒钟时间启动并开始自动回填。如果您的扩展步骤具有非常短的等待时间,FlexMatch 在新游戏开始回填前可能会创建很多部分填充的对战。更好的方法是仅在您的游戏要开始自动回填后设置扩展等待时间。这有助于 FlexMatch 更快、更高效地为游戏(新游戏或现有游戏)获取玩家。同时,您希望 FlexMatch 尽快回填现有游戏(使用同一个规则集)。扩展时间会有所不同,具体取决于您的团队构成。请进行一些测试来找到最适合您的游戏的扩展策略。

设计 FlexMatch 大型对战规则集

如果您的规则集可以创建超过 40 位玩家的对战游戏,FlexMatch 会将使用该规则集的对战请求处理为大型对战。大型对战使用不同的算法进行处理,该算法将显著减少匹配大量玩家所需的时间。

要确定您的规则集是否创建大型对战游戏,请查看您的规则集中所有团队的 maxPlayer 设置。如果这些设置的总计超过 40,表示您有大型对战规则集。大型对战规则集可以创建最多 200 位玩家的对战游戏。

大型对战规则集与其他规则集使用相同的组件,只进行了几项调整。此外,此规则集还必须包含算法组件。在 大型对战的规则集架构 中查看大型对战规则集的架构。

定义大型对战算法

将算法组件添加到规则集。此组件将大型对战算法配置为您的首选项。

  • batchingPreference(必需)– 此属性指示对战游戏创建期间玩家的排序方式。此值必须与“balanced”相同。

    balancedAttribute(必需)– 确定要在为对战选择玩家时使用的单个玩家属性。在评估单个玩家前,FlexMatch 将根据此属性排序可用的玩家池。它从评估具有相似属性值的玩家开始,逐渐移至不太相似的玩家,直到对战完成填充。此属性用于实现对战中玩家的平衡,将倾向于具有此属性的相似值的玩家分组到一起。例如,如果您选择技能属性,具有相似技能级别的玩家在对战中将被分组到一起。如果您有大型的可用玩家池,此机制对于大型对战最有效。

    请务必在规则集的玩家属性中声明平衡属性。只有数据类型为“数字”的属性可以用作平衡属性。

  • strategy(必需)– 选择要在对战游戏创建期间使用的匹配策略。选项包括“largestPopulation”(默认)和“fastestRegion”。

    最大群体

    使用此策略,FlexMatch 通过包含至少在一个区域具有可接受延迟值的所有玩家来保持可能的最大玩家池。拥有大型玩家池,对战可以更快地填充,匹配的玩家在平衡属性方面更加相似。玩家可能被放到延迟不太理想但仍然在可接受的限制内的游戏中。

    最快区域

    此策略优先考虑在为玩家提供可能的最佳延迟的对战中获取玩家。FlexMatch 基于报告最低延迟值的区域分组可用玩家,然后尝试从这些组填充对战。FlexMatch 倾向于将玩家放到他们的可能的最快区域内。但是,它可能会根据速度排在第二或第三的区域(或更慢)分组玩家,以创建足够大的组来填充对战。因此,对战可能需要更长时间来填充。而且,通过此策略创建的对战内的玩家在平衡属性方面可能变化更大。

示例如下:

"algorithm": { "balancedAttribute": "player_skill", "strategy": "balanced", "batchingPreference": "largestPopulation" },

声明玩家属性

至少,您必须声明在规则集算法中用作平衡属性的玩家属性。只有数据类型为“数字”的属性可以用作平衡属性。

此外,您可能需要在设置游戏会话时将某些玩家属性传递到要使用的游戏服务器。例如,您可以传递玩家的角色选择、地图首选项等。要传递玩家属性,请在规则集中声明这些属性,然后在对战请求中包含每个玩家的属性值。当 GameLift 将游戏会话请求传递到游戏服务器时,它将提供对战构建器数据,其中包含所有匹配玩家的属性值。

定义团队

定义团队规模和结构的过程与小型对战相同,但 FlexMatch 填充团队的方式不同。这将影响在只有部分填充时对战可能呈现的外观。您可能想要更改响应中的最小团队规模。

FlexMatch 在向团队分配玩家时使用以下规则。首先:查找尚未达到其最低玩家要求的团队。其次:在这些团队中,查找具有最多空闲位置的团队。

对于定义多个同等规模团队的对战,玩家将按顺序添加到每个团队,直到填满。因此,对战为每个团队分配相似数量的玩家,即使对战未填满。目前,还没有方法在大型对战中强制定义规模相同的团队。对于规模不对称的团队,过程稍微复杂一些。在这种情况下,玩家最开始会被分配给空闲位置最多的最大团队。然后,当空闲位置的数量在所有团队之间更均匀地分配,玩家开始被添加到更小的团队。

我们来看一个示例。假设您有一个包含三个团队的规则集。红色团队和蓝色团队均设置为 maxPlayers=10、minPlayers=5。绿团队设置为 maxPlayers=3、minPlayers=2。以下是填充此对战的顺序:

  1. 没有团队已达到 minPlayers。红色团队和蓝色团队有 10 个空闲位置,绿色团队有 3 个。前 10 个玩家被分配(每个团队 5 个)到红色团队和蓝色团队。这两个团队现在已达到 minPlayers。

  2. 绿色团队尚未达到 minPlayers。接下来 2 个玩家被分配到绿色团队。

  3. 所有团队现在均已达到 minPlayers。红色团队和蓝色团队具有最多的空闲位置,因此,接下来的 8 个玩家将被分配(每个团队 4 个)到红色团队和蓝色团队。

  4. 当全部三个团队均有 1 个可用的空闲位置后,剩余的 3 个玩家位置将不按特定顺序分配。

为大型对战设置延迟规则

由于大部分创建大型对战的工作是使用平衡玩家属性和优先级策略进行的。大多数自定义规则不可用。但是,您可以创建一个对玩家延迟设置硬性限制的规则。

要创建此规则,请使用属性为 maxLatencylatency 规则类型。下面是一个将最大玩家延迟设置为 200 毫秒的示例:

"rules": [{ "name": "player-latency", "type": "latency", "maxLatency": 200 }],

放宽大型对战要求

在小型对战中,您可以使用扩展来在可能没有有效匹配时随着时间推移放宽匹配要求。在大型对战中,您可以选择放宽延迟规则或团队玩家计数。

如果您在大型对战中使用自动匹配回填,请不要太快地放宽团队玩家计数。FlexMatch 仅在游戏会话启动后开始生成回填请求,在对战创建后的前几秒钟可能不会开始。在这段时间内,FlexMatch 可以创建多个部分填充的新游戏会话,尤其是在玩家计数规则降低时。因此,您最后将有多于所需的更多游戏会话,而且玩家将在这些会话之间过于稀疏地分布。最佳做法是给予玩家计数扩展的第一个步骤更长的等待时间,长到足够让游戏会话启动。由于为大型对战的回填请求提供了更高的优先级,传入玩家将在新游戏启动前被放入现有游戏。您可能需要进行实验来找到最适合您的游戏的等待时间。

下面是一个在更长的初始等待时间内逐渐降低黄色团队的玩家计数的示例。请记住,规则集扩展中的等待时间是绝对的,不是复合的。因此,第一次扩展在第五秒时进行,第二次扩展在五秒以后,即第十秒时进行。

"expansions": [{ "target": "teams[Yellow].minPlayers", "steps": [{ "waitTimeSeconds": 5, "value": 8 }, { "waitTimeSeconds": 10, "value": 5 }] }]