This document is about: FUSION 2
SWITCH TO

共有モードのマスタークライアント

概要

共有モードのセッションでは、1つのクライアントにSharedModeMasterClientの役が与えられます。この役が与えられたプレイヤーは、他のクライアントはアクセスできないいくつかの特権を持ちます。

割り当て

デフォルトでは、共有モードのセッションを作成したプレイヤーにSharedModeMasterClientの役が割り当てられます。プレイヤーはNetworkRunner.IsSharedModeMasterClientを呼び出すだけで、自分自身がSharedModeMasterClientかどうかを確認できます。この役は以下のようなケースで再割り当てが行われます。

  • SharedModeMasterClientが退出/切断する:ルーム内のクライアントの一人に、新しいSharedModeMasterClientが自動的に割り当てられます。
  • SharedModeMasterClientNetworkRunner.SetMasterClient(PlayerRef player)を実行する。

SharedModeMasterClientの特権

先ほど言ったように、SharedModeMasterClientはいくつかの特権を持ちます。

シーン管理

共有モードでは、SharedModeMasterClientのみがシーンを管理する権限を持ちます。これはNetworkRunner.LoadSceneなどのシーン管理に関するあらゆるメソッドを含みます。

シーンオブジェクトに対する初期の状態権限

新しいシーンがロードされた時、SharedModeMasterClientはシーンにベイクされたすべてのネットワークオブジェクトに対する状態権限を持ちます。

マスタークライアントオブジェクト

ネットワークオブジェクトのShared Mode SettingsIs Master Clienttrueに設定すると、SharedModeMasterClientが常にそのネットワークオブジェクトの状態権限を持ちます。新しいSharedModeMasterClientが割り当てられると、ネットワークオブジェクトの状態権限は新しいSharedModeMasterClientに移譲されます。

状態権限を持たないオブジェクトのデスポーン

ネットワークオブジェクトのShared Mode Settingsから、Allow State Authority Overrideを有効にしてDestroy When State Authority Leavesを無効にすると、プレイヤーが切断してもネットワークオブジェクトは破棄されなくなります。ただし、SharedModeMasterClientはこのオブジェクトを(状態権限を持たないにもかかわらず)デスポーンできます。

共有モードのマスタークライアントの追跡

NetworkRunner.IsSharedModeMasterClientによってユーザー自身がSharedModeMasterClientかどうかを知ることはできますが、他のクライアントの誰がSharedModeMasterClientかどうかを知る方法は用意されていません。アプリケーションによっては、セッションのSharedModeMasterClientが誰かを知ることができると便利なことがあり、それを達成する一つの方法は以下の通りです。

  • ネットワークオブジェクトを作成し、Shared Mode SettingsIs Master Client Objecttrueにする
  • 以下のようなスクリプトを作成し、誰が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かをチェックして適切な対応が可能になります。

Back to top