一般的なエラー ケースを処理する
PlayFab のマッチメイキングは、マッチメイキングに出入りするためのシンプルなインターフェースを提供します。 ただし、プランによっては、まだ複数のポイント数が表示されない場合があります。 より一般的なエラー ケースと、タイトルの処理方法を以下に示します。
このページは、PlayFab のマッチメイキングの一般的な流れに精通していることを前提としています。 詳細については、マッチメイキングの一般的な使い方に関する「マッチメイキングのクイックスタート」をご覧ください。
チケット作成時のエラー
チケットの作成はいくつかの理由で失敗する可能性があります。 ほとんどの場合、PlayFab エラー コードは送信リクエストに関して無効なものを識別します。 これを修正すると、正常に送信できます。
注意
エラーMatchmakingAttributeInvalid
とMatchmakingPlayerAttributesInvalid
は、属性の書式設定に問題があることを示します。 詳細については、チケットで属性を渡す方法の「チケット属性を指定する」をご覧ください。
他のエラー コードは要求が有効であることを示しますが、要求以外の状況によってチケットが受け入れられないようになる場合があります。 具体的には、以下のようになります。
-
MatchmakingRateLimitExceeded
- チケットが頻繁に送信されていることを示しています。 詳細については、以下のセクションを参照してください。 -
MatchmakingTicketMembershipLimitExceeded
- ユーザーがすでに別のアクティブなチケットに参加していることを示します。 一度に 2 つのゲームをプレイすることはできないため、ユーザーは一度に 1 つのキュー内に複数のチケットを入れることはできません。 詳細については、この状況の修正に関する以下のセクションを参照してください。
HTTP エラーコード 503 を受け取った場合は、少し待ってから要求を再試行します。
呼び出しは、MatchmakingRateLimitExceeded を返します。
他の PlayFab 機能と同様に、PlayFab マッチメイキングは、ゲーム マネージャーの内部で設定された制限に従って、呼び出しの数を制限します。
MatchmakingRateLimitExceeded
エラーを受信すると、タイトルがこの呼び出しのタイプの制限を超えたことを示します。
マッチメイキングにおいて、このエラーは、GetMatchmakingTicketをポーリングしてチケットがマッチしたかどうかを確認するときに最も頻繁に発生します。
このエラーを回避するには、制限を増やすか、呼び出しの頻度を減らします。
注意
応答の HTTP ステータス コードは 429 ですが、要求自体は有効であるため、再試行できます。
チケットを作成または参加すると、MatchmakingTicketMembershipLimitExceeded が返される
PlayFab のマッチメイキングでは、ユーザーが 2 つのマッチを入力して、どちらのチケットを優先するかを決定しなければならないケースを回避するために、キューごとに 1 つのチケットにしか入力できません。 選択しなかったマッチについては、プレイヤーの数が少なくなるため、マッチメイキングの再入力が必要になります。 ユーザーがチケットをキャンセルもマッチもしていない状態で、別のチケットを作成または参加しようとしている場合、エラー MatchmakingTicketMembershipLimitExceeded
が返されます。
しかし、クラッシュや再起動、その他の予期しないエラーによって、タイトルやサーバーがチケットを失ってしまうことがあります。 これが発生すると、ユーザーもタイトルも認識していないアクティブなチケットが残ります。
紛失したチケットは、期限切れになるまで、このユーザーに対して今後のチケットが送信されるのを防ぎます。 このようなエラーが発生した場合は、問題を解決するために、2 つの方法があります。
オプション 1: マッチメイキングからチケットを消去する
ユーザーのすべての既存のチケットをキャンセルします。 CancelAllMatchmakingTicketsForPlayer を呼び出すことによって、このタスクを実行します。 その後のマッチメイキングにおいては進行中のチケットはなく、新しいチケットを作成する準備ができています。
オプション 2: 紛失したチケットを見つける
ユーザーの既存のチケットを見つけて、引き続き使用します。 ListMatchmakingTicketsForPlayer を呼び出すと、ユーザーがメンバーであるすべてのマッチメイキング チケット ID を返します。 提供された各 チケット ID で GetMatchmakingTicket を呼び出すと、その状態を取得し、マッチが見つかるまで監視を続けることができます。
すべてのプレイヤーがマルチユーザー チケットに参加するわけではありません。
マルチユーザー チケットを作成するとき、招待されたプレイヤーの 1 人が失敗するか、または参加を拒否する可能性があります。 このような場合、作成されたチケットは期限が切れるまで WaitingForPlayers ステータスのままになります。 タイトルはこのような状況が時々起こることを予想し、UI 内で非常に短いタイムアウトを設定する必要があります。
タイムアウト後、タイトルはチケットをキャンセルし、すべてのプレイヤーがまだ一緒にゲームをプレイすることに同意していることを確認する必要があります。
GetMatch の戻り値が見つかりません
マッチが作成されると、マッチは一定期間有効になり、最終的には期限切れになります。マッチが時間内に取得されない場合、それらのユーザーは再びマッチされるためにチケットを再送信する必要があります。 これは、マッチが適切なタイミング (つまり、数分以内) に取得されるようにすることで回避することができます。
ここで説明するようにマッチメイキングとロビーを一緒に使用している場合は、ここでマッチがタイムアウトした後、lobbyArrangementString が一定期間有効である可能性があります。 有効期限が切れる前に、GetMatch から情報を取得して使用してください。
チケットはキャンセルされました
チケットは複数の理由でキャンセルされることがあります。 最も一般的なケースは、ユーザーのキャンセルとチケットの有効期限切れですが、チケットはサーバーによってキャンセルされることもあります。
GetMatchmakingTicket
を呼び出し、チケットがキャンセルされたことがわかった場合、その理由は CancellationReason
フィールドに表示されます。 考えられる CancellationReason
応答と考えられる解決策を次に示します。
CancellationReason | 説明 | 解決策 |
---|---|---|
ユーザー | ユーザーがマッチメイキング チケットを取り消しました | 意図。 必要に応じて、新しいチケットを作成します。 |
サーバー | サービスがサーバー API 経由でマッチメイキング チケットを取り消しました | 意図。 必要に応じて、新しいチケットを作成します。 |
タイムアウト | GiveUpAfterSeconds に到達してチケットの有効期限が切れました | 新しいチケットでもう一度お試しください。必要に応じてチケット属性を調整します。 |
ServerAllocationFailed | キューはサーバーを割り当てますが、割り当て要求が失敗しました | リージョンで使用可能なスタンバイ サーバーを確認し、新しいチケットを使用してもう一度お試しください。 |
TicketUnmatchable | チケット パラメーターとキューのルールの組み合わせにより、このチケットが一致しなくなります | チケット属性またはキュー構成を調整して、互換性を持たせるようにします。 |
RetryRequired | 内部の一時的なマッチメイキング エラー | 次の要求で解決するタイミングの問題が原因の可能性があるため、新しいチケットを使用してもう一度お試しください。 |
内部 | 内部マッチメイキング サービス エラー | 新しいチケットを使用してもう一度お試しください。 |
チケットをキャンセルすると、エラーが返されます。
チケットをキャンセルしても成功するとは限りません。 ほとんどのエラーは一目瞭然ですが、エラーMatchmakingTicketAlreadyCompleted
は 2 つの可能性のうちの 1 つを示します。
- チケットはすでにキャンセルされました。
- チケットはすでにマッチングされています。
このエラーを受信する場合、これらの 2 つのケースを区別するために、タイトルはGetMatchmakingTicketを呼び出します。 最初のケースの場合、チケットはすでに目的の状態になっているため、それ以上のアクションは必要ありません。 2 番目のケースの場合、ユーザーのキャンセルが遅すぎたことと、すでにマッチが組まれたことを示します。 ユーザーのキャンセルとマッチが見つかるまでの競合状態は避けられず、タイトルで処理する必要があります。
タイトルには、この問題を解決するための 2 つのオプションがあります。とにかくユーザーのキャンセル要求を無視してマッチに参加するか、またはプレイヤーが参加しないことを知っているマッチの開始を許可することです。 どちらの選択肢も完璧ではありませんが、このような状況が発生することを予想し、意識的に状況に対するタイトル フローを作成することが重要です。 また、プレイヤーがいかなる理由でもマッチに出場できない可能性があることも注目に値します。そのため、ここで言及されている競合状態に関係なく、タイトルはこの状態を処理する必要があります。