【Dots之007】IAspect基础知识

一、基础介绍

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来修饰,这是规定,没有就会报错
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值