

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

# 既存のゲームを FlexMatch でバックフィルする
<a name="match-backfill"></a>

マッチバックフィルでは、FlexMatch メカニズムを使用して、既存のマッチ済みのゲームセッションの新しいプレイヤーを見つけます。プレイヤーは任意のゲームにいつでも追加できますが (「[ゲームセッションへのプレイヤーの参加](https://docs.aws.amazon.com/gamelift/latest/developerguide/gamelift-sdk-client-api.html#gamelift-sdk-client-api-join)」を参照)、マッチバックフィルにより、新しいプレイヤーが既存のプレイヤーと同じ条件を満たすことができます。また、マッチバックフィルは新しいプレイヤーをチームに割り当て、プレイヤーの受け入れを管理し、更新されたマッチ情報をゲームサーバーに送信します。マッチバックフィルの詳細については「[FlexMatch マッチメーキングプロセス](gamelift-match-howitworks.md)」を参照してください。

**注記**  
現在、FlexMatch バックフィルは、Amazon GameLift Servers Realtime を使用しているゲームで使用することはできません。

バックフィルメカニズムには、次の 2 種類があります。
+ 自動バックフィルを有効にして、最大プレイヤー数に満たない状態で開始したゲームセッションを補充します。自動バックフィルは、ゲームに参加してからドロップアウトするプレイヤーをバックフィルしません。
+ 手動バックフィル機能を設定して、進行中のゲームセッションから離脱したプレイヤーを補充します。この仕組みは、空きスロットを検出し、それを埋めるためのバックフィルリクエストを生成できる必要があります。

# 自動バックフィルの起動
<a name="match-backfill-auto"></a>

自動マッチバックフィルでは、ゲームセッションがフィルされていない 1 つまたは複数のプレーヤースロットで開始されるたびに、Amazon GameLift Servers が自動的にバックフィルリクエストをトリガーします。この機能により、マッチしたプレイヤーの最小数が見つかるとすぐにゲームを開始し、残りのスロットを後で埋めることができるようになります。自動バックフィルはいつでも停止できます。

例えば、6 人から 10 人のプレイヤーを収容できるゲームを考えてみましょう。FlexMatch は最初に 6 人のプレイヤーを見つけ、試合を行い、新しいゲームセッションを開始します。自動バックフィルを使用すると、新しいゲームセッションはすぐに 4 人の追加プレーヤーを要求することができます。ゲームの性質によっては、ゲームセッション中にいつでも新しいプレーヤーが参加できるように許可したいかもしれません。または、初期セットアップフェーズとゲームプレイ開始前に自動バックフィルを停止することもできます。

自動バックフィルをゲームに追加するには、ゲームに以下の変更を加えます。

1. **自動バックアップを有効にします。**自動バックフィルはマッチメーキング設定で管理します。有効にすると、そのマッチメーカーによって作成されたすべてのマッチング済みゲームセッションに使用されます。Amazon GameLift Servers はゲームセッションがゲームサーバーで開始され次第、一部のゲームセッションへのバックフィルリクエストの生成を開始します。

   自動バックフィルを有効にするには、マッチング設定を開き、バックフィルモードを「自動」に設定します。詳細については、「[マッチメーキング設定の作成](match-create-configuration.md)」を参照してください。

1. **バックフィル優先設定をオンにします**。マッチメーキングプロセスをカスタマイズして、新しいマッチを作成する前に、バックフィルリクエストのフィリングを優先させます。マッチメーキングルールセットで、アルゴリズムコンポーネントを追加し、バックフィル優先度を「高」に設定します。詳細については、[マッチアルゴリズムのカスタマイズ](match-rulesets-components-algorithm.md)を参照してください。

1. **新しいマッチメーカーデータでゲームセッションを更新します。**Amazon GameLift Servers は Server SDK コールバック関数 `onUpdateGameSession` (「[サーバープロセスの初期化](https://docs.aws.amazon.com/gamelift/latest/developerguide/gamelift-sdk-server-api.html#gamelift-sdk-server-initialize)」を参照) を使用して、マッチング情報でゲームサーバーを更新します。バックフィルアクティビティの結果として更新されたゲームセッションオブジェクトを処理するために、コードをゲームサーバーに追加します。詳細については、「[ゲームサーバー上のマッチデータの更新](match-backfill-server-data.md)」を参照してください。

1. **ゲームセッションの自動バックフィルを無効にする。**個々のゲームセッション中はいつでも自動バックフィルの停止を選択できます。自動バックフィルを停止するには、Amazon GameLift Servers API コール [StopMatchmaking](https://docs.aws.amazon.com/gamelift/latest/apireference/API_StopMatchmaking.html) を実行するコードをゲームクライアントまたはゲームサーバーに追加します。この呼び出しにはチケット ID が必要です。最新のバックフィルリクエストのバックフィルチケット ID を使用します。この情報は、前のステップで説明されているように、ゲームセッションのマッチメーキングデータから取得できます。

# ゲームサーバーから手動バックフィルリクエストを生成する
<a name="match-backfill-server"></a>

ゲームセッションをホストしているゲームサーバープロセスから、手動でマッチバックフィルリクエストを開始できます。サーバープロセスは、ゲームに接続しているプレイヤーや空きプレイヤースロットの状況に関する最新情報を保持しています。

このトピックは、必要な FlexMatch コンポーネントを既に構築済みであり、マッチメーキングプロセスをゲームサーバーとクライアント側のゲームサービスに正常に追加済みであることを前提としています。FlexMatch のセットアップの詳細については、「[ロードマップ: Amazon GameLift Servers ホスティングソリューションにマッチメーキングを追加する](match-tasks.md)」を参照してください。

ゲームのマッチバックフィルを有効にするには、以下の機能を追加する必要があります。
+ マッチメーキングバックフィルリクエストをマッチメーカーに送信し、リクエストのステータスを追跡する。
+ ゲームセッションのマッチ情報を更新する。「[ゲームサーバー上のマッチデータの更新](match-backfill-server-data.md)」を参照してください。

他のサーバー機能と同様に、ゲームサーバーは Amazon GameLift Servers Server SDK 機能を使用します。この SDK は C\$1\$1 および C\$1 で使用できます。

ゲームサーバーからマッチバックフィルリクエストを作成するには、次のタスクを完了します。

1. **マッチバックフィルリクエストをトリガーします。**一般的に、マッチされたゲームに 1 つ以上の空きプレイヤースロットがある場合はいつでも、バックフィルリクエストを開始できます。バックフィルリクエストを、重要なキャラクターの役割を埋めるためや、チームのバランスを取るためなどの特定の状況に結びつけることもできます。また、ゲームセッションの継続時間に基づいてバックフィルアクティビティを制限することもできます。

1. **バックフィルリクエストを作成します。**マッチバックフィルリクエストを作成して FlexMatch マッチメーカーに送信するためのコードを追加します。バックフィルリクエストは、これらのサーバー API を使用して処理されます。
   + [StartMatchBackfill()](https://docs.aws.amazon.com/gamelift/latest/developerguide/integration-server-sdk-cpp-ref-actions.html#integration-server-sdk-cpp-ref-startmatchbackfill)
   + [StopMatchBackfill()](https://docs.aws.amazon.com/gamelift/latest/developerguide/integration-server-sdk-cpp-ref-actions.html#integration-server-sdk-cpp-ref-stopmatchbackfill)

   バックフィルリクエストを作成するには、次の情報を指定して `StartMatchBackfill` を呼び出します。バックフィルリクエストをキャンセルするには、バックフィルリクエストのチケット ID を指定して `StopMatchBackfill` を呼び出します。
   + **チケット ID** - マッチメーキングチケット ID を供給します (または自動生成させることもできます)。同じメカニズムを使用して、マッチメーキングリクエストおよびバックフィルリクエストにもチケット ID を割り当てます。マッチメーキングおよびバックフィルのチケットも同じ方法で処理されます。
   + **マッチメイカー** - バックフィルリクエストに使用するマッチメーカーを特定します。一般的に、元のマッチの作成に使用したものと同じマッチメーカーを使用します。このリクエストはマッチメーキング設定 ARN を取ります。この情報は、ゲームセッションをアクティブ化した際に Amazon GameLift Servers によってサーバープロセスに提供されたゲームセッションオブジェクト ([GameSession](https://docs.aws.amazon.com/gamelift/latest/apireference/API_GameSession.html)) に保存されます。マッチメーキング設定 ARN は `MatchmakerData` プロパティに含まれています。
   + **Game session ARN** - バックフィルされるゲームセッションを特定します。ゲームセッション ARN はサーバー API [GetGameSessionId()](https://docs.aws.amazon.com/gamelift/latest/developerguide/integration-server-sdk-cpp-ref-actions.html#integration-server-sdk-cpp-ref-getgamesessionid) を呼び出して取得できます。マッチメーキングプロセス中は、新しいリクエストのチケットにはゲームセッション ID がありません。一方、バックフィルリクエストのチケットにはあります。ゲームセッション ID があるかどうかが、新しいマッチのチケットとバックフィルのチケットを見分ける方法の 1 つです。
   + **プレイヤーデータ** - バックフィルするゲームセッション内のすべての現在のプレイヤーのプレイヤー情報 ([プレイヤー](https://docs.aws.amazon.com/gamelift/latest/apireference/API_Player.html))が含まれています。この情報により、マッチメーカーは現在ゲームセッション内にいるプレイヤーに対して最良のプレイヤーマッチを見つけることができます。各プレーヤーのチームメンバーシップを含める必要があります。バックフィルを使用していない場合は、チームを指定しないでください。ゲームサーバーがプレイヤー接続情報を正確にレポートしているなら、次のようにしてこのデータを取得できます。

     1. ゲームセッションをホストしているサーバープロセスには、現在どのプレイヤーがゲームセッションに接続しているかについての最新情報があります。

     1. プレイヤー ID、属性、およびチームの割り当てを取得するには、ゲームセッションオブジェクト ([GameSession](https://docs.aws.amazon.com/gamelift/latest/apireference/API_GameSession.html) の `MatchmakerData` プロパティからプレイヤーデータを抽出します (「[マッチメーカーデータについて](match-server.md#match-server-data)」を参照)。マッチメーカーデータには、ゲームセッションにマッチされたことのあるすべてのプレイヤーが含まれています。そのため、現在接続しているプレイヤーのみのプレイヤーデータをプルする必要があります。

     1. プレイヤーレイテンシーについては、マッチメーカーがレイテンシーデータを呼び出す場合、新しいレイテンシー値をすべての現在のプレイヤーから収集し、それを各 `Player` オブジェクトに含めます。レイテンシールールが省略されマッチメーカーにレイテンシールールがある場合、リクエストは正常にマッチされません。バックフィルリクエストには、ゲームセッションが現在置かれているリージョンのレイテンシーデータのみが必要です。ゲームセッションのリージョンは `GameSession` オブジェクトの `GameSessionId` プロパティから取得できます。この値はリージョンを含む ARN です。

1. **バックフィルリクエストのステータスを追跡します。**Amazon GameLift Servers は Server SDK コールバック関数 `onUpdateGameSession` を使用して、バックフィルリクエストのステータスでゲームサーバーを更新します(「[サーバープロセスの初期化](https://docs.aws.amazon.com/gamelift/latest/developerguide/gamelift-sdk-server-api.html#gamelift-sdk-server-initialize)」を参照)。ステータスメッセージ (およびバックフィルリクエスト[ゲームサーバー上のマッチデータの更新](match-backfill-server-data.md) が成功した結果として更新されたゲームセッションオブジェクト) を処理するコードを追加します。

   マッチメーカーで処理できるゲームセッションからのマッチバックフィルリクエストは一度に 1 つだけです。リクエストをキャンセルする必要がある場合は、[StopMatchBackfill()](https://docs.aws.amazon.com/gamelift/latest/developerguide/integration-server-sdk-cpp-ref-actions.html#integration-server-sdk-cpp-ref-stopmatchbackfill) を呼び出します。リクエストを変更する必要がある場合は、`StopMatchBackfill` を呼び出してから、更新されたリクエストを送信します。

# バックエンドサービスから手動でバックフィルリクエストを生成する
<a name="match-backfill-client"></a>

バックフィルリクエストをゲームサーバーから送信する代わりに、クライアント側のゲームサービスから送信できます。このオプションを使用するには、クライアント側のサービスがゲームセッションアクティビティとプレイヤー接続の現在のデータにアクセスできる必要があります。ゲームがセッションディレクトリサービスを使用している場合に適した選択です。

このトピックは、必要な FlexMatch コンポーネントを既に構築済みであり、マッチメーキングプロセスをゲームサーバーとクライアント側のゲームサービスに正常に追加済みであることを前提としています。FlexMatch のセットアップの詳細については、「[ロードマップ: Amazon GameLift Servers ホスティングソリューションにマッチメーキングを追加する](match-tasks.md)」を参照してください。

ゲームのマッチバックフィルを有効にするには、以下の機能を追加する必要があります。
+ マッチメーキングバックフィルリクエストをマッチメーカーに送信し、リクエストのステータスを追跡する。
+ ゲームセッションのマッチ情報を更新する。[ゲームサーバー上のマッチデータの更新](match-backfill-server-data.md)を参照してください 

他のクライアント機能と同様に、クライアント側のゲームサービスは Amazon GameLift Servers API で AWS SDK を使用します。この SDK は、C\$1\$1、C\$1、およびその他いくつかの言語で使用できます。クライアント API の一般的な説明については、Amazon GameLift Servers サービス API リファレンスを参照してください。このリファレンスには、Amazon GameLift Servers 関連アクションの低レベルサービス API についての説明があり、言語固有のリファレンスガイドへのリンクが含まれています。

クライアント側のゲームサービスを設定してマッチしたゲームをバックフィルするには、次のタスクを完了します。

1. **バックフィルのリクエストをトリガーします。**一般的に、マッチされたゲームに 1 つ以上の空きプレイヤースロットがある場合はいつでも、ゲームによってバックフィルリクエストが開始されます。バックフィルリクエストを、重要なキャラクターの役割を埋めるためや、チームのバランスを取るためなどの特定の状況に結びつけることもできます。また、ゲームセッションの継続時間に基づいてバックフィルを制限することもできます。トリガーに使用したものが何であれ、少なくとも次の情報が必要になります。この情報は、ゲームセッション ID を指定して [DescribeGameSessions](https://docs.aws.amazon.com/gamelift/latest/apireference/API_GameSession.html) を呼び出すことで、ゲームセッションオブジェクト ([GameSession](https://docs.aws.amazon.com/gamelift/latest/apireference/API_DescribeMatchmaking.html)) から取得できます。
   + *現在の空のプレーヤースロットの数。*この値は、ゲームセッションの最大プレイヤー制限と現在のプレイヤー数から計算できます。現在のプレーヤー数は、ゲームサーバーが Amazon GameLift Servers サービスと通信して、新しいプレイヤーの接続を検証したり、切断されたプレイヤーをレポートするたびに更新されます。
   + *作成ポリシー*。この設定は、ゲームセッションで現在新しいプレーヤーを受け入れているかどうかを示します。

    ゲームセッションオブジェクトには他にも、ゲームセッション開始時間、カスタムゲームプロパティ、マッチメーカーデータなどの有用な情報が含まれています。

1. **バックフィルリクエストを作成します。**マッチバックフィルリクエストを作成して FlexMatch マッチメーカーに送信するためのコードを追加します。バックフィルリクエストは、これらのクライアント API を使用して処理されます。
   + [StartMatchBackfill](https://docs.aws.amazon.com/gamelift/latest/apireference/API_StartMatchBackfill.html)
   + [StopMatchmaking](https://docs.aws.amazon.com/gamelift/latest/apireference/API_StopMatchmaking.html)

   バックフィルリクエストを作成するには、次の情報を指定して `StartMatchBackfill` を呼び出します。バックフィルリクエストはマッチメーキングリクエスト (「[プレイヤーのマッチメーキングのリクエスト](match-client-start.md)」を参照) に似ていますが、既存のゲームセッションも特定します。バックフィルリクエストをキャンセルするには、バックフィルリクエストのチケット ID を指定して `StopMatchmaking` を呼び出します。
   + **チケット ID** - マッチメーキングチケット ID を供給します (または自動生成させることもできます)。同じメカニズムを使用して、マッチメーキングリクエストおよびバックフィルリクエストにもチケット ID を割り当てます。マッチメーキングおよびバックフィルのチケットも同じ方法で処理されます。
   + **マッチメイカー** - 使用するマッチメーキング設定の名前を特定します。一般的に、元のマッチの作成に使用したものと同じマッチメーカーをバックフィルに使用します。この情報は、マッチメーキング設定 ARN の下の、ゲームセッションオブジェクト ([GameSession](https://docs.aws.amazon.com/gamelift/latest/apireference/API_GameSession.html)) の、`MatchmakerData` プロパティにあります。名前の値は「matchmakingconfiguration/」に続く文字列です。(例えば、ARN 値「value "arn:aws:gamelift:us-west-2:111122223333:matchmakingconfiguration/MM-4v4」であれば、マッチメーキング設定名は「MM-4v4」です。) 
   + **ゲームセッション ARN** - バックフィルされるゲームセッションを指定します。ゲームセッションオブジェクトから `GameSessionId` プロパティを使用すると、この ID は必要な ARN 値を使用します。バックフィルリクエストのマッチメーキングチケット ([MatchmakingTicket](https://docs.aws.amazon.com/gamelift/latest/apireference/API_MatchmakingTicket.html)) には、処理中にゲームセッション ID がありますが、新しいマッチメーキングリクエストはマッチが成立するまでゲームセッション ID を取得しません。ゲームセッション ID があるかどうかが、新しいマッチのチケットとバックフィルのチケットを見分ける方法の 1 つです。
   + **プレイヤーデータ** - バックフィルするゲームセッション内のすべての現在のプレイヤーのプレイヤー情報 ([プレイヤー](https://docs.aws.amazon.com/gamelift/latest/apireference/API_Player.html))が含まれています。この情報により、マッチメーカーは現在ゲームセッション内にいるプレイヤーに対して最良のプレイヤーマッチを見つけることができます。各プレーヤーのチームメンバーシップを含める必要があります。バックフィルを使用していない場合は、チームを指定しないでください。ゲームサーバーがプレイヤー接続情報を正確にレポートしているなら、次のようにしてこのデータを取得できます。

     1. ゲームセッション ID を指定して [DescribePlayerSessions()](https://docs.aws.amazon.com/gamelift/latest/apireference/API_DescribePlayerSessions.html) を呼び出し、ゲームセッションに現在接続しているすべてのプレイヤーを検出します。各プレーヤーセッションにはプレイヤー ID が含まれます。ステータスフィルタを追加してアクティブなプレーヤーのみを取得できます。

     1. ゲームセッションオブジェクト ([GameSession](https://docs.aws.amazon.com/gamelift/latest/apireference/API_GameSession.html)) の `MatchmakerData` プロパティからプレイヤーデータをプルします (「[マッチメーカーデータについて](match-server.md#match-server-data)」を参照)。前のステップで取得したプレイヤー ID を使用して、現在接続されているプレーヤーのみのデータを取得します。プレイヤーが切断された場合マッチメーカーのデータは更新されないため、現在のプレイヤーのみのデータを抽出する必要があります。

     1. プレイヤーレイテンシーについては、マッチメーカーがレイテンシーデータを呼び出す場合、新しいレイテンシー値をすべての現在のプレイヤーから収集し、それを `Player` オブジェクトに含めます。レイテンシールールが省略されマッチメーカーにレイテンシールールがある場合、リクエストは正常にマッチされません。バックフィルリクエストには、ゲームセッションが現在置かれているリージョンのレイテンシーデータのみが必要です。ゲームセッションのリージョンは `GameSession` オブジェクトの `GameSessionId` プロパティから取得できます。この値はリージョンを含む ARN です。

1. **バックフィルリクエストのステータスを追跡します。**マッチメーキングチケットのステータス更新をリッスンするコードを追加します。イベント通知 (推奨) またはポーリングを使用して、新しいマッチメーキングリクエストのチケットを追跡するセットアップのメカニズムを使用できます ([マッチメーキングイベントの追跡](match-client-track.md) を参照)。バックフィルリクエストでプレイヤーの承認アクティビティをトリガーする必要はなく、プレイヤー情報はゲームサーバーで更新されますが、チケットのステータスを追跡してリクエストの失敗や再送信を処理する必要はあります。

   マッチメーカーで処理できるゲームセッションからのマッチバックフィルリクエストは一度に 1 つだけです。リクエストをキャンセルする必要がある場合は、[StopMatchmaking](https://docs.aws.amazon.com/gamelift/latest/apireference/API_StopMatchmaking.html) を呼び出します。リクエストを変更する必要がある場合は、`StopMatchmaking` を呼び出してから、更新されたリクエストを送信します。

   マッチバックフィルリクエストが成功すると、ゲームサーバーは更新された `GameSession` オブジェクトを受信し、新しいプレイヤーがゲームセッションに参加するために必要なタスクを処理します。詳細については、「[ゲームサーバー上のマッチデータの更新](match-backfill-server-data.md)」を参照してください。

# ゲームサーバー上のマッチデータの更新
<a name="match-backfill-server-data"></a>

ゲーム内でマッチバックフィルリクエストを開始する方法にかかわらず、Amazon GameLift Servers がマッチバックフィルリクエストの結果として送信するゲームセッション更新をゲームサーバーで処理できる必要があります。

Amazon GameLift Servers がバックフィルリクエストを (正常であってもそうでなくても) 完了すると、コールバック関数 `onUpdateGameSession` を使用してゲームサーバーを呼び出します。この呼び出しには 3 つの入力パラメータが存在します。マッチバックフィルチケット ID、ステータスメッセージ、およびプレーヤー情報を含む最新のマッチメーキングデータを含む GameSession オブジェクトです。ゲームサーバー統合の一部として、ゲームサーバーに次のコードを追加する必要があります。

1. `onUpdateGameSession` 関数を実装します。この関数は次のステータスメッセージ (`updateReason`) を処理できる必要があります。
   + MATCHMAKING\$1DATA\$1UPDATED 新しいプレーヤーが正常にゲームセッションにマッチされました。`GameSession` オブジェクトには、既存のプレイヤーおよび新しくマッチされたプレイヤーのプレイヤーデータを含む、更新されたマッチメーカーデータが含まれます。
   + BACKFILL\$1FAILED マッチバックフィル試行が内部エラーのために失敗しました。`GameSession` オブジェクトは変更されません。
   + BACKFILL\$1TIMED\$1OUT マッチメーカーが制限時間内にバックフィルマッチを見つけることができませんでした。`GameSession` オブジェクトは変更されません。
   + BACKFILL\$1CANCELLED - マッチバックフィルリクエストが、StopMatchmaking (クライアント) または StopMatchBackfill (サーバー) の呼び出しによりキャンセルされました。`GameSession` オブジェクトは変更されません。

1. バックフィルマッチが成功するには、更新されたマッチメーカーデータを使用して、新しいプレイヤーがゲームセッションに接続した際にこれを処理します。少なくとも、プレイヤーがゲームを開始するために必要な他のプレイヤーの属性とともに、新しいプレイヤーのチーム割り当てを使用する必要があります。

1. ゲームサーバーのサーバー SDK アクション [ProcessReady()](https://docs.aws.amazon.com/gamelift/latest/developerguide/integration-server-sdk-cpp-ref-actions.html#integration-server-sdk-cpp-ref-processready) に対する呼び出しで、`onUpdateGameSession` コールバックメソッド名をプロセスパラメータとして追加します。