Unity ECS学习(7)

Component和Baking结束了,那接下来就是system了

System概述

System是通过使用修改Componet中的数据,达成一系列逻辑处理功能。
说白了,这里是用来写控制处理的逻辑的,比如移动,计算之类的。
System也份很多种

  • SystemBase 为托管系统提供基类,最常用的一种System
  • ISystem 非托管系统接口
  • EntityCommandBufferSystem 为其他系统提供实体命令
  • ComponentSystemGroup 提供系统的嵌套组织和更新顺序

这里我们着重说一下SystemBase和ISystem

SystemBase

使用需要继承SystemBase抽象类,并且重写OnUpdate方法
OnUpdate方法:每帧执行一次
所有的system event都在主线程上运行。最佳做法是使用该方法来计划作业以执行大部分工作。若要在System里面调用多线程执行逻辑,可以使用以下调用方法

  • Entities.ForEach:循环访问组件数据。
    这个方法是遍历entity和component并执行逻辑的最简单的方式。Entities.ForEach方法会根据entity查询,在所有的查询结果上执行一个lambda方法。
    要执行job的lambda方法,你可以使用Schedule()和ScheduleParallel()来调度job,也可以调用Run()方法在主线程上立即执行。你也可以使用Entities.ForEach中的多个方法来设置entity查询和job选项
Entities.ForEach((Entity e, ref LocalTransform transform, in MoveComponent moveComponent) =>
        {
            transform.Position.x += moveComponent.Speed*UnityEngine.Time.deltaTime;
        }).Run();

注意lambda参数中的ref和in修饰符。ref代表了组件会被写入,in代表组件是只读的。将组件设置为只读可以让job调度更有效率。
在使用ForEach前还可先进行筛选,利用WithAll(同时包含参数中所有组件), WithAny(包含参数中任意一个组件), WithNone(不包含参数中的组件)方法来设置更详细的筛选条件

Entities.WithAll<LocalTransform>()
    .WithAny<Rotation, Scale>()
    .WithNone<LocalToParent>()
    .ForEach((ref LocalTransform transform, in MoveComponent moveComponent) =>
    {
        // 执行一些任务
    })

链接: 这里有更加详细的Entities.ForEach的使用规则

  • Job.WithCode:通过lambda函数构造单个后台运行的job,这种方式非常简单。Job.WithCode还可以在主线程上运行,并且还可以利用Burst编译来加快执行速度
        NativeArray<float> randomNumbers
            = new NativeArray<float>(500, Allocator.TempJob);
        var data = 3;
        Job.WithCode(() =>
        {
            for (int i = 0; i < randomNumbers.Length; i++)
            {
                randomNumbers[i] = data;
            }
        }).Schedule();

注意事项:产生的数据只能存储在 NativeArray 里,用于计算的数据必须是值类型,如果需要引用类型则只能使用Run方法在主线程执行。
这里也贴一个更加详细的示例

  • IJobEntity:循环访问多个系统中的组件数据。
  • IJobChunk:按原型块循环访问数据。
    这俩我后面再研究一下。

然后是SystemBase里面提供的一些回调方法

  • OnCreate:创建系统时调用。
  • OnStartRunning:在第一次调用系统之前和每次系统恢复运行时调用。OnUpdate
  • OnUpdate:只要系统有工作要做,就会调用每一帧。有关确定系统何时有工作要做的因素的详细信息,请参阅 ShouldRunSystem。
  • OnStopRunning:在 之前调用。每当系统停止运行时也会调用,如果没有与系统的 RequireForUpdate 匹配的实体,或者系统的 Enabled属性设置为 。请注意,如果指定“否”,系统将连续运行,除非禁用或销毁。OnDestroyfalseRequireForUpdate
  • OnDestroy:在系统被破坏时调用。

这些有些类似gameObject的Awake Update 这些
回调方法的执行顺序,就是按照从上到下。
先到这,下次我们再说ISystem

  • 34
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Unity ECS(Entity Component System)是Unity引擎的一种编程范式,它是一种数据驱动的编程模型,它将游戏对象(Entity)分解为数据和行为两个部分,其中数据由组件(Component)来表示,行为则由系统(System)来实现。相对于传统的面向对象编程模型,ECS提供了更高效、更灵活的编程方式,可以有效地提高游戏的性能和扩展性。 下面是我学习Unity ECS时的笔记: ## Entity Entity是ECS中最基本的概念,它表示游戏对象。每个Entity由一个唯一的ID来标识,可以通过EntityManager来创建、销毁、查询和管理Entity。 ## Component Component是Entity的数据部分,用来描述Entity的属性和状态。每个Component包含一些数据成员和一些方法,用来操作这些数据成员。Component是以结构体(struct)的形式定义的,通常只包含数据成员,不包含方法。 ## System System是Entity的行为部分,用来实现游戏逻辑和操作Component。System可以访问和操作EntityManager和Component,但不能直接访问Entity。每个System包含一个或多个Component,表示它所处理的数据类型。System是以类(class)的形式定义的,通常包含一个Update方法,用来实现游戏逻辑。 ## Job Job是一种轻量级的线程,用于并行执行System中的任务。Job可以访问和操作Component,但不能直接访问Entity和EntityManager。Job通常是以结构体(struct)的形式定义的,不包含方法。 ## Archetype Archetype是Entity的集合,包含一组具有相同Component类型的Entity。Archetype可以用来优化数据的访问和处理,可以在不同的System之间共享。 ## Chunk Chunk是Archetype中的数据块,包含一组连续的Entity和它们的Component数据。Chunk可以用来优化内存的分配和访问,可以在Job中进行并行处理。 ## Buffer Buffer是一种Component类型,用来存储可变长度的数据,例如数组或列表。Buffer可以在System和Job中进行修改和访问。 以上是我学习Unity ECS时的笔记,希望对你有所帮助。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值