ゲーム クライアントへの FlexMatch の追加 - Amazon GameLift

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

ゲーム クライアントへの FlexMatch の追加

このトピックでは、クライアント側ゲームサービスに FlexMatch マッチメーキングのSupportを追加する方法について説明しています。FlexMatch を Amazon GameLift マネージド ホスティング、または別のホスティングソリューションで使用している場合でも、プロセスは基本的に同じです。FlexMatch とゲームのカスタムマッチメーカーのセットアップ方法の詳細はこちらのトピックを参照してください。

FlexMatch マッチメーキングをゲームで有効にするには、以下の機能を追加する必要があります。

  • 1人以上のプレイヤー(必要な)のマッチメーキングのリクエストを準備します。

  • マッチメーキングリクエスト(必要な)のステータスを追跡します。

  • プレイヤーによる試合案(オプション)の承諾をリクエストします。

  • ゲームセッションが新しい試合に対して作成されたら、プレイヤー接続情報を取得してゲームに参加します。

プレイヤーによるマッチメーキングのリクエスト準備

ゲームクライアントがクライアント側のゲームサービスを通してマッチメーキングリクエストを作成することを強くお勧めします。信頼されたソースを使用することで、ハッキングの試みや偽のプレイヤーデータからより簡単に保護できます。ゲームがセッションディレクトリサービスを使用している場合、これはマッチメーキングリクエストを処理するための優れたオプションです。

クライアントサービスを準備するには、次のタスクを実行します。

  • Amazon GameLift API を追加します。クライアントサービスは AWS SDK のパートである Amazon GameLift API の機能を使用します。AWS SDKの詳細と最新バージョンのダウンロード方法についての詳細はこちら、「クライアントサービス用の Amazon GameLift SDK」を参照してください。ゲームクライアントサービスプロジェクトにこの SDK を追加します。

  • [Set up a matchmaking ticket system](マッチメーキングチケットシステムのセットアップ) すべてのマッチメーキングリクエストに、一意のチケット ID を割り当てる必要があります。一意の ID を生成し、それを新しいマッチングリクエストに割り当てるメカニズムが必要です。チケット ID には、最大 128 文字の文字列形式を使用できます。

  • [Get matchmaker information](マッチメーカー情報を取得する) 使用する予定のマッチメーキング設定の名前を取得します。また、マッチメーカーの必須プレイヤー属性のリストも必要です。この属性は、マッチメーカーのルールセットで定義されています。

  • [Get player data](プレイヤーデータを取得します) 各プレイヤーの関連データを取得する方法を設定します。たとえば、プレイヤーがゲームにスロットされる可能性が高いリージョンごとのプレイヤー ID、プレイヤー属性値、および更新されたレイテンシーデータなどがあります。

  • (オプション) マッチバックフィルを有効にする。既存のマッチングされたゲームをバックフィルする方法を決定します。マッチメーカーのバックフィルモードが [手動] に設定されている場合、バックフィルサポートをゲームに追加できます。バックフィルモードが [自動] に設定されている場合、個々のゲームセッションに対して設定をオフにする方法が必要になる可能性があります。マッチングバックフィルの管理の詳細については、「FlexMatch を使用して既存のゲームをバックフィル」を参照してください。

プレイヤーのマッチメーキングのリクエスト

クライアントサービスにコードを追加し、 FlexMatch マッチメーカーへのマッチメーキングリクエストを作成して管理します。FlexMatch マッチメーキングをリクエストするプロセスは、Amazon GameLiftManaged ホスティングで FlexMatch を使用するゲームと、スタンドアロンソリューションとして FlexMatch を使用するゲームでも同じです。

マッチメーキングリクエストを作成します。
  • Amazon GameLift API StartMatchmaking の呼び出し 各リクエストには、以下の情報が必要です。

    マッチメーカー

    リクエストに使用するマッチメーキング設定の名前を指定します。FlexMatch は各リクエストを指定されたマッチメーカーのプールに配置し、リクエストはマッチメーカーが設定されている方法に基づいて処理されます。これには、プレイヤーにマッチングの承諾をリクエストするかどうか、生成されたゲームセッションを配置する際にどのようなキューを使用するかなど、強制的な時間制限が含まれます。マッチメーカーとルール設定の詳細については、「 FlexMatch マッチメーカーの設計」を参照してください。

    チケット ID

    リクエストに割り当てられている一意のチケット ID。イベントや通知などリクエストに関連するものすべてが、チケット ID を参照します。

    プレイヤーデータ

    マッチングを作成する対象のプレイヤーのリスト。リクエスト内のプレイヤーのいずれかが、マッチルールと最小レイテンシーに基づいてマッチ要件を満たしていない場合、マッチメーキングリクエストが成功することはありません。マッチリクエストには最大 10 人のプレイヤーを含めることができます。リクエストに複数のプレイヤーがいる場合、 FlexMatch は 1 つの試合を作成し、すべてのプレイヤーを同じチーム (ランダムに選択) に割り当てます。リクエストに含まれるプレイヤーが多すぎて、マッチチームの 1 つに収まらない場合、リクエストは一致しません。たとえば、2v2 のマッチ (2 人のプレイヤーで構成される 2 つのチーム) を作成するようにマッチメーカーを設定した場合は、3 人以上のプレイヤーを含むマッチメーキングリクエストを送信することはできません。

    注記

    プレイヤー (プレーヤー ID によって識別) は、一度に 1 つのアクティブなマッチメーキングリクエストにのみ含めることができます。プレイヤーの新しいリクエストを作成すると、同じプレイヤー ID のアクティブなマッチメーキングチケットは自動的にキャンセルされます。

    リストされたプレイヤーごとに、次のデータを含めます。

    • [Player ID ](プレイヤー ID )各プレイヤーごとにユニークなプレイヤー ID の生成が必要です。[Generate player IDs](プレイヤー ID の生成)を参照してください。

    • [Player attributes](プレイヤー属性)使用されているマッチメーカーがプレイヤー属性を呼び出した場合、リクエストは各プレイヤーにそれらの属性を提供する必要があります。必須のプレイヤー属性は、マッチメーカーのルールセット内で定義され、属性のデータ型も指定されます。プレイヤー属性は、ルールセットで属性のデフォルト値が指定された場合のみ、オプションとなります。マッチングリクエストが必要なプレイヤー属性をすべてのプレイヤーに提供しない場合、マッチメーキングリクエストは成功しません。マッチメーカーのルールセットおよびプレイヤー属性の詳細については、「FlexMatch ルールセットの構築」および「FlexMatch ルールセットの例」を参照してください。

    • [Player latencies](プレイヤーレイテンシー)使用されているマッチメーカーにプレイヤーレイテンシールールがある場合、リクエストは各プレイヤーのレイテンシーを報告する必要があります。プレイヤーレイテンシーデータは、プレイヤーごとに 1 つ以上の値が表示されたリストです。これは、マッチメーカーのキューのリージョンで、プレイヤーに発生するレイテンシーを表しています。プレイヤーのレイテンシー値がリクエストに含まれていない場合、プレイヤーがマッチングされることはなく、リクエストは失敗します。

マッチングリクエストの詳細を取得する。
  • マッチングリクエストが送信されたら、[DescribeMatchmaking](マッチメーキングの説明) をリクエストのチケット ID とともに呼び出すことによって、リクエストの詳細を表示できます。この呼び出しは、現在のステータスを含むリクエスト情報を返します。リクエストが正常に完了すると、チケットにはゲームクライアントがマッチングに接続するために必要な情報も含まれます。

マッチングリクエストをキャンセルする。
  • マッチングリクエストは、[StopMatchmaking](マッチメーキングの停止) をリクエストのチケット ID とともに呼び出すことによって、いつでもキャンセルできます。

マッチメーキングイベントの追跡

マッチメーキングプロセスに関して Amazon GameLift がマッチメーキングプロセスのために発行するイベントを追跡するために通知を設定します。SNS トピックを作成するか、 Amazon EventBridge を使用することで、通知を直接設定できます。通知の設定の詳細については、「FlexMatch イベント通知をセットアップする」を参照してください。通知を設定したら、必要に応じてイベントと応答を検出するために、クライアントサービスでリスナーを追加します。

また、通知なしでかなりの期間が経過した場合に、ステータスの更新を定期的にポーリングして、通知をバックアップすることをお勧めします。マッチメーキングのパフォーマンスへの影響を最小限に抑えるには、マッチメーキングチケットが送信されてから 30 秒以上待ってからか、最後に受信した通知の後にのみポーリングしてください。

[DescribeMatchmaking](マッチメーキングの説明)をリクエストのチケット ID とともに呼び出して、現在のステータスを含むマッチメーキングリクエストチケットを取得します。最大で 10 秒に 1 回ポーリングすることをお勧めします。この方法は、使用量が少ない開発シナリオでのみ使用します。

注記

本稼働前の負荷テストなど、大量のマッチメーキングを使用する前に、イベント通知を使用してゲームをセットアップする必要があります。パブリックリリースのすべてのゲームでは、ボリュームに関係なく通知を使用する必要があります。継続的なポーリング方法は、マッチメーキングの使用量が少ない開発中のゲームにのみ適しています。

プレイヤーの承諾をリクエスト

プレイヤーの承諾が有効になっているマッチメーカーを使用している場合、クライアントサービスにコードを追加し、プレイヤーの承諾プロセスを管理します。プレイヤーの承諾をマネージドするプロセスは、Amazon GameLift マネージドホスティングで FlexMatch を使用するゲームと、スタンドアロンソリューションとして FlexMatch を使用するゲームでも同じです。

マッチング案のプレイヤー承諾をリクエストする。
  1. [Detect when a proposed match needs player acceptance](マッチング案がプレイヤーの承諾を必要とするときを検出する) マッチメーキングチケットをモニタリングし、ステータスの REQUIRES_ACCEPTANCE への変更を検出します。このステータスに変わったときに FlexMatch イベントがトリガーされます。MatchmakingRequiresAcceptance

  2. [Get acceptances from all players](すべてのプレイヤーから承諾を得る) 提案されたマッチング詳細を、マッチメーキングチケットで各プレイヤーに提示するメカニズムを作成します。プレイヤーは、マッチング案の承諾または拒否を示すことができる必要があります。マッチングの詳細は、DescribeMatchmaking(マッチメーキングの説明)を呼び出して取得できます。マッチメーカーがマッチング案を取り消して続行する前に、プレイヤーには返答のために限られた時間が与えられます。

  3. [Report player responses to FlexMatch.](プレイヤーのレスポンスを FlexMatch に報告する。) AcceptMatch を呼び出し、プレイヤーの承諾または拒否の応答を報告します。マッチメーキングリクエストのすべてのプレイヤーが承諾した場合にのみマッチングが進められます。

  4. 承諾されなかったチケットを処理する。マッチング案でプレイヤーがマッチングを拒否するか、承諾の制限時間内に応答しなかった場合、リクエストは失敗します。試合を承諾したプレイヤーのチケットは、自動的にチケットプールに戻されます。試合を承諾しなかったプレイヤーのチケットは違反ステータスになり、処理が中断されます。複数のプレイヤーがいるチケットの場合、チケット内のいずれかのプレイヤーが試合を受け入れなかった場合、チケット全体が違反します。

試合にConnectする

正常に完了したマッチング (ステータス COMPLETED またはイベント MatchmakingSucceeded) を処理するために、クライアントサービスにコードを追加します。これにはマッチングのプレイヤーへの通知と、ゲームクライアントへ接続情報の提供が含まれます。

Amazon GameLift マネージドホスティングを使用するゲームでは、マッチメーキングリクエストが正常に実行されると、ゲームセッション接続情報がマッチメーキングチケットに追加されます。DescribeMatchmaking を呼び出して、完了したマッチメーキングチケットを取得します。接続情報には、ゲームセッションの IP アドレスとポート、および各プレイヤー ID に対するプレイヤーセッション ID が含まれます。詳細については、「GameSessionConnectionInfo」を参照してください。ゲームクライアントはこの情報を使用して、試合をホストしているゲームセッションに直接Connectします。接続リクエストには、プレイヤーセッション ID とプレイヤー ID が含まれている必要があります。このデータは接続されたプレイヤーを、チームの割り当てを含むゲームセッションのマッチングデータに関連付けます (「GameSession」を参照)。

Amazon GameLift FleetIQ など、他のホスティングソリューションを使用するゲームでは、試合のプレイヤーが適切なゲームセッションに接続を有効にできるようメカニズムを構築する必要があります。

マッチメーキングリクエストのサンプル

これらのコードスニペットは、さまざまなマッチメーカーに対するマッチメーキングリクエストを構築します。説明されているように、リクエストではマッチメーカーのルールセットの定義に従い、使用されているマッチメーカーで必要なプレイヤー属性を提供する必要があります。提供された属性では、ルールセット内で定義されている同じデータ型、数値 (N)、または文字列 (S) を使用する必要があります。

# Uses matchmaker for two-team game mode based on player skill level def start_matchmaking_for_cowboys_vs_aliens(config_name, ticket_id, player_id, skill, team): response = gamelift.start_matchmaking( ConfigurationName=config_name, Players=[{ "PlayerAttributes": { "skill": {"N": skill} }, "PlayerId": player_id, "Team": team }], TicketId=ticket_id) # Uses matchmaker for monster hunter game mode based on player skill level def start_matchmaking_for_players_vs_monster(config_name, ticket_id, player_id, skill, is_monster): response = gamelift.start_matchmaking( ConfigurationName=config_name, Players=[{ "PlayerAttributes": { "skill": {"N": skill}, "desiredSkillOfMonster": {"N": skill}, "wantsToBeMonster": {"N": int(is_monster)} }, "PlayerId": player_id }], TicketId=ticket_id) # Uses matchmaker for brawler game mode with latency def start_matchmaking_for_three_team_brawler(config_name, ticket_id, player_id, skill, role): response = gamelift.start_matchmaking( ConfigurationName=config_name, Players=[{ "PlayerAttributes": { "skill": {"N": skill}, "character": {"S": [role]}, }, "PlayerId": player_id, "LatencyInMs": { "us-west-2": 20} }], TicketId=ticket_id) # Uses matchmaker for multiple game modes and maps based on player experience def start_matchmaking_for_multi_map(config_name, ticket_id, player_id, skill, maps, modes): response = gamelift.start_matchmaking( ConfigurationName=config_name, Players=[{ "PlayerAttributes": { "experience": {"N": skill}, "gameMode": {"SL": modes}, "mapPreference": {"SL": maps} }, "PlayerId": player_id }], TicketId=ticket_id)