【UnityDOTS 五】遍历与查找数据(重点)

遍历与查找数据

遍历查询数据,应该是游戏逻辑中最为普遍也最为重要的逻辑。毕竟只有找到你需要的数据之后,你才会去修改,删除他们。

前言

一般的逻辑步骤:先查找到一大片符合你要求的数据集合,然后再遍历这些集合中的数据,然后根据你的算法或者要求去更新、计算这些数据。

一、遍历查询的方式

  • SystemAPI.Query ForEach
  • IJobEntity
  • IJobChunk
  • Entities.ForEach
  • Manually

二、SystemAPI

在这里插入图片描述](https://img-blog.csdnimg.cn/65fae561deb04cea80e82657c1e767fb.png)
![在这里插入图片描述

注意:SystemAPI,只能在System中调用,同时Query的结果不能保存为一个变量来实现重用。

在这里插入图片描述

三、IJobEntity

结合了Job系统使用的一种隐式的查询方法。在一个JOB中通过Excute指定对应的查询条件,然后DOTS会帮我们按这些条件查询到对应的Entity,每个Entity来执行一次这个JOB的Excute方法。
底层使用的是IJOBChunk(即:找到符合条件的ArcheType,再找到里面包含的Chunck,然后根据Chunk里面的Entity来执行这个JOB的Excute方法)

构造IJobEntity的Job时,可以添加下面这些标签特性(Attributes)到不同的位置来修改对应的查询结果。
在这里插入图片描述
在对应的JOB中的Excute函数可以传入不同的参数来实现不同的功能
在这里插入图片描述

四、IJobChunk

实现针对每一个符合的ArcheType的所有Chunk执行一次Excute函数。
备注:IJobEnity,以及Enities.ForEach,会自动跳过EnableComponent状态不匹配的结果,而IJobChunk需要使用useEnableMask与ChunkEnableMask来过滤EnableComponent状态不匹配的结果。
IJOBChunk使用起来更为复杂,除非一些特殊情况:比如要对Chunk中所有Entity进行处理,或者需要以特殊的方式去遍历Chunk中的数据。
使用方式:

  • 先在对应的System中声明对应要访问Chunk中的ComponentTypeHandle。
  • 在System的Oncreate中,通过SystemState 去获获取对应的Handle赋值
  • 在System的OnUpdate中,调用ComponentTypeHandle的.Update方法去更新
  • 新建一个IJobChunk的Job并传入这个ComponentTypeHandle
  • 在IJobChunk中通过传入的ArchetypeChunk调用GetNativeArray方法获取对应ComponentTypeHandle对应的Component的NativeArray。这样就找到对应Chunk中的所有满足条件的Component数据了
  • 然后构造一个ChunkEntityEnumerator迭代器,通过NextEntityIndex方法迭代访问对应Component的NativeArray中的每一个单独的Entity的Component数据。

五、Entities.ForEach与手工遍历

Entities.ForEach只能用于继承与SystemBase的System,用得比较少。
使用EntityManger的GetAllEnities()与GetAllChunks(),然后结合ForEach来使用,性能比较差。
这两种方式很少使用,就不详细深究了。

六、自定义EnityQuery

System.API只能获取符合条件的所有Component组合。比如:X,Y,Z,以及只包含X,Y两种,如果使用System.API来查询X,Y,会将包含X,Y,Z的Enity也纳入到查询结果中。使用自定义EnityQuery可以过滤掉这些结果。
然后把结果传给调用IJob的调度时的Schedule带EntityQuery的重载函数中去。
具体可以查看对应的文档,下面仅仅列出两个实例。
在这里插入图片描述
在这里插入图片描述

总结

五种遍历查询的方式,主要使用System.API+ForEach,IJobEntity,IJobChunk的方式比较常用。同时,使用EnityQuery可以自定义结果来进行遍历。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值