Network Object
概要
ネットワークオブジェクトは、NetworkObject
コンポーネントを持つGameObject
で、ルーム内のネットワーク上の要素(Entity)の一つを表します。
ネットワークオブジェクトは、スポーンするかシーンオブジェクトとしてロードすることで生成できます。
NetworkId
サーバーはNetworkObject
コンポーネントにNetworkId
の値を割り当てます。NetworkId
は、ルーム内のオブジェクトのユニークな整数の識別子で、全てのピア間で一貫性があり、ネットワーク上のオブジェクトを参照するために使用されます。
NetworkId
をNetworkRunner.TryFindObject()
に渡して呼び出すことで、ローカル上のネットワークオブジェクトのインスタンスを検出できます。
ネットワークオブジェクトのスポーン
ネットワークオブジェクトを生成する方法は、以下の二つがあります。
Runner.Spawn()
を呼び出すSpawn
を呼び出すと、NetworkObject
コンポーネントを持つゲームオブジェクトが生成され、スポーン操作が複製されます。Runner.StartGame()
で渡すINetworkObjectProvider
に、スポーンするオブジェクトをどのように生成するかの実装が含まれます。例えば、プレハブからインスタンス化する・既存のオブジェクトをコピーする・コードからオブジェクトを生成する・オブジェクトプールから取得する、などです。- ネットワークオブジェクトが置かれたシーンをロードする。シーンローディングをご覧ください。
どちらの方法でも、生成されたネットワークオブジェクトの状態は、関心を持つ全てのピアに複製されます。
Runner.Spawn()
Runner.Spawn()
は、ホストモードのサーバーか、共有モードでオブジェクトの状態権限を持たせたいクライアントでのみ呼び出します。呼び出し後、指定したプレハブがインスタンス化されて、NetworkObject
コンポーネントがNetworkRunner
に紐付けられます。スポーン操作は、オブジェクトに関心がある他のクライアントに複製されます。
実行時のNetworkBehaviourの追加/削除
スポーン済みのネットワークオブジェクトで、NetworkBehaviour
の追加/削除はできません。
シーンオブジェクトのロード
シーン上のネットワークオブジェクトをロードするのは、オブジェクトを生成して紐付けるためのもう一つの方法です。ISceneManager
インスタンス(シーンローディングをご覧ください)を使用してシーンがロードされると、シーン上の有効なネットワークオブジェクトは、マスタークライアント(共有モード)に紐付けられます。その後、各シーンオブジェクトに割り当てられたNetworkId
はその他全てのクライアントに複製されます。そして各クライアントで、そのNetworkId
が割り当てられたシーンオブジェクトが紐付けられます。
紐付け(Attaching)
ネットワークオブジェクトは、スポーンするかシーンからロードすることで紐付けられます。紐付けとは、ネットワークオブジェクトにNetworkId
を割り当て、NetworkBehaviour
のネットワークプロパティのためにメモリを確保し、全ての関連するNetworkBehaviour
を初期化するプロセスになります。紐付け後、NetworkObject
は、全ての子のNetworkBehaviour
のSpawned()
を呼び出します。そしてSpawned()
が呼び出されると、ネットワークオブジェクト自身と、そのネットワークプロパティやRPCが有効となり、FixedUpdateNetwork()
やRender()
のようなイベントメソッドやインターフェースのメソッドが呼び出されるようになります。
状態権限
紐付けられたネットワークオブジェクトの、明示的または暗黙的な状態権限は、PlayerRef
で指定されます。NetworkObject.StateAuthority
の値がPlayerRef.None
の場合、サーバーが暗黙的な状態権限を持ちます。
- 状態権限を渡すことはできません。たとえ状態権限を持つプレイヤーだとしても、他のプレイヤーにその状態権限を渡すことはできません。
- 状態権限は取得することができます。プレイヤーは
Object.RequestStateAuthority()
を呼び出して、状態権限の取得を試みることができます。
RequestStateAuthority()
は、以下の場合のみ成功します。
NetworkObject.AllowStateAuthorityOverride
がtrueに設定されている場合- 前に状態権限を持っていたプレイヤーが
Object.ReleaseStateAuthority()
を呼び出していた場合
ネスティング
Fusionは、ネットワークオブジェクトの入れ子に対応しています。ネスティングとは、あるネットワークオブジェクトが他のネットワークオブジェクトの子要素になることです。ネットワークオブジェクトは、複数のネットワークオブジェクトを含むことができます。ネットワークオブジェクトが紐付けられる時、各ネットワークオブジェクトは、親や子のネットワークオブジェクトとは個別の要素として扱われます。NetworkBehaviour
は最も近い親オブジェクトに関連付けられて、ルートのネットワークオブジェクトには、子オブジェクトに属するNetworkBehaviour
は紐付けられません。