実行順序
概要
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()が呼び出された場合に起動します。