Realtimeイントロ
Photon Realtimeは、我々のマルチプレイヤーゲームおよび高レベルネットワークソリューションの基盤レイヤーです。マッチングや高速通信などの問題をスケーラブルなアプローチで解消します。ゲームや、我々のより具体的なマルチプレイヤーソリューションであるPUNやQuantumで使用されています。
Photon RealtimeにはAPI、ソフトウェアツール、サービスの包括的なフレームワークも含まれており、クライアントとサーバーの相互作用を定義づけています。
本ドキュメントはクライアント側のRealtime APIマニュアルとして作成されていますが、関係する構造についての概要説明でもあります。
クライアントとサーバー
Photon Realtime APIは、ゲームやアプリで直接使用されるクライアント側のソフトウェアです。これがあると、アプリでConnect
、JoinRandomRoom
、RaiseEvent
を行えるようになります。
主要なプラットフォームやエンジンで複数言語の使用が可能(SDKダウンロードページ)で、iOSやAndroid、ウェブ、コンソールやスタンドアロンなどに関わりなくほぼ全てのクライアント同士でやりとりできます。
Photon Realtimeクライアントは全員、認証と地域振分け(ネームサーバー)、マッチメイキング(マスターサーバー)、ゲームプレイ(ゲームサーバー)の3つの別タスクに分けられた専用サーバーシーケンスに接続します。これらのサーバーはRealtime APIに処理されるので下位にかける必要はありませんが、背景を知っておくのも良いかと思います。
Photon Cloudは完全なマネージドサービスで、Photon Realtimeクライアントの世界中のホスティングを提供します。無料のPhotonアカウントでは義務なしのアクセスができ、Photon Realtimeの使用に慣れる間Photon Cloudをご使用いただくことを推奨しています。もちろん、独自のPhotonサーバーを使用したければ後から移行することもできます。
コードサンプル
以下は、Realtime APIがどのように使用されているのか理解するためのコードサンプルです。完全な使用ガイドではなく概要としてとらえてください。
Photon Cloudを使用してサーバーのセットアップを省きましょう。コード内にAppIdの設定が必要です。
無料サインアップの後にRealtimeダッシュボードからAppIDを取得してください。
接続
Photon Cloudに接続
T以下のコードは、AppIDに入力するとPhoton Cloudに接続するコードです。
セルフホスティングのPhoton Serverに接続
セルフホスティングのPhoton Serverに接続するには、AppIdまたはリージョンは必要ありません。 必要なのは、クライアントの接続方法で使用するサーバーのアドレスとポートだけです。
Photon CloudとPhoton Serverの違いについてはこちら。特に、"v4.0.29.11263以来の重要な変更"です。
Serviceの呼び出し
LoadBalancing APIはゲームロジックと最適に統合するよう構築されています。
受信メッセージの処理のタイミングや、送信頻度を任意で設定できます。
内部的には、ゲームがLoadBalancingClient.Service()
を呼ぶまで、送受信ともにバッファされます。
多くの場合、ゲームはアップデートを計算して画面をリフレッシュするゲームループを使用しています。
1秒ごとにService()
を10~20回呼んでください。
Service()
を呼ばないかぎり、"ネットワークプログレス"はまったく処理されません。
Service
は2つのタスクをカバーします:
受信したイベントとデータが実行されます。 これは、更新を処理できるときに行われます。 通常、シーケンスの順序はそのまま維持されるため、クライアントが受信するすべてのものがキューに入れられ、順序付けされます。
Service
は、利用可能なメッセージを1つずつ渡すため、内部的にDispatchIncomingCommands
を呼び出します。クライアントの送信データがサーバーに送信されます。 これには、サーバーへの接続を維持するために重要な確認応答(バックグラウンドで作成)が含まれます。
Service
はこのタスクを行うために内部的にSendOutgoingCommands
を呼び出します。SendOutgoingCommands
呼び出しの頻度を制御すると、クライアントが生成したデータを送信するために使用するパッケージの数が制御されます。
切断
アプリケーションが終了する際や、ユーザーがログアウトする際には、忘れずに切断するようにしてください。
マッチメイキング
ゲームの作成
新しいルームやゲームを作成するには、接続されたロードバランシングクライアントで"ルームの作成"操作をおこなってください
これによって、ルームの名前とルームで許可されるプレイヤーの人数が設定されます。 クライアントは、自動的に新しいルームに入室します。 "ルームの作成"操作をすると、まだそのルームが存在していない場合には、参加者がいなくてもルームが作成されます。 最後のプレイヤーが退室するまで、ルームは存在します。
ルーム作成時に、"カスタムルームプロパティ"を定義して共通の値を設定することができます。 カスタムルームプロパティを使用すると、マップ名、レベル、ラウンドの時間などを保存できます。 カスタムプロパティのキーは文字列でなければなりません。 もちろん、これらの値はルーム内での設定や変更も可能です。
任意の配列を"ロビー用のカスタムルームプロパティ"として設定し、 その配列にそれらのカスタムプロパティの名前をつけて設定することで、15個のカスタムプロパティをロビーに表示するよう選択できます。 ロビーに表示するプロパティは、マッチメイキングやランダムマッチメイキングのフィルタとして使用することが可能です。
マッチメイキングの詳細については、こちらを参照してください 。
ゲームの検索
クライアントは名前を指定するか、またはPhotonにマッチングのリクエストをしてゲームに参加します。
ルームの検索方法
- Random: ランダムにプレイヤーをマッチングします。ルームを満員にするか、またはプレイヤーを均等に配分するかを選択できます。
- Parameterized: フィルター として ロビープロパティ を定義して、ランダムマッチングをカスタマイズします。
- Private: 名前を把握している、非表示のルームに参加します。
- Listing: 選択可能なルームをロビーに表示し、プレイヤーが手動で選択したり、参加できるようにします。
ゲームの持続
Photon Realtimeでは、ルームのデータを簡単に保管およびローディングできます。 外部のWebサーバーとPhoton Cloudを接続するには、 Webhooks をセットアップする必要があります。
セットアップが完了すると、ルームステートは自動的に保存されるようになります。ルームに再参加するには:
この機能によって、非同期マッチメイキングとゲームプレイが可能になります。
詳細な手順は、ルーム持続性ガイドを参照してください。
ゲームプレイ
イベントの送信
1つのクライアント上で起こることは、すべて同じルームにいる全員を更新するイベントとして送信することができます。
位置、現在のターン、またはステートの値でプレイヤーを更新します。 Photonはその更新を、出来る限り速く送信します(信頼性は任意で設定可能です)。
- Send messages/events: 他のプレイヤーにすべてのタイプのデータを送信
- Player/Room properties: Photonは、後から参加したプレイヤーも含めて、これらのデータを更新および同期します。
イベントコードは200以下にしてください。 各コードはイベントの型と、受信者が想定できる内容を定義します。
上記例のイベントデータはHashtable
です。
byte[]
や、Photonのシリアル化(string
やfloat[]
など)で対応しているすべてのデータ型を使用できます。
詳細情報はPhotonでシリアル化を参照してください。
イベントの受信
イベントが送信されると、ハンドラーが呼ばれます。以下に例を示します。
各イベントは、クライアントが定義して送信したコードとデータを送信します。 アプリケーションは、渡されたコードによってどのコンテンツを期待すべきかを把握します(上記参照)。
デフォルトのイベントコードの最新のリストは、SDK内のイベントコード定数を確認してください。たとえば、C#の場合はExitGames.Client.Photon.LoadBalancing.EventCode
内にあります。
カスタムサーバーまたはオーソリテーティブサーバーのロジック
オーソリテーティブロジックを加えなくても、Photon Cloud製品は幅広いタイプのゲームに対応しています。
- ファーストパーソンシューター
- レーシングゲーム
- マインクラフトタイプのゲーム
- カジュアルなリアルタイムゲーム
- 非同期および同期ゲーム
- ...
独自のカスタムロジックを実装するには、Photon Serverまたは プラグイン を使用してください。