处理常见错误情况

PlayFab 匹配为进入和离开匹配提供了一个简单的接口。 尽管如此,仍然会有一些未按预期运行 的情况。 下面是一些较常见的错误情况,以及游戏处理它们的方法。

本页面假定你熟悉 PlayFab 匹配的一般流程。 有关详细信息,请参阅介绍了匹配的常见用法的匹配快速入门

创建票证时出错

票证创建可能会因多种原因而失败。 在大多数情况下,PlayFab 错误代码与提交请求存在无效内容有关。 更正此问题即可成功提交。

注意

错误 MatchmakingAttributeInvalidMatchmakingPlayerAttributesInvalid 指示属性格式存在问题。 有关详细信息,请参阅指定票证属性来详细了解如何在票证中传递属性。

其他错误代码指示请求有效,但请求以外的因素阻止系统接受票证。 尤其应注意以下错误:

  1. MatchmakingRateLimitExceeded- 指示票证提交过于频繁。 有关更多信息,请参阅下面介绍更多详细信息的部分。
  2. MatchmakingTicketMembershipLimitExceeded- 指示用户当前处于另一个活动票证中。 系统限制用户在同一时间只能处于一个队列的一个票证中,因为他们不能同时玩两个游戏。 有关详细信息,请参阅下面介绍如何更正这种情况的更详细部分。

如果收到 HTTP 503 错误代码,请在短暂延迟后重试请求。

调用返回 MatchmakingRateLimitExceeded

与其他 PlayFab 功能类似,PlayFab 匹配根据在 Game Manager 中配置的限制对调用数进行限制。 收到 MatchmakingRateLimitExceeded 错误表示游戏超出此调用类型的限制。

在匹配期间,这种情况最常在轮询 GetMatchmakingTicket 以确认是否匹配到票证时出现。

要避免此错误,请提高限制或降低调用频率。

注意

虽然响应的 HTTP 状态代码为 429,但请求本身是有效的,仍可以重试。

创建或加入票证时返回 MatchmakingTicketMembershipLimitExceeded

在 PlayFab 匹配期间,用户在同一时间只能处于一个队列的一个票证中,以避免用户进入两场比赛而必须决定以哪个票证为准的情况。 不管取消哪场比赛,都会有一场比赛缺少一名玩家,从而导致其玩家被迫重新进入匹配。 如果用户已处于一个未取消也未匹配的票证中,但尝试创建或加入另一个票证,则返回错误 MatchmakingTicketMembershipLimitExceeded

但是,有时游戏或服务器可能会因为崩溃、重新启动或其他无法预料的错误而丢失票证。 当发生这种情况时,会留下一个用户和游戏都不知道的活动票证。

丢失的票证将阻止此用户提交任何新票证,直至该丢失的票证过期。 如果发生这种情况,可以使用下面两个选项解决此问题:

选项 1:从匹配中清除此票证

取消用户的所有现有票证。 调用 CancelAllMatchmakingTicketsForPlayer 将执行此任务。 之后,匹配将没有正在进行的票证,并准备好创建新的票证。

选项 2:找到丢失的票证

找到用户的现有票证并继续使用。 调用 ListMatchmakingTicketsForPlayer 将返回用户所属的所有匹配票证 ID。 通过对提供的每个 ticketId 调用 GetMatchmakingTicket,可检索其状态并继续监视,直到其找到匹配项。

并非所有玩家都加入多用户票证

创建多用户票证时,其中一位受邀玩家可能会失败或拒绝加入。 在这种情况下,创建的票证保持 WaitingForPlayers 状态,直到过期。 游戏应预料到有时会发生这种情况,并在 UI 中设置较短的超时。

超时后,游戏应取消票证并检查所有玩家是否仍同意一起玩游戏。

未找到 GetMatch 返回

一旦创建了匹配,该匹配将有效一段时间并最终过时。如果未及时找回匹配,这些用户将需要重新提交票据以再次获得匹配。 还可通过及时(即在几分钟内)检索到匹配来避免这种情况。

如果按此处所述同时使用匹配和大厅,则在此处匹配超时后的一段时间内,lobbyArrangementString 可能仍然有效。 请确保在 GetMatch 过期之前检索并使用其信息。

票证取消

票证可能因多种原因取消。 最常见的情况是用户取消和票证到期,但服务器也可以取消票证。 如果调用 GetMatchmakingTicket 并发现票证被取消,CancellationReason 字段中会列出原因。 下面列出了可能的 CancellationReason 响应以及可能的解决方案。

CancellationReason 描述 解决方法
用户 用户已取消匹配票证 故意。 如果需要,请创建新票证。
服务器 服务已通过服务器 API 取消匹配票证 故意。 如果需要,请创建新票证。
Timeout 票证因达到 GiveUpAfterSeconds 而过期 使用新票证重试,如有必要,请调整票证属性。
ServerAllocationFailed 队列分配服务器,但分配请求失败 确认备用服务器在区域中可用,并使用新票证重试。
TicketUnmatchable 票证参数和队列规则的组合使此票证无法匹配 调整票证属性或队列配置,使其兼容。
RetryRequired 内部暂时性匹配错误 使用新票证重试,可能是由于计时问题导致,应该会在下一次请求时解决。
Internal 内部匹配服务错误 使用新票证重试。

取消票证时返回错误

取消票证并不保证成功。 大多数错误一看就能明白,但我们要解释一下错误 MatchmakingTicketAlreadyCompleted。它的出现可能是以下两种原因之一:

  1. 票证已取消。
  2. 票证已匹配。

收到此错误时,游戏应调用 GetMatchmakingTicket 来区分这两种情况。 在第一种情况下,票证已处于期望的状态,无需采取进一步的操作。 第二种情况表示用户的取消指令下达太晚,票证已匹配成功。 用户取消与找到匹配之间的竞争情况是不可避免的,必须由游戏进行处理。

游戏有两个选项来解决此问题 - 仍然加入比赛,无视用户的取消请求,或在已知玩家不会加入的前提下让比赛开始。 这两个选项都不完美,但重要的是应预料到会发生这种情况,并有意识地为其创建游戏流。 需要注意的是,玩家可能由于任何原因而不加入比赛,因此不管此处提到的竞争情况为何,游戏都必须处理这种情况。