あなたのゲームにターンベース型マルチプレイヤーサポートを追加する



  • この記事は、Google Playゲームサービスに関する記事を和訳したものです。
  • 原文: Adding Turn-based Multiplayer Support to Your Game
  • 元記事のライセンスは CC-BYで、この和訳記事のライセンスは CC-BYです。
  • 自己責任でご利用ください。
  • 和訳した時期は 2019年7月ころです。

このガイドでは、C++アプリケーションにて Playゲームサービスを使用するターンベース型マルチプレイヤーゲームを実装する方法を示します。

始める前に

もしまだそうしていなければ、ターンベース型マルチプレイヤーのゲームコンセプトをレビューすることは役立つかもしれません。

あなたのターンベース型マルチプレイヤーゲームをコーディングし始める前に:

マッチを開始する

ターンベースのマッチを開始するために、あなたのゲームは、プレイヤーに、彼らがどのように他の参加者とマッチされたいかを選択するよう、あるいは幾つかのデフォルトの基準を使用してマッチを構築するよう促すことができます。 Playゲームサービスは、あなたのゲームに TurnBasedMatchオブジェクトを返すためにあなたのゲームからマッチの構成データを使用します; 参加者が、ターンを取るといったアクションを実行するたびに、ゲームは OnTurnBasedMatchEventCallbackあるいは OnMultiplayerInvitationEventCallbackを経由して他の参加者に通知します。

マッチを開始するには、次の手順に従います:

  1. あなたのアプリにて、プレイヤーがプレイしたいターンベースのマッチの種類の仕様と、誰がマッチに参加することができるかを収集します。
    • あなたのゲームは、SDKによって提供されたビルトインのプレイヤー選択 UIを表示する、あるいは、このデータを収集するための独自の UIを使用することができます。 プレイヤー選択 UIを使用する方法については、デフォルトのユーザインタフェースを用いてプレイヤーを選択するを参照してください。
    • 別の方法として、ユーザにプレイヤー選択 UIをバイパスさせ、代わりにマッチを構築するための幾つかのデフォルトの基準を使用させるために、クイックスタートボタンを実装することができます。
  2. TurnBasedMatchConfig構造体を作成するために TurnBasedMatchConfig::Builderを使用します。
  3. TurnBasedMatchConfig()を呼び出し、作成した TurnBasedMatchConfig構造体を渡します。 もしオートマッチが指定されているならば、Playゲームサービスは既存のゲームにプレイヤーをマッチしようとするでしょう; 詳細については、オートマッチを実装するを参照してください。

ターンベースのマッチを作成するために、あなたのゲームはこれらのメソッドを呼び出すことができます:

メソッド 説明
ShowPlayerSelectUI() オプション。 デフォルトのプレイヤー選択 UIを起動します。 この UIから、ユーザのマッチに招待するために他のプレイヤーを選択し、あるいはランダムなプレイヤーを用いてオートマッチされることをリクエストすることができます。
CreateTurnBasedMatch() 新しいターンベースのマッチオブジェクトを作成します、あるいは、もしオートマッチがリクエストされたならば、ユーザの基準を満たしている既存のマッチをロードします。 もしオートマッチがリクエストされたならば、返されるマッチは新しいマッチか、他のプレイヤーが既にターンを取った既存のマッチのいずれかになります。 もし新しいマッチが返されたならば、ユーザは最初のターンを取らなければなりません。 あなたのゲームは、新しいマッチがロードされたか既存のマッチがロードされたかに関わらず、ターンテイキングを処理する責任があります。

デフォルトのユーザインタフェースを用いてプレイヤーを選択する

Playゲームサービスは、プレイヤーに、マッチに招待するために彼らの友人を選択させる、あるいは、ランダムなプレイヤーとオートマッチされることを選択させるデフォルトのプレイヤー選択 UIを提供します。 デフォルトのプレイヤー選択 UIからマッチを開始するには、ShowPlayerSelectUI()を呼び出します。 もし呼び出しが成功したならば、ゲームは、マッチに招待される者およびオートマッチのためにプレイヤーの数を選択するようユーザに促す、デフォルトのプレイヤー選択 UIを表示します。 ユーザのプレイヤー選択の基準は、提供される PlayerSelectUICallbackを経由して返されます。

  //service_ : std::unique_ptr<gpg::GameServices> service_;
    service_->TurnBasedMultiplayer().ShowPlayerSelectUI(
        MIN_PLAYERS, MAX_PLAYERS, true,
        [this](gpg::TurnBasedMultiplayerManager::PlayerSelectUIResponse const &
               response) {
  ...
        });
      }
    });

アプリが、提供される PlayerSelectUICallbackを経由して PlayerSelectUIResponseを受信したとき、マッチを開始するで説明したように、新しい TurnBasedMatchConfigオブジェクトを作成することに対応する提供された値を使用することができます。

  LogI("selected match %d", response.status);
      if (response.status == gpg::UIStatus::VALID) {
    // Create new match with the config
        gpg::TurnBasedMatchConfig config = gpg::TurnBasedMatchConfig::Builder()
            .SetMinimumAutomatchingPlayers(response.minimum_automatching_players)
            .SetMaximumAutomatchingPlayers(response.maximum_automatching_players)
            .AddAllPlayersToInvite(response.player_ids).Create();
        EnableUI(false);
        service_->TurnBasedMultiplayer().CreateTurnBasedMatch(
            config,
            [this](
                gpg::TurnBasedMultiplayerManager::TurnBasedMatchResponse const &
                matchResponse) {
          EnableUI(true);
          if (matchResponse.status == gpg::MultiplayerStatus::VALID) {
            PlayGame(matchResponse.match);
          }

ひとたび TurnBasedMatchConfigが作成されたならば、それは CreateTurnBasedMatchを呼び出すために使用されることができます。 アプリは TurnBasedMatchCallbackCreateTurnBasedMatchに提供します。 もし呼び出しが成功したならば、コールバックは新しく生成されたマッチを伴う TurnBasedMatchResponseを返すでしょう。

もしデフォルトのプレイヤー選択 UIを使用せずにマッチを作成したければ、あなたのゲームは希望するプレイヤーの IDとオートマッチの設定を用いて TurnBasedMatchConfigを構築しなければなりません。 TurnBasedMatchConfig::Builderオブジェクトを使用してこれを行います。

もしデフォルトのプレイヤー選択 UIを使用せずにマッチを作成したければ、あなたのゲームは CreateTurnBasedMatch()に渡す TurnBasedMatchConfigオブジェクトにて招待されるプレイヤーの IDとオートマッチの基準を提供しなければなりません。

必要に応じて、ゲームのバリアントの特定のタイプに興味を持っているプレイヤーのみが一緒にオートマッチされることを保証したいかもしれません。 もしあなたのアプリに異なったバージョンがあるならば、あなたのゲームは、互換性のあるバージョンのプレイヤーのみがオートマッチされることを保証するためにバリアントを使用することもできます。 ターンベースのマッチを作成するときにバリアントを指定するには、SetVariant()メソッドを使用します。 さらには、あなたのゲームはゲーム内で特定の排他的な役割を果たすことに興味を持っているオートマッチされたプレイヤーをペアリングするために SetExclusiveBitMask()を使用することができます。

最初のターンを取る

もし CreateTurnBasedMatch()呼び出しが成功したならば、Playゲームサービスは、提供される TurnBasedMatchCallbackを経由して TurnBasedMatchを返します。 先に進む前に、あなたのゲームによって必要に応じてゲームデータを初期化することを忘れないでください。 例えば、戦略ゲームではプレイヤーのために最初の位置を初期化する必要があるかもしれません、あるいはカードゲームではプレイヤーのために最初の持ち札を初期化する必要があるかもしれません。

最初のターンを実装するには、次の手順に従います:

  1. TurnBasedMatchResponseオブジェクトから TurnBasedMatchオブジェクトを取得し、それから HasData()を呼び出します。
    • もし呼び出しが false値を返したならば、これは、プレイヤーがまだターンを取っていないのでゲームデータが初期化されていない(つまり、現在のプレイヤーがこのマッチでの最初のプレイヤーである)ことを示しています。 あなたのゲームはゲームデータを初期化し、それをバイト配列に格納することができます。 ゲームデータのサイズは 128KB以下でなければなりません。
    • もし呼び出しが true値を返したならば、これは、ゲームが既に開始しており、ゲームデータが既に初期化されていることを示しているので、あなたのゲームがデータを再び初期化しないことを確認してください。
  2. 必要に応じて、すぐに TakeMyTurn()を呼び出します。 もしあなたの初期状態がランダム値に基づいていて(例えば、プレイヤーがランダムな持ち札とともに開始するカードゲーム)、かつ、あなたのゲームが Googleのサーバにデータを永続化するために TakeMyTurn()を呼び出さなければ、プレイヤーはより良い開始位置を取得しようとするために最初のターンをリスタートし続ける可能性があります。
  3. プレイヤーにゲームアクションを実行させます、そして適切な場合に、ゲームデータを含むバイト配列を更新します。
  4. TakeMyTurn()を呼び出すことによって、ゲームデータを Googleのサーバに保存します。 あなたのゲームは次のプレイヤーの参加者 IDを指定することができます、あるいは、Playゲームサービスにオートマッチのためのプレイヤーを見つけさせるために AUTOMATCHING_PARTICIPANTを指定することができます。 あなたのゲームは、すべての招待されたプレイヤーが参加していないとき、あるいはオートマッチのスロットがまだ利用可能であるときでさえマッチの参加者にターンを取らせることができます。 プレイヤーがより早くゲームプレイに参加するために、あなたのゲームは、プレイヤーが、彼らが参加したらすぐに彼らのターンを取ることができるようにする必要があります。 TakeMyTurn()を呼び出したとき、Playゲームサービスは保留中の参加者に通知を送信し、すべての参加者の端末上のターンデータを非同期的に更新します。
  5. 次のプレイヤーがターンを取ったとき、プレイヤーにゲームアクションを実行させる前に Data()を呼び出すことによって初期化されたデータをロードしてください。

次のスニペットでは、マッチを初期化し、プレイヤーに最初のターンを取らせる方法を示しています。

gpg::TurnBasedMultiplayerManager& manager = service_->TurnBasedMultiplayer();
gpg::TurnBasedMatchConfig config =
    gpg::TurnBasedMatchConfig::Builder().SetMinimumAutomatchingPlayers(1)
        .SetMaximumAutomatchingPlayers(2).Create();

EnableUI(false);
manager.CreateTurnBasedMatch(
    config,
    [this](gpg::TurnBasedMultiplayerManager::TurnBasedMatchResponse const &
           matchResponse) {
  EnableUI(true);
  if (matchResponse.status == gpg::MultiplayerStatus::VALID) {
    PlayGame(matchResponse.match);
  }
});

オートマッチを実装する

あなたのゲームが CreateTurnBasedMatch()を呼び出し、MinimumAutomatchingPlayers() および/あるいは MaximumAutomatchingPlayers()を指定することによってオートマッチをリクエストしたとき、Playゲームサービスは、まず既存のゲームにプレイヤーをマッチさせようとします。 もしプレイヤーのオートマッチの基準を満たしているマッチが見つかったならば、Playゲームサービスは、既存のマッチにオートマッチされたプレイヤーとして、プレイヤーと任意の招待されたプレイヤーに自動的に参加します。 もしマッチが見つからなければ、あなたのゲームはオートマッチが利用可能であることをシグナルする必要があります:

  1. 開始プレイヤーに最初のターンを取るよう促します。
  2. 必要に応じて、開始プレイヤーが彼らの最初のターンを完了した後、あなたのゲームはマッチに参加した他の招待されたプレイヤーに最初のターンを取らせることもできます。
  3. オートマッチをトリガするために、TakeMyTurn()を呼び出し、next_participantパラメータに AUTOMATCHING_PARTICIPANTを渡します。

招待を処理する

ひとたびプレイヤーがあなたのゲームにサインインしたならば、プレイヤーは他のプレイヤーによって作成されたターンベースのマッチに参加するための招待を受信するかもしれません。 コーディングの時間を節約し、アプリケーションを超えてマッチの招待に応答するための一貫性のある UIをユーザに提供するために、SDKによって提供されたデフォルトのマッチ受信トレイ UIを使用することができます。 デフォルトのマッチ受信トレイ UIを起動するには、ShowMatchInboxUI()を呼び出します。

もしあなたのゲームがデフォルトのマッチ受信トレイ UIを使用していないならば、ターンベースのマッチのための招待を処理するために、SetOnMultiplayerInvitationEventを経由してコールバックを登録することができます。 以下のメソッドは、受信した招待を操作するために使用することができます:

メソッド 説明
AcceptInvitation ユーザがマッチの招待を受信し、招待を受け入れたい場合は、このメソッドを呼び出します。 このメソッドを呼び出すと、ユーザの参加者のステータスを ParticipantStatus::JOINEDに変更します。 ユーザは、それからターンを取ることを進めることができます。
DeclineInvitation() ユーザがマッチの招待を受信したが、マッチを進めることを停止したい場合は、このメソッドを呼び出します。 このメソッドを呼び出すと、効果的にマッチをキャンセルし、このユーザに登録されているすべての GameServicesオブジェクトからマッチを除去します。 ユーザの参加者のステータスは ParticipantStatus::DECLINEDに変化し、マッチのステータスは MatchStatus::CANCELEDに変化します。 他の参加者は、このマッチを、マッチリスト UIにて Completed Matchesカテゴリの下に見ます。
DismissInvitation() ユーザがマッチの招待を受信したが、招待を永遠に無視したい場合は、このメソッドを呼び出します。 このメソッドを呼び出すと、このユーザに登録されているすべての GameServicesオブジェクトから招待を除去します。 ユーザの参加者のステータス、および、マッチのステータスは変化せずに留まります。 マッチの他の参加者には、ユーザがまだ招待されているように表示されます。

ターンを取る

最初のプレイヤーはターンを取った後、あなたのゲームは同じ参加者あるいは他の参加者が次のターンを取るようにさせることができます。 一般的に、ターンテイキングは、Playゲームサービスから最新のマッチデータをフェッチします、そして、参加者にあなたのゲームと対話させ、マッチデータを更新し、他の参加者にターンを渡すために TakeMyTurn()を呼び出します。

ターンテイキングを実装するには、これらの手順を実行します:

  1. 必要に応じて、もしマッチ内のいかなる参加者がターンを取るたびに通知されたいならば、GameServices作成時に GameServices::BuilderOnTurnBasedMatchEventCallbackを提供します。 マッチが次のプレイヤーのターンの後で更新されるたびに、あなたのリスナは通知されます。
  2. ターンを取る参加者のために、マッチは MY_TURN状態でなければなりません。 あなたのゲームは、これを確認するために TurnBasedMatchオブジェクトを使用することができます。
    • Status()を呼び出すことによって、マッチのステータスをチェックします。 MY_TURNという結果は、ローカルの参加者がターンを取ることができることを示しています。
  3. Data()を呼び出すことによって、Playゲームサービスから最新のマッチデータをロードし、あなたのゲームをそれに応じてレンダリングします。
  4. ユーザにゲームアクションを実行させ、適切な場合には、更新されたゲームデータをバイト配列に保持します。
  5. 次のターンを取る必要がある保留中の参加者を決定します。 これは、通常、あなたのゲームデザインによって指定されたプレイの順序に依存しています。 保留中の参加者は、マッチ内の他の参加者、あるいは現在のターンの参加者であることができます。 あなたのゲームは、保留中の参加者に AUTOMATCHING_PARTICIPANTを設定することによって、オートマッチによって参加している次のプレイヤーにターンを渡すこともできます。
  6. 最新のゲームデータを用いて Playゲームサービスを更新するために TakeMyTurn()を呼び出し、保留中の参加者にターンを渡します。 Playゲームサービスは、提供された TurnBasedMatchCallbackを経由してあなたのマッチの更新操作のステータスを返します。 もし更新が成功したならば、Playゲームサービスは彼らに彼らのターンであることを知らせるために保留中の参加者に通知を送信します。

ターンを取るには、このメソッドを使用します:

メソッド 説明
TakeMyTurn() このメソッドを呼び出した後、ユーザは、このマッチを、マッチリスト UIの Their Turnリストの下に見ます。
  • もしメソッド呼び出しにて参加者 IDが指定されたならば、その参加者が現在のプレイヤーになり、ターンをプレイすることができます。 これが招待されたプレイヤーに初めて起こったとき、プレイヤーは招待の通知を受信します。 続いて、プレイヤーはターンベースのマッチの通知を受信します。
  • もし AUTOMATCHING_PARTICIPANTが指定されているならば、参加者はオートマッチを経由して見つけられようとします。 現在のマッチにて利用可能なオートマッチのスロットがある場合のみ、特別なオートマッチの参加者を指定することができます。
  • あなたのゲームは、保留中の参加者として現在のプレイヤーを用いて TakeMyTurn()を呼び出すことができます。 この場合、Playゲームサービスはゲームデータをアップロードしますが、通知は送信されません。

次のスニペットでは、現在のプレイヤーのターンを実装する方法を示しています:

void Engine::TakeTurn(const bool winning, const bool losing) {
  gpg::TurnBasedMultiplayerManager &manager = service_->TurnBasedMultiplayer();

  // When it is MY_TURN, localParticipant is always PendingParticipant().
  gpg::MultiplayerParticipant localParticipant =
      current_match_.PendingParticipant();

  LogI("Taking my turn. local participant id:%s",
       localParticipant.Id().c_str());

  gpg::MultiplayerParticipant nextParticipant =
      current_match_.SuggestedNextParticipant();

  if (!nextParticipant.Valid()) {
    //Error case
    manager.DismissMatch(current_match_);
    return;
  }

  turn_counter_++;
  std::vector<uint8_t> match_data = SetupMatchData();

  //By default, passing through existing participatntResults
  gpg::ParticipantResults results = current_match_.ParticipantResults();

  if (winning) {
    //Create winning participants result
    results = current_match_.ParticipantResults()
        .WithResult(localParticipant.Id(), // local player ID
                    0,                     // placing
                    gpg::MatchResult::WIN  // status
                    );
  } else if (losing) {
    //Create losing participants result
    results = current_match_.ParticipantResults()
        .WithResult(localParticipant.Id(), // local player ID
                    0,                     // placing
                    gpg::MatchResult::LOSS // status
                    );
  }

    //Take normal turn
  manager.TakeMyTurn(
      current_match_, match_data, results, nextParticipant,
      [this](gpg::TurnBasedMultiplayerManager::TurnBasedMatchResponse const &
             response) {
    LogI("Took turn");
  });
}

プレイの順序をランダム化させる

幾つかのゲームでは、プレイの順序はプレイヤーがターンを取ることができるラウンドごとにランダム化されます。 あなたのゲームにてプレイの順序をランダム化させるには、次のアプローチを使用することができます:

  1. 最初のラウンドでは、彼らがプレイの準備ができているかどうかを判断するために、それぞれの参加者(つまり、招待あるいはオートマッチによって参加したそれぞれのプレイヤー)をポーリングします。
  2. ひとたびすべての参加者が準備できたならば、あなたのゲームは彼らの参加者 IDをランダムにオーダーすることができ、それから、連続して takeTurn()を呼び出し、ランダム化された順序に従って次のプレイヤーのための参加者 IDを渡します。

ゲームの状態を保存する

あなたのゲームの状態データが 128KB以下に収まる場合は、あなたのゲームの状態を管理するためにターンベース型マルチプレイヤー APIを使用することができます。 ターンベース型マルチプレイヤー APIを用いてゲームの状態を保存するには:

  1. TakeMyTurn()を呼び出し、あなたのゲーム状態のデータを matchDataとして渡します。
  2. もし呼び出しが成功したならば、Playゲームサービスは更新についてマッチ内の他の参加者に通知し、マッチのデータをすべての参加者の端末上で利用可能にします。
  3. あなたのゲームは、それから、更新されたゲームの状態を取得するために Data()を呼び出すことができます。

プレイヤーのターンが中断されるときや一時的にゲームから離れなければならない(例えば、電話の着信呼び出しによって)ときはいつでも、あなたのゲームは部分的に完成したターンのためにゲームデータを保存しようとする必要があります。 これを行うには、TakeMyTurn()を呼び出すために、あなたのアクティビティのメソッドをオーバーライドします。 TakeMyTurn()への最後の呼び出しと同じ参加者 IDを使用することによって、保留中の参加者として現在のプレイヤーを指定してください。 もし成功したならば、呼び出しは Googleのサーバにてゲームデータを格納しますが、新しいターンの通知を生成しません。

マッチを完了する

マッチが最後までプレイされたとき(例えば、ユーザがゲームに勝った)、あなたのゲームはユーザのゲームデータをアップロードするために FinishMatchDuringMyTurn()を呼び出し、他の参加者にそのマッチが終わったことをシグナルする必要があります。 マッチは、それから、ユーザのマッチリストにて Completed Matchesカテゴリの下に表示されます。

ひとたびプレイヤーがマッチ内で初めて FinishMatchDuringMyTurn()を呼び出したならば、あなたのゲームはこのマッチ内で再び TakeMyTurn()を呼び出すことはできません。 Playゲームサービスは、マッチが終わったことを彼らに通知するためにすべての他のマッチの参加者に通知を送信します。 これらの参加者は、彼らそれぞれのマッチリスト UIにて Your Turnカテゴリの下にこのマッチを見ます。 この時点で、あなたのゲームは、これらの参加者がマッチの結果を認めるために ConfirmPendingCompletion()を呼び出すことができます。 さらには、このメソッドを呼び出すと、マッチを、参加者のマッチリスト UI内の Completed Matchesカテゴリに移動させます。

マッチを完了するには、このメソッドを使用します:

メソッド 説明
FinishMatchDuringMyTurn() このメソッドを呼び出すと、マッチのステータスを MatchStatus::COMPLETEDに変更します。 FinishMatchDuringMyTurn()がマッチ内で初めて呼び出された後、Playゲームサービスは彼らにマッチが終わったことを通知するために他のマッチの参加者に通知を送信します。
ConfirmPendingCompletion() このメソッドを呼び出すと、ステータス MatchStatus::PENDING_COMPLETIONのマッチのマッチ結果を認めます。 FinishMatchDuringMyTurn()の後です。

マッチから離れる

参加者は、マッチが続けるようにしている間は、マッチ中のいつでも離れることを選ぶことができます。 参加者が離れていることをシグナルするために、あなたのゲームは LeaveMatchDuringMyTurn()あるいは LeaveMatchDuringTheirTurn()のいずれかを呼び出す必要があります。 参加者がマッチから離れたとき、マッチは次のいずれかの条件が満たされる限り、他の参加者とともにまだ続けることができます:

  • 残っている参加者が 2人以上いる、あるいは
  • 残っている参加者が 1人いて、少なくとも 1つの空のオートマッチのスロットが利用可能である。

そうでなければ、マッチはキャンセルされます。

一般的には、参加者がマッチから離れたとき、他のプレイヤーがその参加者の場所に参加し、取ることはできません。 1つの例外は、オートマッチによって参加した、ターンを取ったことがないプレイヤーが、LeaveMatchDuringMyTurn()を呼び出すときです。 この場合、マッチは、離れた参加者の場所を引き継ぐことができる他のプレイヤーを見つけようとします。

マッチから離れるために、あなたのゲームはこれらのメソッドを呼び出すことができます:

メソッド 説明
LeaveMatchDuringTheirTurn() このユーザに登録されたすべての GameServicesオブジェクトからマッチを除去します。 MatchStatus::THEIR_TURNのときのみこのメソッドを呼び出すべきです。 このメソッドを呼び出すと、ユーザの参加者のステータスを ParticipantStatus::LEFTに変更します。 もしあと 1人の参加者しか残っていなければ、マッチのステータスは MatchStatus::Canceledに変化します。
leaveMatchDuringMyTurn()) ユーザに登録されたすべての GameServicesオブジェクトからマッチを除去します。 マッチの状態が MatchStatus::MY_TURNのときのみこのメソッドを呼び出すべきです。 このメソッドを呼び出すと、ユーザの参加者のステータスを ParticipantStatus::LEFTに変更します。
  • もしあと 1人の参加者しか残っていなければ、マッチのステータスは MatchStatus::CANCELEDに変化します。
  • もしメソッド呼び出しにて参加者が指定されていたならば、その参加者は現在のプレイヤーになり、ターンをプレイすることができます。 最初にこれが招待されたプレイヤーに起こったとき、プレイヤーは招待の通知を受信します。 続いて、プレイヤーはターンの通知を受信します。
  • もしオートマッチのスロットが利用可能であれば、次の参加者に AUTOMATCHING_PARTICIPANTが指定されることもできます。

マッチをキャンセルする

CancelMatch()を呼び出すことによって、あなたのゲームはマッチが正常に最後までプレイされる前にすべての参加者のためにマッチを終了することができます。 このメソッドを呼び出した後、あなたのゲームはこのゲームにて再び TakeMyTurn()を呼び出すことはできません; マッチは、今、マッチリスト UIにて Completed Matchesカテゴリの下に表示されます。

マッチをキャンセルするには、このメソッドを使用します:

メソッド 説明
CancelMatch() ユーザに登録されたすべての GameServicesオブジェクトからマッチを除去します。 アクティブなマッチにてユーザのターンのときにのみこのメソッドを呼び出すべきです。 このメソッドを呼び出すと、ユーザの参加者のステータスは ParticipantStatus::LEFTに変化し、マッチのステータスは MatchStatus::CANCELEDに変化します。

マッチを却下する

あなたのゲームはユーザにターンあるいは招待を却下させることができます、そうすれば、彼らはマッチを再び見る必要がありません。 これは却下した者のマッチリスト UIからマッチを隠し、却下した者のターンでゲームプレイをストールさせることを引き起こします; マッチはキャンセルされたとき、あるいは 2週間後に失効したときに終了します。 他の参加者には、却下した者はまだマッチの参加者として表示されます。 他のプレイヤーが却下した者の場所を取ることはできません。

マッチを却下するには、このメソッドを使用します:

メソッド 説明
DismissMatch() ユーザに登録されたすべての GameServicesオブジェクトからマッチを除去します。 ユーザの参加者のステータスは変化しません。

マッチの失効を追跡する

プレイヤーがマッチあるいはターンの通知に 2週間応答しない場合には、マッチは失効させることができます(例えば、そのターンであるプレイヤーが、デフォルトのマッチリスト UIにて Dismissを選択した後)。 どのプレイヤーがゲームの失効を引き起こしたかを識別するために、ゲームクライアント上で次のアプローチを使用することができます:

  1. FetchMatches()を呼び出すことによって、現在サインインしているプレイヤーのゲームのリストをロードします。
  2. MatchStatus::EXPIRED状態にあるマッチのために、そのリストをフィルタリングします。
  3. もしマッチの参加者が ParticipantStatus::UNRESPONSIVE状態を持っているならば、それは、このプレイヤーがゲームを失効させたことを示しています。

再マッチを実装する

マッチが終わったとき、参加者は同じ招待された者およびオートマッチの相手のセットとの再マッチをプレイしたいかもしれません。 あなたのゲームは Rematch()を呼び出すことによって再マッチを開始することができます。 あなたのゲームは、マッチの状態が MatchStatus::COMPLETEで、他の参加者が再マッチをリクエストしていないときのみ、このメソッドを呼び出すことができます。 もし呼び出しが成功したならば、Playゲームサービスはすべての再マッチされた相手に招待の通知を送信します。

再マッチを実装するには、このメソッドを使用します:

メソッド 説明
Rematch() 前回のマッチと同じ参加者との新しいターンベースのマッチのオブジェクトを作成します。 ユーザはそれから最初のターンを取らなければなりません。 既に他の参加者が既に再マッチをリクエストしていたならば、このメソッドを呼び出すことは MultiplayerStatus::ERROR_MATCH_ALREADY_REMATCHEDエラーを返します。

もしあなたのゲームがデフォルトのマッチ受信トレイ UIを使用しているならば、プレイヤーはその UIから再マッチを開始することもできます。