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