- この記事は、Google Playゲームサービスに関する記事を和訳したものです。
- 原文: Turn-based Multiplayer
- 元記事のライセンスは CC-BYで、この和訳記事のライセンスは CC-BYです。
- 自己責任でご利用ください。
- 和訳した時期は 2019年7月ころです。
ターンベース型マルチプレイヤーゲームでは、単一の共有された状態が複数のプレイヤー間で渡され、ただ 1人のプレイヤーが一度に共有された状態を修正するための権限を持っています。 プレイヤーは、ゲームによって決定されたプレイの順序に従って、非同期的にターンを取ります。 あなたのゲームは次のタスクを管理するために、Google Playゲームサービスによって提供されるターンベース型マルチプレイヤー APIを使用することができます:
-
ターンベース型マルチプレイヤーのマッチに参加するためのプレイヤーを招待し、あなたのゲームに自動的にマッチされるランダムなプレイヤーを探し、あるいは両方の組み合わせをします。 Google Playゲームサービスは、マッチにて 8人の参加者までホストできるようにします。
-
参加者およびマッチの状態の情報を Googleのサーバ上に格納し、ターンベースのマッチのライフサイクルを通して、すべての参加者とともに更新されたマッチのデータを非同期的に共有します。
-
マッチの招待およびターンの通知をプレイヤーに送信します。 通知は、プレイヤーがログインしているすべての端末上に表示されます(無効でない限り)。
あなたのプラットフォーム用のターンベース型マルチプレイヤーゲームを実装する方法については、クライアントの実装を参照してください。
ターンベースのマッチの基本
ターンベースのマッチは、マッチ中にゲームデータを更新するために連続してターンを取る複数の参加者とのゲームセッションです。 マッチは、Google Playゲームサービスにサインインしているプレイヤーによって開始されなければなりません。 あなたのゲームは、マッチにて一緒の 8人までのプレイヤーを参加させるために、ターンベース型マルチプレイヤー APIを使用することができます、それは、開始プレイヤーと、あらゆるオートマッチされたプレイヤーを含みます。 マッチは非同期的に行われ、参加者はプレイするために Google Playゲームサービスに同時に接続されている必要はありません。
ターンベース型マルチプレイヤーのマッチはこれらの重要なプロパティを含みます:
-
参加者。 ユーザは、マッチを開始することによって、招待を受け入れることによってマッチに参加することによって、あるいは、ゲーム内でオートマッチされることによって、ターンベースのマッチにて参加者になることができます。 あなたのゲームは、マッチ中のすべてのプレイヤーのための参加者 IDを取得することができます。
-
ゲームデータ。 このマッチのためのゲーム固有のデータ。 マッチが進行するにつれて、現在のプレイヤーは Googleのサーバ上のゲームデータを修正し、保存することができます。 他の参加者は、それから、彼らのターンでこのデータを受信し更新することができます。 あなたのゲームは端末のプラットフォームに適した形式でゲームデータを格納しなければなりません。 例えば、Androidでは、このデータをバイト配列で格納しなければならず、そのサイズは 128KBを超えてはなりません。
-
マッチ状態。 マッチは次のいずれかの状態に分類することができます: マッチ中の参加者とゲームアクションに応じて
ACTIVE
、AUTO_MATCHING
、COMPLETE
、CANCELED
、EXPIRED
。 マッチの状態は Google Playゲームサービスによって管理されます。 あなたのゲームは、マッチが続けることができるかどうか、プレイヤーがオートマッチによって参加することができるかどうかを決定するために、そして、マッチが終わった場合(正常に完了したか、あるいは幾つかのユーザアクションの理由で終了したかどうか)、マッチの状態をチェックすることができます。
参加者
もしあなたのゲームがモバイル端末上で実行されているならば、ターンベース型マルチプレイヤー APIはデフォルトのプレイヤー選択 UIを提供します。 UIは、プレイヤーが友人を招き、あるいはオートマッチする相手の数を選択できるようにします。 これはあなたの UIコーディングを簡素化しますが、独自のプレイヤー選択 UIを実装することを選択することもできます。
ターンベースのマッチの参加者はこれらのカテゴリのいずれかに分類することができます:
-
開始プレイヤー。 ターンベース型ゲームを開始する開始プレイヤーは、マッチに参加するための他のプレイヤーを招き、あるいは、ランダムなユーザにオートマッチされることをリクエストすることができます。 さらには、開始プレイヤーは 2つのミックスをリクエストすることもできます(例えば、特定の友人を招待し、2つのオートマッチされたプレイヤーを取得する)。
-
オートマッチされたプレイヤー。 オートマッチされたプレイヤーはマッチに参加するための通知を受信しません; 彼らの観点からは、彼らはマッチを初期化している者として見えます。 オートマッチプレイヤーは、他のプレイヤーとソーシャルに接続されている必要はありません。
-
招待されたプレイヤー。 マッチに招待されたユーザは、彼らの通知の設定がそれを許可している限りは、彼らの端末上に招待の通知を受信するでしょう。 ユーザが Google Playゲームアプリを使用することによって彼らの通知設定を修正する方法については、Gaming with Google Play Gamesを参照してください。 ひとたびユーザがマッチの招待を受け入れれば、ユーザは参加者としてマッチに参加されます。
もしプレイヤーが特定の人をゲームに招待することを選択するならば、彼らのアカウントの設定、彼らが使用する UI、およびゲームのスコープに応じて、彼らが選択することができる人々が異なるかもしれません。
-
一般的に、招待者は、常に最新の対戦相手を招待することができ、常にプレイヤーをオートマッチさせることができるでしょう。
-
Googleによって提供されたデフォルト UIでは、“Nearby players” オプションを表示することもできるでしょう。
-
Googleによって提供されたデフォルト UIでは、発見可能なプロファイルを伴うプレイヤーは、彼らが
PLUS_LOGIN
スコープをを持つかどうかに関係なく、サークルされた友人と同様に表示されるでしょう。 -
getInvititablePlayers()
メソッドを使用すると、PLUS_LOGIN
スコープをリクエストしたゲームは、彼らが発見可能なプロファイルを持っているかどうかに関係なく、戻り値にてサークルされた友人を取得するでしょう。
幾つかの場合では、プレイヤーがデフォルトの招待可能な友人を持っていないかもしれないことに注意してください。
ターンテイキング
ターンテイキングの基本的なフローは次のとおりです:
-
もしプレイヤーがマッチを開始したならば、ゲームデータが nullかどうかをチェックします。 もしそうであれば、クライアントはあなたのゲームの必要に応じてこのデータを初期化する必要があります。 例えば、戦略ゲームにてプレイヤーのために開始位置を初期化する、あるいは、カードゲームにてプレイヤーのために最初の持ち札を初期化する必要があるかもしれません。
-
現在のプレイヤーに彼らの通常のターンを実行させます。
-
マッチを更新します。 Android上では、
takeTurn()
を呼び出します。あなたのメソッド呼び出しでは、次の情報を渡します:
- 現在のプレイヤーがターンを実行した後のマッチの状態。
- 次のターンを取るプレイヤー。 次のプレイヤーを指定することの詳細については、プレイの順序を指定するを参照してください。
-
マッチが完了するまで、あるいはゲームが幾つかの他の方法で終了するまで、step2と 3を繰り返します。
プレイの順序を指定する
プレイの順序はあなたのゲームのデザインによって決定されます。 Google Playゲームサービスによって提供されるターンベース型マルチプレイヤーの APIは、あなたのゲームにマッチ中のプレイの順序を柔軟に指定できるようにします。
マッチが更新されるとき、あなたのゲームはこれらのプレイヤーの一人に次のターンを取ることを割り当てることができます:
-
ターンを取った現在のプレイヤー。
-
マッチに招待されている、あるいは既にマッチに参加している他のプレイヤー。
-
マッチに参加していないオートマッチのプレイヤー(もし空いているオートマッチのスロットが開いているならば)。 この場合、プレイヤーが参加するまでマッチは中断されます。
例えば、2人プレイヤーのターンベース型のマッチにて、あなたのゲームは最初のターンを取るためにランダムに 1人のプレイヤーを選び、それから、続いて次のターンを他のプレイヤーに切り替えるかもしれません。
通知
もしモバイル端末上でターンベース型マルチプレイヤーの APIを使用しているならば、Google Playゲームサービスはこれらのタイプの通知を送信します:
-
マッチの招待。 マッチに参加することを招待されていて、ゲームによって彼らの最初のターンをプレイすることを割り当てられたとき、この通知を受信します。
-
ターンの通知。 プレイヤーが既にマッチに参加していて、ゲームが彼を次のプレイヤーに割り当てたとき、この通知を受信します。
-
マッチイベントの通知。 マッチのイベントが発生する(例えば、マッチが開始された、更新された、あるいは、キャンセルされたなど)たびに、同じマッチに参加しているゲームクライアントはこれらの通知を受信します。
Android端末上では、プレイヤーに彼らが参加しているすべてのマッチのリストを表示できるようにするための。Google Playゲームサービス SDKによって提供されたマッチリストのユーザインタフェースを起動することができます。
マッチの状態
次の表はターンベースのマッチの可能な状態をリストしています:
マッチの状態 | 説明 |
---|---|
ACTIVE |
新しいマッチが作成され、あなたのゲームがマッチの参加者に彼らのターンを取らせることができることを示しています。 |
AUTO_MATCHING |
この状態は、利用できる空のオートマッチのスロットがまだあり、あなたのゲームがオートマッチされたプレイヤーが参加することを待っていることを示しています。 あなたのゲームは、マッチがこの状態にある間は、他のマッチの参加者にターンを取らせることができません。 |
COMPLETE |
マッチが完了までプレイされた(例えば、プレイヤーがマッチに勝った)ことを示します。 ひとたびプレイヤーがゲームが終了したとシグナルしたならば、Google Playゲームサービスはマッチが終了したことを彼らに通知するためにすべてのマッチの参加者に通知を送信します。 プレイヤーは彼らの最後のゲームデータを保存する機会を持っているが、ゲームの状態をさらに修正することはできないかもしれません。 |
CANCELED |
マッチが通常の完了の前に終了したことを示します。 これは、例えば、マッチに招待されたユーザが招待を断った場合、あるいは参加者が明示的にマッチをキャンセルした場合に起こるかもしれません。 Google Playゲームサービスは、参加者に、マッチに参加した後の任意の時点でマッチをキャンセルできるようにしています(もしあなたのゲームのインタフェースがこのアクションをサポートしているならば)。 |
EXPIRED |
マッチが失効していることを示します。 ユーザが招待あるいはターンの通知に 2週間応答しないとき、マッチは失効します。 さらには、利用可能な空のオートマッチのスロットがあるが、Google Playゲームサービスがオートマッチさせるためのユーザを見つけることができなかった場合、マッチは 1日で失効します。 |

Figure 1のコールアウトは、遷移がマッチの状態間でどのように起こるかを説明しています:
-
A: 最初のプレイヤーがターンを取った後、あなたのゲームは次のターンを取るために保留中の参加者を指定することができます。 もし保留中の参加者が
null
でなければ、Google Playゲームサービスは保留中の参加者にターンの通知を送信し、マッチはACTIVE
状態に留まります。 -
B: マッチが最後までプレイされました。 それぞれの参加者はマッチのデータを取得することはできますが、ゲームの状態をさらに修正することはできないかもしれません。
-
C: この遷移は、プレイヤーがマッチの招待を断ったとき、参加者がマッチをキャンセルしたとき、あるいは参加者がただ 1人の他の参加者のみを伴うマッチから離れたときに起こります。
-
D: プレイヤーがマッチあるいはターンの通知に 2週間応答しませんでした。 例えば、これは、プレイヤーがマッチのユーザインタフェースからマッチを却下したときに起こるかもしれません。
-
マッチは、プレイヤーがオートマッチによって参加するたびに、
AUTO_MATCHING
からACTIVE
状態に遷移します。 逆に、マッチは、保留中の参加者としてnull
を指定したとき、ACTIVE
からAUTO_MATCHING
に遷移します。 新しいプレイヤーがオートマッチによって参加するまでマッチを中断したときは、これをするかもしれません。 少なくとも 1つの空のオートマッチのスロットが利用可能でなければなりません。AUTO-MATCHING
状態にあるマッチは、マッチの参加者がマッチを離れたが、他の参加者がまだ残っている場合には、同じ状態に留まります。 -
F: この遷移は、Google Playゲームサービスがオートマッチさせるためのプレイヤーを見つけられなかったとき、1日後に起こります。
-
G: この遷移は、ゲームがオートマッチのプレイヤーが参加することを待っているとき、マッチの参加者がマッチをキャンセルしたときに起こります。
クライアントの実装
あなたのプラットフォーム用のターンベース型マルチプレイヤーサポートを実装する方法については、次のリソースを参照してください: