Features Overview
ホスティング
CloudかOnPremisesか
PUNのクライアントはPhoton Cloudか独自のPhoton Serverに接続します。
独自サーバーのホスティングを予定している場合でも、Photon Cloudはスタートに最適です。
ベストリージョン
Photon Cloudは、世界中のリージョンでホスティングされており、プレイヤーを配分することでレイテンシーを低く保っています。
PUNのクライアントは、利用可能なサーバーを動的にチェックし、最適なサーバーを自動で選択します。
レイテンシーが悪化しない限り、クライアントはそのリージョンを使い続けます。
接続時にリージョンのリストが変更されると、PUNもすべてのリージョンを全自動で再評価します。
「ベストリージョン」オプションは、決定的なものではありません。
リージョンにあまり差がない場合や、まったく同じping計算がされた場合には、「ランダム」になる可能性があります。
理論上は以下の設定が可能です:
- 同一デバイスから、複数リージョンに対してまったく同じpingを設定します。同じネットワークに接続したクライアント上で異なるリージョンに接続する場合には、ランダムになります。
- 同じネットワークに接続した異なるデバイス上(または同じデバイス上で異なる試行を実行する)で、同じリージョンに対して異なるping値を設定します。
たとえば、「us」と「usw」(または「ru」と「rue」)の場合、オンラインリージョンの許可リストを使用してリージョンを選択するか、または明示的にリージョンに接続します。
デバッグをおこなうには、ロギングレベルを「情報」に設定し、「現在のベストリージョン」をクリアしてください(PUNの場合:PhotonNetwork.BestRegionSummaryInPreferences = null)。詳細を参照するか、またはメールでログを送信してください。
Udp、Tcp、WebSocket
PUNはトランスポート層プロトコルをサポートしているため、ほとんどのプラットフォームと互換性があります。
デフォルトのプロトコルは信頼性プロトコルが上位にあるUDPで、迅速かつ柔軟です。
一方、WebSocketはサポートされている唯一のプロトコルとしていくつかの
プラットフォームで使われています。(WebGLエクスポートなど)
一般
Unity統合
PUN is tightPUNはUnityと緊密に結びついています。
エディタを拡張し、Inspectorを活用してゲームオブジェクトが簡単にネットワーク化されるようPhotonViewコンポーネントを提供します。
GameVersionによるバージョニング
Photon Cloudでは、GameVersionの文字列は、AppIdを変更することなく、単にビルド(およびプレイヤー)をお互いから分離するために使われます。
異なるバージョンのプレイヤー同士を分離しておくためにネットワークロジックにご完成を破る変更を加える際は、GameVersionを変更します。
認証
Photonは簡単なREST APIを活用して、タイトルが使用するべきコミュニティバックエンドを統合しています。
ユーザーアカウントを利用できる外部認証で、ユーザーIDとユーザー用の任意の値を取得します。
必要な場合は、ユーザーが接続できないようにブロックすることもできます。
コールバック
PhotonNetwork
には、ゲームに「接続済み」や「ゲームに参加」などステートの変更を通知するためのコールバックがいくつかあります。
PUN 2はパフォーマンスの理由からインターフェースにコールバックをまとめており、クラス実装はPhotonNetwork.AddCallbackTarget()
を通して登録する必要があります。
スクリプトで各コールバックメソッドの上書きが個々に可能になるMonoBehaviourPunCallbacks
を拡張することができます。
この場合は、ベース実装を呼び出す必要はありません。
C#
public class MyClass : MonoBehaviourPunCallbacks
{
//...
public override void OnJoinedRoom()
{
Debug.Log(string.Format("OnJoinedRoom() called by PUN: {0}", PhotonNetwork.CurrentRoom.Name));
}
PUN基本チュートリアルのロビーに関する章でコールバックについて学び、開始することができます。
マッチメイキング
ランダムマッチメイキング
Photonのマッチメイキングは柔軟にお客様のご要望に沿ってご利用いただけます。
通常、PhotonNetwork.JoinRandomRoom()
を通してサーバーがランダムに適切なルームを選択します。選択範囲を絞るために様々なフィルターオプションが用意されています。
詳細は"Matchmaking Guide"を参照してください。
ロビーとルームのリスト
ロビーは様々なリストでルームを形成するために使われており、
そこに参加するとリストとアップデートを取得できます。いわゆる「SQLロビー」では非常に柔軟な「WHERE」フィルターを使ってクエリをサポートしています。
また、リストのサブセットをサーバーにクエリして、
事前にフィルタリングされた選択肢の表示もできます。
ルームのオプション
ルームを作成すると、新規で作成されたルームの挙動を定義することができます。
定員の定義も可能です。
不可視のルームとして設定されると、マッチメイキングには該当しなくなり、
ルーム名を知っているユーザだけが参加できるようになります。プレイヤーのuserIDは共有でき、切断後のユーザがルームリストにとどまる時間なども定義できます。
マッチメイキング用のカスタムプロパティ
ルームのカスタムプロパティではオリジナルの値設定を定義および共有できます。
キーと値はHashteblesを使って定義できます。
これはゲーム内でもできますが、マッチメイキングの際にも適用できます。
マッチメイキングで利用可能なプロパティのキーを定義するだけです。
スロット予約
複数のプレイヤーでゲームをする場合、プレイヤー同士でパーティを組むことがあります。
Photonではこのようなケースのサポートとして"Expected Players"を用意しており、
これはルームに参加予定のあるプレイヤーのリストです。
Photonのマッチメイキングでは「参加予定」のプレイヤー単位でスポットを予約できます。
ゲーム中
ネットワークオブジェクト
汎用のGameObjectはPhotonViewコンポーネントを使うとネットワークオブジェクトに変えられます。
PhotonViewはネットワークを越えてオブジェクトを特定し、オブジェクトのステートを同期するのに使われます。
PhotonViewは実行時にインスタンス化されるプレハブと密接な関係にあります。
プレイヤーごとに自分のコントロールするオブジェクトがあることが多いです。
GameObjectにPhotonViewを追加するには、
GameObjectを選択して"Components/Miscellaneous/Photon View"を使用するだけです。
PUN基本チュートリアルのプレイヤーネットワーキングに関する章でPhotonViewについて説明しています。
メッセージ
ルームに入ると、他のプレイヤー(複数もしくは特定の一人)にメッセージを送信できます。
「下層」の汎用イベントとは別に( RaiseEvent
をご参照ください)、PUNには特徴的なメッセージ機能が二つあります。
RPCは特定のネットワークオブジェクトにおいて全プレイヤーに実行されるメソッドコールです。
次に、PhotonViewではこのオブジェクトの値(位置、体力)を同期するためにスクリプトを監視できます。監視スクリプトはOnSerializePhotonView
を実装する必要があります。
必要に応じてメッセージはサーバー上でバッファされ、後から参加したプレイヤーにも送信されます。
例えばスポーンキャラクターなどの場合に使用されます。
PUN基本チュートリアルのプレイヤーネットワーキングに関する章でRPCメッセージについて説明しています。
Mecanim (アニメーター) 同期
PUNには、キャラクターのアニメーションステートを自動的に同期するコンポーネントが実装されています。
PUN基本チュートリアルのプレイヤーネットワーキングに関する章で詳細をご確認ください。
同期済みのタイムスタンプ
クライアントがPhotonサーバーに接続すると毎回lag-rectifiedタイムスタンプを同期します。
これはルーム(全プレイヤーが同じゲームサーバーに接続したとき)でイベントのタイミングを同期するのに使用できます。
カスタムプロパティ
Photon Realtimeのカスタムプロパティは、任意の値を同期する手段です。
このカスタムプロパティはシンプルなHashtableで形成されていてルームもしくは個人のプレイヤーに紐付けられています。
AsteroidsGameManager.csスクリプト内のAsteroid Demoでカスタムプロパティについて学ぶことができます。
ゲーム中 アドバンスト
コンペア・アンド・スワップ (CAS)
カスタムプロパティの設定は誰でもおこなえるため、ゲームロジックは同時接続の問題が生じる可能性があります。
この問題を解決するのがCASです。CASでは、サーバーの最新の値と条件が合致した場合のみ新しい値が設定されます。
つまり、複数の人がサーバーに「1からXに値を変更せよ」と指示をしても、実際にその動作が発生するのは1度だけです。
シーンPhotonViews
デフォルトでネットワークオブジェクトにはインスタンス化するプレイヤーと同じライフサイクルが割り当てられています。
プレイヤーがいなくなると、対応するオブジェクトも消えます。
シーンPhotonViewsはシーンのロード後にインスタンス化できますが、ルームが存在する限りルーム内に残ります。
シーンとともにロードされるネットワークオブジェクトはプレイヤーのライフサイクルに縛られません。
AsteroidsGameManager.csスクリプト内のAsteroid Demoでシーンネットワークオブジェクトについて学ぶことができます。
複数のシーンのシーンPhotonView
シーンが追加的に読み込まれ、これらのシーンが「シーンネットワークオブジェクト」を備えている場合は、PunSceneSettingsFile scriptableObjectアセット(PhotonUnityNetworking/Pun/code/Editor/の下のプロジェクトアセット内)を設定し、シーンごとに最小ビューを定義してください。割り当てる最小ID:これは、シーンを追加的に読み込むときに、「シーンネットワークオブジェクト」ビューIDが衝突しないことを保証します。
オブジェクト制御の移行
デフォルトで、ネットワークオブジェクトはインスタンス化をしたクライアントによって制御されています。
オーナーシップの移動をすると、プレイヤーはリクエストしたり、ゲームオブジェクトの管理を譲渡したりできます。
これによりアップデートを送信するクライアントが変更されます。(他のクライアントはそのアップデートを消費し適用します)
インタレストグループ
Photon Realtimeのインタレストグループ(PUNにまとめられました)はクライアントが取得するイベントを形成するのに使用されます。
ロジックに基づいてクライアントはグループにサブスクライブして、目的のグル-プにイベントを送信します。
これは初歩的なインタレスト管理システムに使用されます。
カスタムタイプシリアライゼーション
Photonを使うと、ネットワークを介して送信する独自のシリアライゼーション・デシリアライゼーションコードの全てのタイプを定義できます。
これによってネットワーク上でのデータ送信方法が大幅に簡単になります。(コストは最小限におさえられます。)
WebHooksとデータ永続性戦略
Photonサーバーに外部サービスや独自サービスから接続するために、Webhookのコンセプトを使用しています。
いくつかのフックは事前に定義されていて外部のRESTベースのサービスをアップデートするのに使用されます。
ターンベースゲーム
ターン制ゲームではあと2つのルームのオプションが重要になってきます。
PlayerTTLでは切断後、ルームにプレイヤーが「インアクティブ」で残っていられる時間を定義します。
RoomTTLでは、ルームにいた全てのプレイヤーの切断後、ルームが存続する長さを定義します。
これで、ルームとプレイヤースポットを、再参加するプレイヤーのために空けておけます。
パフォーマンスオプション
プーリングサポート
PUNはインスタンス化され破壊される全てのネットワークオブジェクトに、シンプルなプール実装の使用を許可します。
ゲームの中には共通でないものもありますが、パフォーマンスサーバーにもなります。
キャッシング
プールを使用する代わりに、PUNはプレハブの(ネットワークオブジェクト内に)インスタンス化のためにロードされるリソースをキャッシュできます。
これによって、メモリを消費するガベージコレクションが減少します。
SendRate/SendRateOnSerialize
PUNはネットワークオブジェクトがアップデートを書き込む(読み込む)速度を制御します。
アップデートがメッセージとして送信される速度は、これとはまた別で設定できます。