天天看點

Unity ECS Manual [11]

Creating a system(建立一個系統)

  實作抽象類SystemBase來建立一個ECS系統。

  為了建立一個系統,你要對必要的系統事件回調進行程式設計。使用SystemBase的OnUpdate()函數來執行你的系統每一幀必須做的工作。其他回調函數是可選的;例如,你可以使用OnCreate()來初始化一個系統,但不是每個系統都需要初始化代碼。

  系統回調函數是按以下順序調用的:

Unity ECS Manual [11]
  • OnCreate() – 當系統被建立時被調用。
  • OnStartRunning() – 在第一次OnUpdate()之前和系統恢複運作時。
  • OnUpdate() – 每一幀,隻要系統有工作要做(見ShouldRunSystem()),并且系統是啟用的。
  • OnStopRunning() – 每當系統停止更新時,這可能是因為你将Enabled設定為false,或者是因為它沒有發現符合其查詢的實體。也會在OnDestroy()之前調用。
  • OnDestroy() – 當系統被銷毀時。

  一個系統的OnUpdate()函數是由其父系統組自己的OnUpdate()函數觸發的。同樣地,當一個組改變狀态時,例如你設定了該組的Enabled屬性,它就會改變其子系統的狀态。然而,子系統也可以獨立于其父組改變狀态。更多資訊請參見系統更新順序。

  所有的系統事件都在主線程上運作。理想情況下,你的OnUpdate()函數會安排Job來完成大部分的工作。要從系統中安排一個Job,你可以使用以下機制之一:

  • Entities.ForEach – 周遊ECS元件資料的最簡單方法。
  • Job.WithCode – 将lambda函數作為一個單一的背景Job執行。
  • IJobEntityBatch – 一個 "較低級别的 "機制,用于逐塊疊代ECS元件資料。
  • C# Job System – 建立和安排通用的C# Job。

  下面的例子說明了使用Entities.ForEach來實作一個系統,根據另一個元件的值來更新一個元件。

public struct Position : IComponentData
{
    public float3 Value;
}

public struct Velocity : IComponentData
{
    public float3 Value;
}

public partial class ECSSystem : SystemBase
{
    protected override void OnUpdate()
    {
        // Local variable captured in ForEach
        float dT = Time.DeltaTime;

        Entities
            .WithName("Update_Displacement")
            .ForEach(
                (ref Position position, in Velocity velocity) =>
                {
                    position = new Position()
                    {
                        Value = position.Value + velocity.Value * dT
                    };
                }
            )
            .ScheduleParallel();
    }
}