IAspect的使用
前言
IAspect是Unity DOTS中用来更方便组织数据集合的接口。可以将我们需要的数据集合放到一个IAspect中,然后用这个自定义的IAspect去进行查询。
一、IAspect是什么?
如上面官方文档说的,是一个高级的Component组合体。
可以从工程查看Unity帮我们生成的Aspect代码看到,它的实现原理。
- 先建立对Aspect中的数据的ComponentLookUp(这一点在IJobChunk使用中一样的)
- 生成迭代器去迭代对应的ArcheType中的Chunk
- 从Chunk中获取对应的Component的NativeArray
- 然后遍历这个NativeArray就能获取到对应的数据
二、IAspect能包含什么数据
- Entity,某个实体的引用
- RefRw,RefRO,对某些Component的Ref引用,可以添加Optional这个属性标签,让这个属性变成可选的
- EnabledRefRW,EnabledRefRo,对EnableComponent的引用
- DynamicBuffer,组件类型为DynamicBuffer的
- SharedComponent,只读的ShareComponent
- 嵌套其他IAspect
Aspect不仅能组织各类Component数据,还能嵌套使用,这样对数据的使用提供了更多的组织形式,更加方便去编写相关代码。
三、怎么使用
许多查询接口都提供了单独IAspect为参数的同名方法。
比如:SystemAPI的Query接口
在IJobEntity中的Excute方法:
使用其他也很简单,就是传入一个你想要的Aspect类型参数即可。
Aspect类中也可以写入一些方法,方便直接以Aspect数据为目标集合,进行模块化的处理。
实例代码如下:
readonly partial struct RotateAspect : IAspect
{
readonly RefRW<LocalTransform> localTransform;
readonly RefRO<RotateSpeed> speed;
public void Rotate(float deltaTime)
{
localTransform.ValueRW = localTransform.ValueRO.RotateY(speed.ValueRO.rotateSpeed * deltaTime);
}
}
因为Aspect是高级的封装,Unity会利用SourceGen帮助我们生成辅助代码,所以需要是Partial类,在类定义的readOnly字段是Unity的写法要求,不代表不能修改RefRW数据,里面成员变量的readOnly也不代表真的是readonly。真正的读写权限需要RefRW,RefRO关键字来表示。