PUN Classic (also called PUN1) is the original and first major version of PUN. It is now replaced by PUN2 which is refactored and enhanced. We highly recommend starting new projects with PUN2 and if possible migrating existing ones from PUN1 to PUN2 by following our "Migration Notes". PUN Classic will be maintained for the coming months. We will fix important bugs and support new Unity versions but new features will be added only to PUN2.

Master Client and Host Migration

ホストマイグレーションは、オンラインマルチプレイヤーゲームで知られているコンセプトの1つです。 ホストマイグレーションは、「ホスト」ピアのスムーズかつシームレスな遷移をおこなうためのものです。 「ホスト」とは、ゲームについてより広範囲な制御をおこない、そのゲームがもっとも依存しているピアを意味します。 通常、「ホスト」とはゲームを開始(ホスト)したクライアントで、他のプレイヤーはこのクライアントに接続するか、または参加することでゲームをプレイできるようになります。 Photonでは、本来「ホスト」は存在しません。 その代わりにルームごとに「特別」なクライアントが存在し、そのクライアントが「マスタークライアント」と呼ばれます。 デフォルトでは、このクライアントはその他のクライアントと同様に通常のクライアントです。 マスタークライアントに、他のクライアントよりも多くのタスクを処理させるよう設定しない限り、この状態は保持されます。

Photonが実現すること

「ホストマイグレーション」について、Photonには汎用的なソリューションはありません。 ただし、簡単に実現できるようにしてあります。

マスタークライアントが切断されると、Photon Serverはすぐに検知し、ルーム内の別のアクターをマスタークライアントに割り当てます。 デフォルトでは、もっとも小さいアクター番号のアクティブなアクターが選択されます。

マスタークライアントが変更されると、以下のコールバックが呼ばれます:

void OnMasterClientSwitched(PhotonPlayer newMasterClient)

Photonにはクライアント、サーバー、プラグインSDKから明示的にマスタークライアントを変更する方法があります。 クライアントから変更するには、以下を使用します:

PhotonNetwork.SetMasterClient(photonPlayer);

メソッドは、オペレーションが送信されるかどうかを返します。

Back To Top

必要なこと

Photonは、以前のマスタークライアントがルームのステートに関して保持していたすべての情報を、新たなマスタークライアントに引き継ぐわけではありません。 情報の引継ぎは明示的におこなうことではありませんし、またマスタークライアントがすでにアクティブでない場合(接続されていない、反応しないなど)など、実行するのに遅すぎる場合があるためです。 Photonはプレイヤープロパティまたはキャッシュイベントを、マスタークライアントから別のマスタークライアントへは移動しません。 また、Photonは古いマスタークライアントが保持していたイベントを、新たに選択されたマスタークライアントには再送信しません。 このため切替が発生した際には、ディベロッパーが責任を持ってルームステートが消失しないよう留意することが重要です。

Back To Top

推奨

マスタークライアントの概念は,すべての種類のゲームに適しているわけではありません。 たとえばアクションゲームの場合には、マスタークライアントではなくカスタムサーバー側のコード(セルフホスティングされているサーバーアプリケーションまたはプラグイン)に依存するべきです。 ゲームへの参加プレイヤーが多ければ多いほど,余分なタスクを処理するのに単一のクライアントに依存する必要性は減ります。 マスタークライアントのみにイベントを送信するのは避けるべきです。消失しないよう,データを複製してください。 すべてのアクターに送信することによって、マスタークライアントの切替が容易になります。 すべてのアクターがルームステートをトラッキングしているため、新たに割当てられたマスタークライアントはすでに完全なルームステートを保持しています。 マスタークライアントの切替が発生した場合に備えてゲームデータを保持するには,カスタムルームプロパティが最も信頼性の高いオプションです。 マスタークライアントがルーム内で常にイベントを送信している場合には,マスタークライアントから最後に受信したイベントのタイムスタンプを保存し,ゲームループ内でその値を常に確認することで,マスタークライアントのタイムアウト検知のメカニズムを実装できます。 想定されたとおり、マスタークライアントがイベントを送信していない点を検知した場合には、明示的にマスタークライアントを切り替えることができます。 難しいのは、タイムアウト値の選択でしょう。 この値が低すぎると誤検出になり、マスタークライアントの切替が必要以上に頻繁に発生することになります。 また、この確認を単一のアクター(おそらく、次のマスタークライアント候補)またはすべてのアクターでおこなうかを選択する必要があります。

モバイルプラットフォーム上では,アプリケーションのまとまりがつかなくなる場合があります。 バックグラウンドでは、PUNは確認にのみ専用のスレッドを使用します。 このスレッドによってクライアントは1分間アクティブに保たれますが、他には何も影響をおよぼしません。 ディベロッパーは、バックグラウンドのマスタークライアントのシナリオをどのように処理するのかを決める必要があります:

  1. アプリケーションがバックグラウンドに移行したら、ただちにPhotonから切断する。
  2. マスタークライアントを明示的に切替える。
  3. バックグラウンドのスレッドを非有効化する。
  4. キープアライブACKのみのバックグラウンドスレッドを無効にします。

To Document Top