This document is about: PUN 2
SWITCH TO

PUN Classic (v1)、PUN 2、Boltはメンテナンスモードとなっております。Unity2022についてはPUN 2でサポートいたしますが、新機能が追加されることはありません。お客様のPUNプロジェクトおよびBoltプロジェクトが停止することはなく、将来にわたってパフォーマンス性能が落ちることはありません。 今後の新しいプロジェクトについては、Photon FusionまたはQuantumへ切り替えていただくようよろしくお願いいたします。

Master Client and Host Migration

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

Photonが実現すること

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

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

マスタークライアントが変更した場合は毎回、以下のコールバックが呼び出されます。

C#

void IInRoomCallbacks.OnMasterClientSwitched(Player newMasterClient)

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

C#

PhotonNetwork.SetMasterClient(photonPlayer);

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

必要なこと

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

推奨

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

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

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

オプション2または3を実装するときは、こちらのヒント"Send Right Away"を読んでください。

Back to top