PlayerRef
概要
Fusionにおける「プレイヤー(Player)」とは、Fusionにプレイヤー入力を提供するNetworkRunnerを持つピアを指します。つまり、専用ゲームセッションサーバー以外の任意のピアです。
ここでは、プレイヤー情報を識別・取得するための様々な方法を示します。
PlayerRef
プレイヤーの入力を提供する各NetworkRunnerには、PlayerRefと呼ばれるユニークな識別子が関連付けられています。プレイヤーに与えられるPlayerRefは識別子としてのみ表され、プレイヤー個別のデータを一切含みません。
PlayerCount
この値は、ゲームセッションに接続できるプレイヤーの最大数です。
ゲームセッションごとの最大PlayerCountのデフォルトは、NetworkProjectConfigアセットのSimulation > Default Playersフィールドでグローバルに定義されています。
新しいゲームセッションを作成する際に、StartGameArgs.PlayerCountの値がNetworkRunner.StartGame()に渡されてPlayerCountが決定されます。StartGameArgs.PlayerCountに値が設定されていない(またはnullが設定されている)場合、新しいゲームセッションはNetworkProjectConfigのDefault Playerの値をかわりに使用します。
専用サーバーはPlayerRefを持たず、プレイヤーを表さないため、PlayerCountの制限にはカウントされないことに留意してください。つまり、PlayerCountが4のゲームセッションでは、以下のパターンが有効です。
- ホスト1人、クライアント3人
- 専用サーバー1つ、クライアント4人
- 共有モードのクライアント4人
Player Objectの定義
Player Objectは、ゲームセッションの各PlayerRefに、特定のNetworkObject(アバターなど)を関連付ける便利な方法です。
各PlayerRefには、NetworkObjectを1つだけ関連付けることができます。この関連付けは、ネットワーク上のすべてのクライアント間で自動的に複製されます。
PlayerRefとNetworkObjectの関連付けは、NetworkRunner.SetPlayerObject(PLayerRef, NetworkObject)メソッドを使用して設定します。
- ホスト(サーバー)モード:Player Objectは、ホスト/サーバーでのみ設定できます
- 共有モード:各プレイヤーは自身のPlayer Objectの関連付けのみを設定でき、プレイヤーは関連付けるNetworkObjectの状態権限を持っている必要があります
すべてのピアは、NetworkRunner.TryGetPlayerObject(PlayerRef, out NetworkObject)メソッドから、特定のPlayerRefに関連付けられたNetworkObjectを取得できます。
C#
// On Player Joined, create and define a Player Object.
void OnPlayerJoined(PlayerRef player, NetworkRunner runner){
    if (Object.HasStateAuthority == false) return;
    var plObject = runner.Spawn(PlayerObjectPrefab);
    var plData = plObject.GetComponent<PlayerData>();
    //SetData defines the PlayerRef for that NB and a life amount.
    plData.SetData(player, 3);
    runner.SetPlayerObject(player, plObject)
}
// When desired, get the Player Object.
int GetPlayerLife(PlayerRef player){
    if (Runner.TryGetPlayerObject(player, out var plObject)){
        return plObject.GetComponent<PlayerData>().Lifes;
    }
    Debug.LogError("Player Object Not found")
    return 0;
}
状態権限(State Authority)
各NetworkObjectは、StateAuthorityとして関連付けられたPlayerRefを持ちます。StateAuthorityは、NetworkObjectの状態(ネットワークプロパティ)を管理します。状態権限者によって変更されたネットワークプロパティは、ネットワークを介して他のクライアントに複製されます。
プレイヤーは、任意のオブジェクト(状態権限者が割り当てられていない、またはAllow State Authority Overrideがtrueに設定されている)に対する状態権限を持つことが可能です。状態権限が割り当てられるのは、オブジェクトがスポーンした時と、NetworkObject.ReleaseStateAuthority()とNetworkObject.RequestStateAuthority()を呼び出して手動で変更した時です。