見出し画像

Unity DOTS 入門 (8) - システムの実行順序

「システム」の実行順序を調整する方法を説明します。

・Unity 2019.3.14.f1
・Entities 0.11.1

1. システムの実行順序

「ECS」のシステムの実行順序は、「Entity Debugger」の左側で確認することができます。

画像1

◎ 実行タイミング
ツリーの最上位ノードは、システムの「実行タイミング」です。

Initialization : 初期化時に実行。
Update : 更新時に実行。
PreLateUpdate : 表示時に実行。

◎ システムグループ
「実行タイミング」の子ノードは「システムグループ」です。「システム」をまとめてツリー状態に管理しています。実行タイミングごとに、上のシステムから順番に実行されます。

◎ Initialization
 ・InitializationSystemGroup
  ・BeginInitializationEntityCommandBufferSystem
  ・CopyInitialTransformFromGameObjectSystem
  ・SubSceneLiveLinkSystem
  ・SubSceneStreamingSystem
  ・EndInitializationEntityCommandBufferSystem

◎ Update
 ・SimulationSystemGroup
  ・BeginSimulationEntityCommandBufferSystem
 
 ・TransformSystemGroup
 
 ・EndFrameParentSystem
 
 ・CopyTransformFromGameObjectSystem
 
 ・EndFrameTRSToLocalToWorldSystem
 
 ・EndFrameTRSToLocalToParentSystem
 
 ・EndFrameLocalToParentSystem
 
 ・CopyTransformToGameObjectSystem
 
 ・LateSimulationSystemGroup
 
 ・EndSimulationEntityCommandBufferSystem

◎PreLateUpdate
 ・PresentationSystemGroup
  ・BeginPresentationEntityCommandBufferSystem
 
 ・CreateMissingRenderBoundsFromMeshRenderer
 
 ・RenderingSystemBootstrap
 
 ・RenderBoundsUpdateSystem
 
 ・RenderMeshSystem
 
 ・LODGroupSystemV1
 
 ・LodRequirementsUpdateSystem
 
 ・EndPresentationEntityCommandBufferSystem

Unity DOTS 入門 (1)」のサンプルの「RotatorSystem」は、「Update/SimulationSystemGroup」の子ノードです。更新時に実行されることがわかります。

画像2

2. システムの順序付け属性

システムのクラス宣言に、[UpdateInGroup][UpdateBefore][UpdateAfter]を付加することで、システムの順序を変更することができます。

◎ [UpdateInGroup]
システムを配置するグループを指定できます。省略した場合、デフォルトワールドの「SimulationSystemGroup」に追加されます。

[UpdateInGroup(typeof(<システムグループ>))]
public class <システム> : SystemBase
{ 
   ...
}

◎ [UpdateBefore]・[UpdateAfter]
任意のシステムの前または後に、グループ内の更新順序を指定できます。指定する任意のシステムは、同じグループである必要があります。グループの境界を越えた順序付けは、両システムを含む適切な最も深いグループで処理されます。

[UpdateBefore(typeof(<システム>))]
public class <システム> : SystemBase
{ 
   ...
}
[UpdateAfter(typeof(<システム>))]
public class <システム> : SystemBase
{ 
   ...
}

◎ [DisableAutoCreation]
デフォルトワールド初期化中にシステムが作成されないようにします。システムを明示的に作成および更新する必要があります。

3. システムの順序付け属性の実践

試しに、「Unity DOTS 入門 (1)」のサンプルのシステム「RotatorSystem」の順序を変更してみます。

(1) RotatorSystemに[UpdateInGroup]属性を付加。

[UpdateInGroup(typeof(LateSimulationSystemGroup))]
public class RotatorSystem : SystemBase
{
   ...
}

(2) 「Entity Debugger」で「LateSimulationSystemGroup」に移動していることを確認。

画像3


この記事が気に入ったらサポートをしてみませんか?