赞
踩
遍历查询数据,应该是游戏逻辑中最为普遍也最为重要的逻辑。毕竟只有找到你需要的数据之后,你才会去修改,删除他们。
一般的逻辑步骤:先查找到一大片符合你要求的数据集合,然后再遍历这些集合中的数据,然后根据你的算法或者要求去更新、计算这些数据。
注意:SystemAPI,只能在System中调用,同时Query的结果不能保存为一个变量来实现重用。
结合了Job系统使用的一种隐式的查询方法。在一个JOB中通过Excute指定对应的查询条件,然后DOTS会帮我们按这些条件查询到对应的Entity,每个Entity来执行一次这个JOB的Excute方法。
底层使用的是IJOBChunk(即:找到符合条件的ArcheType,再找到里面包含的Chunck,然后根据Chunk里面的Entity来执行这个JOB的Excute方法)
构造IJobEntity的Job时,可以添加下面这些标签特性(Attributes)到不同的位置来修改对应的查询结果。
在对应的JOB中的Excute函数可以传入不同的参数来实现不同的功能
实现针对每一个符合的ArcheType的所有Chunk执行一次Excute函数。
备注:IJobEnity,以及Enities.ForEach,会自动跳过EnableComponent状态不匹配的结果,而IJobChunk需要使用useEnableMask与ChunkEnableMask来过滤EnableComponent状态不匹配的结果。
IJOBChunk使用起来更为复杂,除非一些特殊情况:比如要对Chunk中所有Entity进行处理,或者需要以特殊的方式去遍历Chunk中的数据。
使用方式:
Entities.ForEach只能用于继承与SystemBase的System,用得比较少。
使用EntityManger的GetAllEnities()与GetAllChunks(),然后结合ForEach来使用,性能比较差。
这两种方式很少使用,就不详细深究了。
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可以自定义结果来进行遍历。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。