Creating a system(创建一个系统)
实现抽象类SystemBase来创建一个ECS系统。
为了创建一个系统,你要对必要的系统事件回调进行编程。使用SystemBase的OnUpdate()函数来执行你的系统每一帧必须做的工作。其他回调函数是可选的;例如,你可以使用OnCreate()来初始化一个系统,但不是每个系统都需要初始化代码。
系统回调函数是按以下顺序调用的:
- 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();
}
}