スクリプトの実行制御
概要
Fusion が SimulationBehaviour と NetworkBehaviour コンポーネントを実行する際の相対的なスクリプト順序を制御する属性は、主に2つあります。
- [OrderBefore]
- [OrderAfter]
これらは、FixedUpdateNetwork() や Render() など、ほぼ全ての Fusion コールバックに影響します。
C#
[OrderBefore(typeof(MyOtherSimulationBehaviour)]
[OrderAfter(typeof(NetworkTransform), typeof(MyOtherNetworkBehaviour))]
public class MySimulationBehaviour : SimulationBehaviour {
}
UnityとFusionのコールバックの関連順序
- FixedUpdate()
- FixedUpdateNetwork()
- Update()
- Render()
- LateUpdate()
Update() と LateUpdate()
Render()順序を管理する[OrderBefore]および[OrderAfter]の代替案として、以下のスタンダードなUnityコールバックを使用することもできます。
- Update()は、必ず全てのコンポーネントタイプの全てのFusion- Render()呼び出しの前に実行します。
- LateUpdate()は、必ず全てのコンポーネントタイプの全てのFusion- Render()呼び出しの後に実行します。
Unityスクリプトの実行順序は、いつも通りUpdate()およびLateUpdate()のスクリプト順序を管理するために使用できます。これらはUnityの通常のUnityコールバックであるためです。
重要: 多くの場合、UnityのFixedUpdate()は使用すべきではありません。Fusionのタイミングメカニズムや、FusionがPhysics.Simulate()を呼び出すレートとは完全に切り離されたものだからです。
ソート処理
リコンパイル中とゲーム起動時に、すべての SimulationBehaviours がアセンブリ内で見つかり、NetworkPhysicsSimulation3D と NetworkPhysicsSimulation2D を除いてアルファベット順にソートされます。
まず、それぞれの SimulationBehaviour が [OrderBefore] または [OrderAfter] 属性を持つかどうかをチェックします。どちらもクラスに存在しない場合、親クラスが再帰的に検索され、これらの属性のいずれかを持つ最も近い親の属性が使用されることになります。そして、すべての SimulationBehaviours がソートされ、すべての OrderBefore と OrderAfter 属性を満たす決定論的な順序が生成されます。
N.B.: [OrderBefore] と [OrderAfter] のタイプはいくつでも指定することができます。もし、これらのスクリプトが解決できない競合を起こした場合、デバッグログにはどのスクリプトが競合しているのかを示すエラーが表示されます。
NetworkPhysicsSimulation3DとNetworkPhysicsSimulation2Dは、初期状態では他のすべてのアルファベット順のSimulationBehavioursの後になるようにソートされています。この2つのスクリプトの後に実行するには、[OrderAfter] 属性を使用して明示的に指示する必要があります。
C#
[OrderAfter(typeof(NetworkPhysicsSimulation3D)]
継承
派生スクリプトが独自のordering属性を持つ場合、デフォルトで親の値が使用されます。しかし、子スクリプトが独自の順序を定義している場合、その順序が自身の実行順序に使用されます。
注: 従って、親スクリプトと子スクリプトの順序属性は加算式ではありません。
Simulation Inclusion
[SimulationBehaviour] 属性を使用すると、FixedUpdateNetwork() の実行を以下のように制限することができます。
- 特定のステージ (ResimulationまたはForward) のみ
- 特定のピアモード (Server/Host/Client)
C#
[SimulationBehaviour(
  Stages = SimulationStages.Forward,
  Modes  = SimulationModes.Server | SimulationModes.Host
)]
Fusion Script Execution Inspector
Fusion Script Order ウィンドウは、メニュー Fusion > Windows > Script Execution Inspector から開くことができます。このウィンドウでは、様々なスクリプトがどのような順番で、どのようなシミュレーション段階で実行されるかが表示されます。
N.B.: スクリプトの実行は、以下の属性によって制御されます。
- [SimulationBehaviour]
- [OrderBefore]
- [OrderAfter]
Fusion Script Execution Inspector ウィンドウは、これらの属性の結果を視覚化するためだけのものです。属性を変更するには、スクリプトで変更する必要があります。