共有モードのマスタークライアント
概要
共有モードのセッションでは、1つのクライアントにSharedModeMasterClient
の役が与えられます。この役が与えられたプレイヤーは、他のクライアントはアクセスできないいくつかの特権を持ちます。
割り当て
デフォルトでは、共有モードのセッションを作成したプレイヤーにSharedModeMasterClient
の役が割り当てられます。プレイヤーはNetworkRunner.IsSharedModeMasterClient
を呼び出すだけで、自分自身がSharedModeMasterClient
かどうかを確認できます。この役は以下のようなケースで再割り当てが行われます。
SharedModeMasterClient
が退出/切断する:ルーム内のクライアントの一人に、新しいSharedModeMasterClient
が自動的に割り当てられます。SharedModeMasterClient
がNetworkRunner.SetMasterClient(PlayerRef player)
を実行する。
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
はこのオブジェクトを(状態権限を持たないにもかかわらず)デスポーンできます。

共有モードのマスタークライアントの追跡
NetworkRunner.IsSharedModeMasterClient
によってユーザー自身がSharedModeMasterClient
かどうかを知ることはできますが、他のクライアントの誰がSharedModeMasterClient
かどうかを知る方法は用意されていません。アプリケーションによっては、セッションのSharedModeMasterClient
が誰かを知ることができると便利なことがあり、それを達成する一つの方法は以下の通りです。
- ネットワークオブジェクトを作成し、
Shared Mode Settings
のIs Master Client Object
をtrue
にする - 以下のようなスクリプトを作成し、誰が
SharedModeMasterClient
かを取得できるようにして、上述のネットワークに追加する
using Fusion;
public class SharedModeMasterClientTracker : NetworkBehaviour
{
static SharedModeMasterClientTracker LocalInstance;
public override void Spawned()
{
LocalInstance = this;
}
private void OnDestroy()
{
if (LocalInstance == this)
LocalInstance = null;
}
public static bool IsPlayerSharedModeMasterClient(PlayerRef player)
{
if (LocalInstance == null)
return false;
return LocalInstance.Object.StateAuthority == player;
}
public static PlayerRef? GetSharedModeMasterClientPlayerRef()
{
if (LocalInstance == null)
return null;
return LocalInstance.Object.StateAuthority;
}
}
このNetworkBehaviour
の静的インスタンスを保存することで、ユーザーはどのプレイヤーがSharedModeMasterClient
かをチェックして適切な対応が可能になります。