一、基础介绍
IAspect从字面意思看不出这个东西用来是干啥的;所以就需要同它的定义和使用方式上来进修了解;
- IAspect继承IQueryTypeParameter,也就是IAspect可以用于SystemAPI.Query进行Entity的组件查询;
- IAspect和普通的IComponentData都可以用于Query,那么它们之间有什么区别呢?或者IAspect存在的有点是什么?
- IAspect可以对需要的组件进行封装,查询的时候只需要传入继承于IAspect的Struct即可;
比如:
- 给一个函数传递参数,当函数只有2个左右的参数的时候,我们非常方便的就可以进行传参;直接把两个参数传递过去就可以;
- 如果函数需要的参数是10个,或者更多呢?这个时候按照上面的产生传递就很麻烦了;所以都会把多参数的传递抽象成一个对象或者struct,这样就方便了;
- 同理这里的IAspect其实也是这个作用。
二、代码分析
1、补全所有需要查找的组件
struct ComponentA : IComponentData { }
struct ComponentB : IComponentData { }
struct ComponentC : IComponentData { }
struct ComponentD : IComponentData { }
struct ComponentE : IComponentData { }
[BurstCompile]
public void OnCreate(ref SystemState state)
{
foreach (var (ca, cb, cc, cd, ce) in SystemAPI
.Query<ComponentA, ComponentB, ComponentC, ComponentD, ComponentE>())
{
}
}
总结:
上面的这段伪代码;需要查询ComponentA-E的组件,在foreach中的编写方式确实是比较麻烦;如果不嫌麻烦就这样写也没毛病,不过我觉得麻烦,所以这个时候直接传递一个对象进行给我查询,那就是方便、简洁很多;
2、IAspect组件封装
struct ComponentA : IComponentData { }
struct ComponentB : IComponentData { }
struct ComponentC : IComponentData { }
struct ComponentD : IComponentData { }
struct ComponentE : IComponentData { }
readonly partial struct Componets:IAspect
{
readonly RefRW<ComponentA> componentA;
readonly RefRW<ComponentB> componentB;
readonly RefRW<ComponentC> componentC;
readonly RefRW<ComponentD> componentD;
readonly RefRW<ComponentE> componentE;
public void Test(){}
}
[BurstCompile]
public void OnCreate(ref SystemState state)
{
foreach (var components in SystemAPI.Query<Componets>())
{
}
}
总结: 在上面的代码中新增了一个Componets结构体,继承于IAspect;
- 该结构体里面包括了需要查询的所有组件;
- 在查询的时候我只需要使用SystemAPI.Query语句即可,需要查询的组件都在Componets结构体内
- SystemAPI.Query需要匹配到所有组件的Entities才会有数据
- 还可以在该struct里面添加方法进行访问,比如Test()
- 这样操作entity的组件通过Components进行间接访问操作就可以了
2.1 .IApsect注意点
- 继承自IApect的Struct,结构本身需要用readonly partial来修饰
- 字段需要readonly来修饰,这是规定,没有就会报错