このページは編集中です。更新が保留になっている可能性があります。

プレイヤー

概要

Fusionにおける "プレイヤー "とは、Fusionにプレイヤーの入力を提供できる、NetworkRunnerを持つピア、つまりDedicated Game Session Server以外のピアタイプのことを指します。

このドキュメントでは、プレイヤー情報を特定し、アクセスするための様々な方法を紹介します。

トップに戻る

PlayerRef

プレイヤーがコントロールするピアに入力を提供できる各 NetworkRunnerPlayerRef と呼ばれる一意の識別子と関連付けられています。プレイヤーに付与される PlayerRef は識別子としてのみ機能し、プレイヤー固有のデータは一切含まれません。

PlayerRef は構造体で、0 から PlayerCount-1 までの値を持つ Fusion Player をインデックスとして持ちます。インデックスは、プレイヤーがゲームセッションに接続した順番に割り当てられます。

ホストは基本的に入力機能を持つサーバーなので、ゲームセッション専用のサーバーとは異なり、PlayerRefも付与されます。ホストの PlayerRef は常に PlayerCount-1 となります。

トップに戻る

PlayerCount

この値は、ゲームセッションに接続可能なプレイヤーの最大数です。

ゲームセッションごとのデフォルトの最大プレイヤー数は、NetworkProjectConfig アセット内の Simulation > Default Players フィールドで定義されます。

新しいゲームセッションを作成するとき、PlayerCountNetworkRunner.StartGame() に渡された StartGameArgs.PlayerCount の値(NULL可)で決定されます。もし StartGameArgs.PlayerCount に値が設定されていない(または null に設定されている)場合、新しいゲームセッションは NetworkProjectConfigDefault Player カウントを代わりに使用します。

専用サーバーは PlayerRef を持たず、プレイヤーを表さないので、PlayerCount の制限にカウントされません。つまり、PlayerCountが4のゲームセッションは、以下をサポートします。 - ホスト1台、クライアント3台 - 1台の専用サーバーと4台のクライアント - 4人の共有モードクライアント

トップに戻る

プレイヤーオブジェクトの定義

プレイヤーオブジェクト は、ゲームセッションの各 PlayerRef を特定の NetworkObject 'Avatar' に関連付けるためのオプションで、便利な方法です。

それぞれの PlayerRef は、正確に1つの NetworkObject と関連付けることができます。この関連付けはネットワーク化され、すべてのクライアントで自動的に複製されます。

PlayerRef <-> NetworkObject の関連付けは NetworkRunner.SetPlayerObject(PLayerRef, NetworkObject) メソッドで設定されます。

  • ホスト&サーバーモード:プレイヤーオブジェクト は、ホスト/サーバーのみが設定可能です。
  • Shared Modeの場合:各プレイヤーは、自分自身の Player Object の関連付けを設定することができ、そのプレイヤーは関連付けられた NetworkObject に対する状態権限も持っている必要があります。

どのピアも NetworkRunner.TryGetPlayerObject(PlayerRef, out NetworkObject) メソッドで特定の PlayerRef に関連付けられた NetworkObject を取得することができます。

// 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;
}

各プレイヤーは、1つのプレイヤーオブジェクトしか持つことができません。

トップに戻る

状態権限

  • ServerMode: サーバのみで、プレイヤーはゲーム状態に対する状態権限を持ちません。
  • HostMode: ホストプレイヤーはサーバーを代表しているため、状態権限を持ちます。
  • SharedMode: 権限は分散化され、プレイヤー間で共有されます。どのプレイヤーも、まだ状態権限が割り当てられていないオブジェクトに対して状態権限を持つことができます。状態権限はオブジェクトが生成されたときに割り当てられ、 NetworkObject.ReleaseStateAuthority()NetworkObject.RequestStateAuthority() を呼び出すことで変更することが可能です。

トップに戻る

入力権限

  • ServerMode & HostMode: プレイヤーは複数の NetworkObject に対して入力権限を持つことができます。プレイヤーが NetworkObject に対する入力権限を持っている場合、プレイヤーは入力を送信することができ、サーバはその特定のオブジェクトに対する入力を探す際にそれをキャッチします。これが、クライアントからサーバーへの主な通信手段です。
  • SharedMode: 入力はローカルクライアントにのみ有効で、中央の権威には送信されません。クライアントはオブジェクトに対する状態権限を持つことができるので、入力を直接適用することができます。

トップに戻る

1 台のマシンで複数のローカルプレイヤー

1台のネットワークランナーで複数のローカルプレイヤーがプレイできる場合(例えば、カウチCo-opとオンラインプレイヤーの組み合わせ)、Fusionのプレイヤーコンセプトとは別に、ローカルプレイヤーの区別を行うゲーム固有のロジックが必要です。複数のローカルプレイヤーからの入力は、Fusion の入力システムに統合され、1つのネットワーク入力構造体に、全てのローカルプレイヤーの入力データを保持する必要があります。

注: ローカルに複数のプレイヤーがいると、SetPlayerObjectOnPlayerJoined などの PlayerRef に依存する関数を使用する際に、追加のカスタムロジックが必要になります。

ドキュメントのトップへ戻る