处理常见错误情况
PlayFab 匹配为进入和离开匹配提供了一个简单的接口。 尽管如此,仍然会有一些未按预期运行 的情况。 下面是一些较常见的错误情况,以及游戏处理它们的方法。
本页面假定你熟悉 PlayFab 匹配的一般流程。 有关详细信息,请参阅介绍了匹配的常见用法的匹配快速入门。
创建票证时出错
票证创建可能会因多种原因而失败。 在大多数情况下,PlayFab 错误代码与提交请求存在无效内容有关。 更正此问题即可成功提交。
注意
错误 MatchmakingAttributeInvalid
和 MatchmakingPlayerAttributesInvalid
指示属性格式存在问题。 有关详细信息,请参阅指定票证属性来详细了解如何在票证中传递属性。
其他错误代码指示请求有效,但请求以外的因素阻止系统接受票证。 尤其应注意以下错误:
-
MatchmakingRateLimitExceeded
- 指示票证提交过于频繁。 有关更多信息,请参阅下面介绍更多详细信息的部分。 -
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
。它的出现可能是以下两种原因之一:
- 票证已取消。
- 票证已匹配。
收到此错误时,游戏应调用 GetMatchmakingTicket 来区分这两种情况。 在第一种情况下,票证已处于期望的状态,无需采取进一步的操作。 第二种情况表示用户的取消指令下达太晚,票证已匹配成功。 用户取消与找到匹配之间的竞争情况是不可避免的,必须由游戏进行处理。
游戏有两个选项来解决此问题 - 仍然加入比赛,无视用户的取消请求,或在已知玩家不会加入的前提下让比赛开始。 这两个选项都不完美,但重要的是应预料到会发生这种情况,并有意识地为其创建游戏流。 需要注意的是,玩家可能由于任何原因而不加入比赛,因此不管此处提到的竞争情况为何,游戏都必须处理这种情况。