生成方体,对应的函数接口,可以看到,方体是存放在mRectangleStack队列容器里的

通过freeRectangle函数接口,加到对应的这个,方体队列容器

同理,图片大小排序相关,也是有队列容器mSortableSizeStack,和相关的函数接口,完成新增

打包方体的汇总类,声明的变量,除了之前提及的,各个队列容器,还有宽高,图片间距相关的参数声明

构造函数,会调用Reset重置函数

这是图集里的,空余区域容器,在上述重置函数,也有调用allocateRectangle函数,往这个空余区域,Add添加方体元素

弄一个getFreeAreaIndex函数接口,从空余区域容器,拿到对应可用的index索引

后半部分的else逻辑,最后返回空余空间mFreeAreas的index索引即可

弄一个filterSelfSubAreas函数,用来重新修整,排序传参areas队列区域其中的元素

根据区域位置,往IntegerRectangle队列容器特定位置宽度,添加数据

创建划分一个新的空余区域,相关逻辑,就是调用上述解析接口即可

打包方体,相关的逻辑,需要先基于SortableSize的队列容器mInsertList,宽度排序; 然后整空余区域,相关逻辑,拿到索引,新增方体,插入空余区域空间;

后半部分逻辑,继续调整宽度相关,然后释放,排序队列容器

从方体队列容器,通过index索引,拿到对应的的参数相关,对传参进来的IntegerRectangle方体,完成参数修改,再传回去即可

整一个拿方体id的接口

AssetPacker类,是外部调用的类; 有一个OnProcessCompleted获取器,是用来获取,打包图集完成之后,触发的回调函数; 还有pixelsPerUnit相关,cache缓存相关,mSprite图片字典容器,itemsToRaster纹理打包相关TextureToPack队列容器; 是否开启4096尺寸的allow4096Textures布尔;

添加纹理贴图打包相关,到itemsToRaster队列容器

创建动态图集的createPack函数接口,先参考【Unity】数据持久化路径Application.persistentDataPath,判断对应的AssetPacker目录下,是否已经存在,动态图集缓存,如果存在,就先删除即可; 然后,弄两个队列容器,分别用来存储纹理贴图,还有打包id相关的队列,这里的打包id,对应的是ShowName枚举; 弄一个rect方体队列rectangles,遍历纹理贴图队列,使用纹理贴图,对应的宽高,完成方体队列的数据新增; padding是间距,用来处理后续逻辑,创建打包图集方体相关

继续逻辑,用while死循环,遍历上述基于纹理贴图,完成数据新增的方体队列; 创建新的Texture2D纹理贴图,通过GetPixels32拿到对应的像素数组,先clear清空,像素颜色数组; 然后,基于纹理贴图的宽高,和上述padding间距,创建打包相关的RectanglePacker方体,完成方体队列的插入,划分空余区域划分,相关逻辑; 调用SetPixels32接口,完成像素颜色赋值;

继续逻辑,遍历打包相关的,方体队列总数,通过getRectangle和getRectangleId接口,拿到对应方体索引,配合纹理队列容器,继续完成纹理贴图的,像素颜色赋值; 完成纹理预制相关的TextureAsset新增和赋值,再完成相关队列容器的增减逻辑; 调用Texture2D.Apply()方法应用设置的像素,这样纹理就可以显示出半透明的效果了;

继续逻辑,最后,把完成处理的纹理贴图,也就是对应,总动态图集的texture,通过EncodeToPNG接口,设置成PNG格式,再通过List的toArray()方法把该纹理贴图转成数组,以json的形式,存储起来; 遍历纹理预制,通过Sprite.Create方法,完成mSprites图片资源容器的,元素新增填充; 打包图集后,通过Invoke方法,调用对应的,回调函数OnProcessCompleted即可;

以上,是创建动态图集createPack的协程逻辑