リアルタイム型マルチプレイヤー



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

あなたのゲームは、単一のゲームセッション内に複数のプレイヤーを一緒に接続し、接続されたプレイヤーの間でデータメッセージを転送するために、Google Playゲームサービスにおけるリアルタイム型マルチプレイヤー APIを使用することができます。 リアルタイム型マルチプレイヤー APIを使用することは、あなたのゲーム開発の労力を簡素化するのに役立ちます、なぜなら APIはあなたに代わって次のタスクを処理するからです:

  • リアルタイム型マルチプレイヤーのルームを作成し、維持するためのネットワーク接続を管理します(ルームとは、同じゲームセッションの複数のプレイヤー間でネットワーク通信を可能にし、プレイヤーが互いに直接データを送信することができる仮想的な構成です)。
  • ルームに参加するプレイヤーを招待し、ランダムプレイヤー、オートマッチ、あるいは、その両方の組み合わせを検索するためのプレイヤー選択ユーザインタフェイス(UI)を提供します。
  • リアルタイム型マルチプレイヤーのライフサイクル中は、参加者とルームの状態の情報を Google Playゲームサービス上に格納します。
  • ルームの招待および更新をプレイヤーに送信します。 通知は、プレイヤーがログインしているすべての端末上に表示されます(無効でない限り)。

あなたのプラットフォーム用のリアルタイム型マルチプレイヤーゲームを実装する方法については、クライアントの実装を参照してください。

リアルタイム型マルチプレイヤーゲームの基本

リアルタイム型マルチプレイヤー APIを使用してあなたのゲームをデザインし、実装する前に、リアルタイム型マルチプレイヤーゲームの典型的なライフサイクルに関連する次のコンセプトを理解しておく必要があります。

ルームの初期化

内部的には、ルームは参加者のピアツーピアのメッシュネットワークをセットアップします、そこでは、クライアントは Google Playゲームサービスのサーバーを介してではなく、お互いに直接通信することができます。

リアルタイム型マルチプレイヤー下のセッションが端末上で開始される前に、端末のユーザはあなたのゲームにてサインインされなければなりません。 ローカルプレイヤー(つまり、あなたのゲームが実行している端末にログインしているユーザ)は、それから、ゲームに参加するために友人を招待することによって、あるいはオートマッチされることをリクエストすることによって、マルチプレイヤーのゲームセッションを開始することができます。

もしあなたのゲームがモバイル端末上で実行されているならば、リアルタイム型マルチプレイヤー APIはデフォルトのプレイヤー選択 UIを提供します。 UIは、プレイヤーが彼らの友人を招き、あるいはオートマッチの相手の数を選択できるようにします。 これはあなたの UIコーディングを簡素化しますが、あなたのプレイヤー選択 UIを実装することを選択することもできます。

プレイヤーの選択とルームの設定の詳細(UIを介してローカルプレイヤーによって入力された、あるいは、あなたのゲームによってプログラム的に提供されたのいずれか)に基づいて、Google Playゲームサービスはリアルタイム型マルチプレイヤーのゲームセッションを作成しようとします。

もしルームが正常に作成されたならば、Playゲームサービスはあなたのゲームに登録されているコールバックを介して、あなたのゲームに通知します。 ローカルプレイヤーは自動的にルームの参加者として参加されます。

ルームの構成

あなたのルームに許可したいプレイヤーの数を指定しなければなりません。 現在、Google Playゲームサービスは、マルチプレイヤーゲームでは最大 8人のプレイヤー(マッチを開始しているプレイヤーを含む)をサポートしています。

必要に応じて、ゲームのバリアントの特定のタイプに興味を持っているプレイヤーのみがルームにオートマッチされることを保証したいかもしれません。 例えば、レースゲームでは、特定のレースマップあるいは難易度でプレイしたいプレイヤーのみをオートマッチさせることがでます。 バリアントは、プレイヤー対プレイヤー(PvP)や 'capture this flag' ゲームプレイといった異なるプレイスタイルに興味を持っているプレイヤーをオートマッチさせるために使用されることができます。 もしあなたのアプリに異なったバージョンがあるならば、互換性のあるバージョンのプレイヤーのみがオートマッチされることを保証するためにバリアントを使用することもできます。

もしゲーム内の特定の排他的な役割をプレイすることに興味を持っているプレイヤーとオートマッチしたいならば、exclusiveBitMaskパラメータを使用してこれを指定することができます。

参加者

プレイヤーがマルチプレイヤーゲームを開始したとき、彼らは特定の人々を招待する、あるいは、Google Playゲームサービスにオートマッチを経由してランダムに他の参加者を自動的に選択させることを選択することができます。 さらには、彼らは両者の組み合わせをリクエストすることもできます(例えば、彼らのサークルから特定のプレイヤーを 1人とオートマッチのプレイヤー 2人というように)。

もしプレイヤーが特定の人をゲームに招待することを選択するならば、彼らのアカウントの設定、彼らが使用する UI、およびゲームのスコープに応じて、選択することができる人々が異なるかもしれません。

  • 一般的に、招待者は、常に最新の対戦相手を招待することができ、常にプレイヤーをオートマッチすることができるでしょう。

  • Googleによって提供されたデフォルト UIでは、“Nearby players” オプションを表示することもできるでしょう。

  • Googleによって提供されたデフォルト UIでは、発見可能なプロファイルを伴うプレイヤーは、彼らが PLUS_LOGINスコープをを持つかどうかに関係なく、サークルされた友人と同様に表示されるでしょう。

  • getInvititablePlayers()メソッドを使用すると、PLUS_LOGINスコープをリクエストしたゲームは、彼らが発見可能なプロファイルを持っているかどうかに関係なく、戻り値にてサークルされた友人を取得するでしょう。

幾つかの場合では、プレイヤーがデフォルトの招待可能な友人を持っていないかもしれないことに注意してください。

他のプレイヤーを招待するために、招待者はプレイヤー選択 UIの検索機能を使用することができます。

オートマッチ

オートマッチの参加者は、ローカルプレイヤーのサークル、あるいは、他の接続のコンタクトである必要はありません。 オートマッチのときは、ゲームサービスは単純に、その時点でゲームを開始し、オートマッチされることをリクエストしている他の参加者を検索します。 オートマッチの参加者はゲームに参加するための通知を受信しません; 彼らの観点から見ると、彼らは個別にゲームを開始しているように見えます。

リアルタイム型マルチプレイヤーゲームでは、オートマッチされた参加者はお互いに匿名プレイヤーとして表示されます(たとえ、彼らがお互いに知られていたとしても)。

接続セット

プレイヤーがルームに参加する、あるいは離れるとき、Google Playゲームサービスは積極的にすべての参加者間のピアツーピアの接続のメッシュを作成しようとします。 これは、ルームにて参加者の接続セットを形成し、接続セット内のすべてのプレイヤーは、セット内の他のプレイヤーと完全に接続されています。 接続セットは、ルームに参加したすべてのプレイヤーのサブセットで構成されるかもしれません。 もし、いずれかのプレイヤーが、接続セット内の他のプレイヤーから切断されたならば、セットはまだ完全に接続されている残っているプレイヤーに縮小されます。 これが発生した場合にどのように処理するか判断することは、あなたのゲームに任されています。

リアルタイムルームのすべての参加者が完全に接続されているとき、Playゲームサービスは、コールバックを介して通知します。 あなたのゲームは、あなたのルームに接続されている参加者にメッセージを送信することができます。 これは、ゲームデータを送信するでより詳しく説明してあります。

ゲーム内ネットワーク

リアルタイム型マルチプレイヤー APIは十分に柔軟なので、あなたのゲームは Google Playゲームサービスによって作成された基本的なピアツーピアネットワーク上で参加者のためにあなた独自のゲーム内ネットワークを実装するために、それを使用することができます。 例えば、あなたのゲームでは、信頼できるゲームデータを確立するために 'host' として行動する単一のクライアントを最初に指定し、それから、データメッセージ送信を介して他の接続された参加者にこのデータを送信したい場合があります。 もし、オートマッチがルームを作成するために使用され、また、あなたのゲームロジックがゲームの 'host' あるいは 'owner' の存在に依存しているならば、'host' となる必要がある人を決定するためのロジックを実装する責任があります。

招待

招待が送信された携帯端末のユーザには、彼らがログインしている端末上に通知が表示されるでしょう。 招待は、Google Playゲームサービスによって、Google Cloudメッセージを経由して送信されます。

Android端末のユーザは、これらの設定を変更することによって、彼らが見る招待をフィルタリングすることができます:

  • それらを通知することができる人のためのアクセスコントロールリストのパーミッションを設定する。
  • アプリをミュートする。
  • すべてのモバイルの通知を完全にオフにする。

もしプレイヤーが Android端末上にインストールされたアプリケーションを持っていなければ、彼らは Playストアからアプリケーションをインストールするよう求められるでしょう。 その場合、招待は消費されず、プレイヤーはゲームをインストールした後に再びそれを受け入れることができます。

Google Playゲームサービスは、接続バンドルを介して到着した招待について、あなたのゲームに通知します。 Google Playゲームサービスによって提供された招待オブジェクトから、あなたのゲームは、招待が作成されたタイムスタンプ、招待 ID、招待を送信したプレイヤーといった追加の詳細情報を取得することができます。

ゲームプレイ

ひとたびルームのための参加者の必要数が接続されたならば、ルームは 'filled' であるとみなされます、そしてゲームプレイを開始することができます。 参加者がルームに参加した後でも、あなたのゲームは彼らがルームから離れるようにすることができます(効果的にゲームから彼らをドロップアウトすることができます)。 しかしながら、'filled' になった後は、新しいプレイヤーがルームに参加することはできません(参加者が空いてしまったスポットを満たすことすらできません)。

特定の高度なシナリオでは、あなたのゲームは、すべての保留中の招待が受け入れられる前に、接続された参加者がゲームプレイを開始できるようにするかもしれません。 もしあなたのゲームがゲームプレイのこのモードをサポートしているならば、ゲームプレイが進行中となった後にルームに参加したあらゆる参加者を処理するようにしてください。 次の例を見てみましょう: 3人用のレースゲームで、あなたのゲームセッションは 2人のプレイヤーでレースを開始するかもしれません。 レース中に、もし第 3のプレイヤーがルームに参加したならば、あなたのゲームは、新たに参加した参加者が観客として現在のレースを観察させることはできますが、レーサーとしてプレイさせることはできません。 レースが終わった後、あなたのゲームは 3人のプレイヤーすべてが次のラウンドでレーサーとして参加できるようにすることができます。

イベント通知

ルームの状態、その参加者、あるいは、参加者の状態が変化したとき、Google Playゲームサービスはあなたのゲームに通知を送信するでしょう。 あなたのゲームは、誰がこのルームに参加しているか(例えば、より多くの参加者が参加するのを待っている間)についての詳細を表示するために、あるいは、Google Playゲームサービスが長い待ち時間の後にオートマッチのための他のプレイヤーを見つけることができなかった場合に、ローカルプレイヤーがルームを離れるためのオプションを表示するために、この情報を使用することができます。

ゲームデータを送信する

ルームの参加者にデータをブロードキャストするために、あるいは、参加者が互いにメッセージを交換するできるようにするために、Google Playゲームサービスを使用することができます。 データメッセージは Google Playゲームサービスによって提供される、信頼性の高い、あるいは信頼性の低いプロトコルを使用して送信することができます。

  • 信頼できるメッセージ送信。 信頼できるメッセージを用いると、データの配信、完全性、オーダーが保証されます。 コールバックを使用することによって配信状態を通知されることを選択することができます。 信頼できるメッセージ送信は時間に敏感ではないデータを送信するのに適しています。 さらには、データがより小さなセグメントに分割され、ネットワーク経由で送信され、それから受信クライアントによって再組み立てされる場合、大きなデータセットを送信するために信頼できるメッセージ送信を使用することもできます。 信頼性の高いメッセージ送信は遅延が大きいかもしれません。 送信することができる信頼性の高いメッセージの最大サイズは 1400バイトです。
  • 信頼性の低いメッセージ送信。 ゲームクライアントは一度だけデータを送信します('fire-and-forget')、データの配送あるいはデータの到着オーダーは保証されません。 しかしながら、完全性は保証されています、それゆえ、チェックサムを追加する必要はありません。 信頼性の低いメッセージ送信は遅延が小さく、時間に敏感なデータを送信するのに適しています。 あなたのアプリは、もしメッセージが伝送中に放棄された、あるいは順不同で到着した場合に、正確に振る舞うことを保証する責任があります。 あなたが送信することができる信頼性の低いメッセージの最大サイズは 1168バイトです。

メッセージを送信する

あなたはルームに接続された参加者にメッセージを送信することができます。 もしあなたのゲームが Google Playゲームサービスに接続されていないか、受信者が接続されていなければ、メッセージは配信されないでしょう。

メッセージ伝送を節約し、レート制限を超えることを避けるためには、データを送信するためのこれらのベストプラクティスに従ってください:

  • すべての参加者にブロードキャストするのではなく、その情報を必要とする参加者にのみメッセージを送信してください。 もし、あなたがブロードキャストメッセージを送信しているならば、ブロードキャストの受信者のリストから送信者である参加者を除外するようにしてください。
  • もし、信頼性の高いメッセージ送信プロトコルを使用してデータを送信しているならば、メッセージの送信頻度を 1秒あたりおよそ 50メッセージ以下に維持しようとしてください。 もし、これよりも頻繁にデータを送信する必要があるならば、代わりに信頼性の低いメッセージ送信を使用することをお勧めします。

メッセージを受信する

参加者は、ルームに接続されているときのみメッセージを受信することができます。

ルームの閉鎖

あなたのゲームは、参加者がゲームからログアウトした、あるいは、ゲームのリアルタイム部分を終了したとき、ルームから離れる(つまり、Google Playゲームサービスのサーバからルームを切断する)責任があります。 さらには、あなたのゲームは、ローカルプレイヤーを除くすべての参加者が部屋を離れたシナリオを処理する必要があります。 これが発生したとき、あなたのゲームは直ちにローカルプレイヤーをルームから切断する必要があります。

ルームの参加者すべてがルームを離れたとき、ルームは 'closed' とみなされます。 この時点で、あなたのゲームは、現在進行中のいかなるゲームもシャットダウンし、ゲームデータを適切に保存する必要があります。 ゲームデータを Google Playに保存することの詳細については、セーブドゲームを参照してください。

クライアントの実装

あなたのプラットフォーム用のリアルタイム型マルチプレイヤーサポートを実装する方法については、次のリソースを参照してください: