obsidian/笔记文件/2.笔记/UGUI整体解决方案-优化篇_第二章.md
2025-03-26 00:02:56 +08:00

4.8 KiB
Raw Permalink Blame History

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

!Pasted image 20240403114346.png

!Pasted image 20240403114506.png

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

!Pasted image 20240403114616.png

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

!Pasted image 20240403114754.png

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

!Pasted image 20240403114951.png

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

!Pasted image 20240403115214.png

!Pasted image 20240403115151.png

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

!Pasted image 20240403115754.png

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

!Pasted image 20240403120028.png

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

!Pasted image 20240403120200.png

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

!Pasted image 20240403120541.png

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

!Pasted image 20240403121128.png

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

!Pasted image 20240403121803.png

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

!Pasted image 20240403121946.png

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

!Pasted image 20240403124843.png

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

!Pasted image 20240403125211.png

整一个拿方体id的接口

!Pasted image 20240403125534.png

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

!Pasted image 20240403125840.png

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

!Pasted image 20240403131014.png

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

!Pasted image 20240403131300.png

!Pasted image 20240403131844.png

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

!Pasted image 20240403132321.png

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

!Pasted image 20240403133453.png

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

!Pasted image 20240403133932.png

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