Unity ECS Manual [11]

63 篇文章 11 订阅

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();
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值