ネットワークオブジェクト
概要
ネットワークオブジェクトは、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は紐付けられません。