実行順序
概要
Fusionの実行ループは3つのメインループに分解することができます。
- Resimulation Loop(リシミュレーションループ);
- Forward Loop(フォワードループ);
- Render Loop(レンダリングループ)
以下のセクションでは、3つのループと、そこで呼び出されるスクリプトとコールバックの順序について説明します。
INT
:INT
のマークがついたコールバックは、Fusionの内部で使用するもので、搭載されているだけのものです。CB
:CB
のマークがついたコールバックは、ユーザーが使用することができ、NetworkBehaviour
やSimulationBehaviour
から継承するスクリプトに関連インターフェースを実装することでフックさせることができます。
グラフィック全体をダウンロードする
実行順序グラフィック全体は、こちらでダウンロードいただけます。
Fusionの初期化
Fusionの初回起動時、NetworkRunner
がRunnerとして同様のオブジェクトでINetworkRunnerCallbacks
を実装しながら全てのコンポーネントを検索します。Awake()
で検出されるものが何もない場合は、Fusion Update Loopの間にもう一度試行されるか、稀ですが、Shutdown Handling中にランナーが即座に破壊され、終了します。
スクリプトが実装するのはINetworkRunnerCallbacks
で、NetworkRunner
と同様のオブジェクトや階層レベルにはロケートしません。これらは、後の段階でNetworkRunner.AddCallbacks()
を呼び出し、NetworkRunner
を使用して登録する必要があります。Runnerが問題なく初期化された後にこれを行います。

Fusion Update Loop(アップデートループ)
Fusionシミュレーションのコアを司るのは、ResimulationループとForwardループです。これらを実行する前に以下の手順を行います。
- Unity自体の FixedUpdate() メソッドが実行されている
PhysicsMode.None
が選択された場合、ローカルのPhysicsシミュレーションが実行している

これらの手順の後で、Fusion Updateループが開始されます。Fusion Updateループは以下の実行手順で構成されています。:
NetworkRunner
で登録されたコールバックが実行される。NetworkObject
スポーンキューが処理される。これが実行されるのは、SceneManager
がビジーで かつNetworkProjectConfig > Object Settings
でSceneLoadSpawnMode.Queued
が選択されている場合のみ です。- Resimulationループの実行。
- Forwardループの実行。
- 両方のループの実行が完了した 後に 、
OnChanged
コールバックが呼び出される。 - Interest Managementが更新される。
- ResimulationループまたはForwardループの間に
FixedUpdateNetwork()
でNetworkRunner.Shutdown()
が呼び出されると、Shutdown Handlingが起動する。

Updateループの開始

Resimulationループ
ServerMode
およびHostMode
でのみ実行します。Resimulationループは、サーバーまたはホストから受信した、最新のステートでローカルステートを調整します。これは、ネットワークステートを、最新のステートにリセットし、現在の予測済み ローカル ティックまでの 検証済み ステートに含まれる最新の サーバー ティックの全てのティックを 再シミュレーションする ことで行われます。

Forwardループ
SharedMode
を含む全てのモードで実行します。HostMode & ServerMode
The Forwardループは、Resimulationループが現在の既知の[Networked]
ステートを調整した後、次の予測された
ティックをシミュレーションします。
SharedMode
Forwardループはシミュレーションを実行する唯一のループです。これは、ローカルシミュレーションにステートオーソリティがあるオブジェクトのシミュレーションと、プロキシオブジェクトに受け取ったステートを適用するものです。

Updateループの終了

Renderループ
The Renderループは、ゲームプレイやゲームステートに関連のないものすべてに対して使用されます。主な目的は、内挿のエントリや、VFXやアニメーションなどのビジュアルフィードバックロジックを提供することです。
Render()
前 は、UnityのUpdate()
の全てのメソッドが実行されます。Render()
後 は、Unity'のLateUpdate
の全てのメソッドが実行されます。
Shutdown Handlingは、Renderループの間にNetworkRunner.Shutdown()
が呼び出された場合に起動します。
