【UnityDOTS 七】IAspect的使用

IAspect的使用

前言

IAspect是Unity DOTS中用来更方便组织数据集合的接口。可以将我们需要的数据集合放到一个IAspect中,然后用这个自定义的IAspect去进行查询。


一、IAspect是什么?

示例:pandas 是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的。
如上面官方文档说的,是一个高级的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关键字来表示。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值