共有モードのマスタークライアント
概要
共有モードのセッションでは、1つのクライアントにSharedModeMasterClientの役が与えられます。この役が与えられたプレイヤーは、他のクライアントはアクセスできないいくつかの特権を持ちます。
割り当て
デフォルトでは、共有モードのセッションを作成したプレイヤーにSharedModeMasterClientの役が割り当てられます。プレイヤーはNetworkRunner.IsSharedModeMasterClientを呼び出すだけで、自分自身がSharedModeMasterClientかどうかを確認できます。この役は以下のようなケースで再割り当てが行われます。
SharedModeMasterClientが退出/切断する:ルーム内のクライアントの一人に、新しいSharedModeMasterClientが自動的に割り当てられます。SharedModeMasterClientがNetworkRunner.SetMasterClient(PlayerRef player)を実行する。SharedModeMasterClientがネットワークメッセージを送信できないものの完全には切断されていない状態で、別のクライアントがマスタークライアント再割り当てリクエストを送信する。
SharedModeMasterClientの特権
先ほど言ったように、SharedModeMasterClientはいくつかの特権を持ちます。
シーン管理
共有モードでは、SharedModeMasterClientのみがシーンを管理する権限を持ちます。これはNetworkRunner.LoadSceneなどのシーン管理に関するあらゆるメソッドを含みます。
シーンオブジェクトに対する初期の状態権限
新しいシーンがロードされた時、SharedModeMasterClientはシーンにベイクされたすべてのネットワークオブジェクトに対する状態権限を持ちます。
マスタークライアントオブジェクト
ネットワークオブジェクトのShared Mode SettingsでIs Master Clientをtrueに設定すると、SharedModeMasterClientが常にそのネットワークオブジェクトの状態権限を持ちます。新しいSharedModeMasterClientが割り当てられると、ネットワークオブジェクトの状態権限は新しいSharedModeMasterClientに移譲されます。
状態権限を持たないオブジェクトのデスポーン
ネットワークオブジェクトのShared Mode Settingsから、Allow State Authority Overrideを有効にしてDestroy When State Authority Leavesを無効にすると、プレイヤーが切断してもネットワークオブジェクトは破棄されなくなります。ただし、SharedModeMasterClientはこのオブジェクトを(状態権限を持たないにもかかわらず)デスポーンできます。

マスタークライアント再割り当てリクエスト
マスタークライアント再割り当てリクエストは、Fusion 2.1以降で利用可能です。
マスタークライアントが応答不能になったものの完全に切断されていないケースで、クライアントは手動でマスタークライアントの再割り当てをリクエストできます。これによって、マスタークライアントの切り替えを非常に迅速に実行できます。
これにはNetworkProjectConfigでAllowMasterClientReassignRequestを有効にする必要があります。デフォルトでは、再割り当てのしきい値は2秒です。これは、現在のマスタークライアントが応答していない(Photon Cloudがメッセージを受信していない)状態が続いた秒数です。このしきい値は、NetworkProjectConfigのMasterClientReassignRequestThresholdから調整可能です。
MasterClientReassignRequestThresholdを0に設定すると、現在のマスタークライアントが応答可能な場合でも、任意のクライアントがいつでもマスタークライアントを引き継ぐことができます。ただしこれは、悪意のあるクライアント(ハッカー)によって悪用され、既存セッションを乗っ取られる可能性があります。
マスタークライアントが応答不能になった時点では、自動的に切り替えが発生することはありません(切り替えは、完全な切断時のみ発生します)ので、他のクライアントからの手動リクエストが必須です。リクエストはどのクライアントからでも送信できます;
C#
NetworkRunner.RequestMasterClientReassign();
実装例
マスタークライアントが非アクティブかどうかを検知するために、ネットワークプロパティがマスタークライアントによって更新されているかどうかを確認します。ティックごとに更新される既存プロパティが存在しない場合は、カスタムトラッカーを追加することもできます。
C#
using Fusion;
public class MasterClientWatchdog : NetworkBehaviour
{
// マスタークライアントによる更新スタンプ
[Networked] public int Heartbeat { get; set; }
// マスタークライアント(オブジェクトの状態権限者)上でのみ実行される
public override void FixedUpdateNetwork()
{
Heartbeat = Runner.Tick;
}
// すべてのクライアント上で実行される。非マスタークライアントはHeartbeatがどれだけ古いかを確認する。
// (すべてのクライアント上で実行するかわりに「次のマスタークライアント候補」を指定することを推奨)
private void FixedUpdate()
{
if (Runner == null || Runner.IsSharedModeMasterClient)
return;
float secondsBehind = (Runner.Tick - Heartbeat) * Runner.DeltaTime;
if (secondsBehind >= Runner.Config.MasterClientReassignRequestThreshold)
Runner.RequestMasterClientReassign();
}
}
マスタークライアントの追跡
GetMasterClient()は、Fusion 2.1以降で利用可能です。
共有モードでは、NetworkRunner.GetMasterClient()を使用して現在のマスタークライアントを取得できます。または、IsMasterClientObjectフラグが設定されたオブジェクトのNetworkObject.StateAuthorityを追跡することで確認することもできます。