Unity DOTS1.0 入门(3) System与SystemGroup 概述

本文详细介绍了Unity中的System和SystemGroup概念,包括它们在游戏引擎中的作用、托管与非托管System的区别、SystemGroup的定制功能以及如何创建和使用GameSystem。还展示了如何在Update方法中进行组件查询以提升性能。
摘要由CSDN通过智能技术生成

System与SystemGroup 概述

System

  1. System是提供一种代码逻辑,改变组件的数据状态,从一个状态到另外一个状态
  2. System在main thread里面运行, system.Update方法每一帧执行一次(其他线程中运行的就是JobSystem的事情了)
  3. System是通过一个System Group这个体系来决定它调用的顺序
  4. 可以定义托管或者非托管的System
    1.定义托管方式:用Class继承SystemBase
    2.定义非托管方式:用Struct继承ISystem
  5. 两种方式都可以重写3个方法:
    OnUpdate, OnCreate, OnDestroy
  6. 一个System只能处理本身所处世界的Entity,并且可以通过World属性获得所处的世界
  7. 默认情况下,启动的时候会为每个system与SystemGroup 创建一个实例出来;并且会创建3个默认SystemGroup:
    • lnitializationSystemGroup:
    • SimulationSystemGroup:
    • PresentationSystemGroup:
      默认情况下,用户创建出来的System实例,会放到SimulationSystemGroup这个分组下。 你也能够使用[UpdatelnGroup]来制定某个System放到哪个分组
  8. 可以使用的System类型有:
    • SystemBase: 为被托管system提供基类.(class 使用)
    • ISystem: 为非托管system提供可继承接口(struct 使用).
    • EntityCommandBufferSystem: 为其他system提供实体命令缓冲区实例(entity command buffer instances). 这允许你将结构性变化分组在一起,以提高应用程序的性能.
    • ComponentSystemGroup: 为system提供嵌套的组织和update的顺序.

System Group

  1. 包含System或者子System Group
  2. 也有Update,可以被重写
  3. 可以定制它孩子的update调用顺序

System Window

  • 这个窗口可以查看每个World中Systems update的调用顺序
    在这里插入图片描述
  • 图标类型说明如下:
    在这里插入图片描述
  • 第一个表示:system group
  • 第二个表示:system
  • 第三个表示:会在SystemGroup最开始时执行的一个entity command buffer system
  • 第四个表示:在一个system group里最后执行的entity command buffer system

System示例代码

创建GameSystem.cs脚本

//必须添加partial关键字 不然会报错,这是因为Unity在编译时会自动生成这个类的其他代码
public partial class GameSystem : SystemBase
{

    protected override void OnUpdate()
    {
        
    }
    
    protected override void OnCreate()
    {
        base.OnCreate();
    }
    
    protected override void OnDestroy()
    {
        base.OnDestroy();
    }
}

运行后在Simulation System Group 下就能看到,这是Unity通过SystemBase类的注解(attribute)创建出来的
在这里插入图片描述

update中代码示例:查询场景中所有的ComponentData组件的rotSpeed和LocalTransform

protected override void OnUpdate()
    {
        //查询ComponentData 的LocalTransform
        
        //遍历系统中所有的ComponentData 和 LocalTransform
        //SystemAPI.Query 会在编译时生成EntityQuery代码,并且缓存查询的类型,然后用计数器迭代缓存的Query数据并替换掉 SystemAPI.Query<T> 
        foreach (var (r, t) in SystemAPI.Query<RefRW<ComponentData>, RefRO<LocalTransform>>())
        {
            //RefRW<ComponentData> r 代表可读写的ComponentData
            //RefRO<LocalTransform> t 代表只读的LocalTransform
            //ValueRW 和 ValueRO 是对应的引用. RW 代表可读写,RO 代表只读
            float rotSpeed = r.ValueRO.rotSpeed;
            Vector3 position = t.ValueRO.Position;
        }
    }
  • 9
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值