[Unity3D] 5.0 图集合并扩展工具,用于解决UGUI与AssetBundle打包造成资源包过大的问题

来源:互联网 发布:mysql.sock 不存在 编辑:程序博客网 时间:2024/05/29 12:29
UGUI Image已Sprite为主,而简单的合并图集可以使用自带的SpritePacker。
而当在使用AssetBundle的时候情况有些不同,会造成每个AB都会引入完整的Sprite图集,显然就增加了AB的大小,重复资源。
为了解决这个问题我们可以手动合并图集,那么方案也有多种,这里我们可以编辑器自带的API来实现一个小的图集合并工具。
 private static bool CombineSpritesHelper(string path, string dpath, string name, int padding)
    
{
        
string[] paths = AssetDatabase.FindAssets("t:sprite"new string[] { path });
        List
<Sprite> spriteList = new List<Sprite>();
        List
<Texture2D> texList = new List<Texture2D>();

        
foreach (var o in paths)
        
{
            Sprite s 
= AssetDatabase.LoadAssetAtPath(AssetDatabase.GUIDToAssetPath(o), typeof(Sprite)) as Sprite;
            
if (null != s)
            
{
                spriteList.Add(s);
                texList.Add(s.texture);
            }

        }


        
if (texList.Count > 0)
        
{
            Texture2D tex 
= new Texture2D(10241024, TextureFormat.ARGB32, true);
            Rect[] uvs 
= UITexturePacker.PackTextures(tex, texList.ToArray(), 44, padding, 1024);
            
if (null == uvs)
            
{
                EditorUtility.DisplayDialog(path, 
"图集超过1024,需要分组成多张图集""点击退出");
                Object.DestroyImmediate(tex);
                tex 
= null;
                
return false;
            }

            
else
            
{
                List
<SpriteMetaData> metaList = new List<SpriteMetaData>();
                
for (int i = 0; i < uvs.Length; ++i)
                
{
                    SpriteMetaData data 
= new SpriteMetaData();
                    data.alignment 
= (int)SpriteAlignment.Center;
                    data.border 
= spriteList[i].border;
                    data.name 
= spriteList[i].name;
                    data.pivot 
= spriteList[i].pivot;
                    data.rect 
= new Rect(uvs[i].x * tex.width, uvs[i].y * tex.height, uvs[i].width * tex.width, uvs[i].height * tex.height);
                    metaList.Add(data);
                }


                
//string dpath = path.Substring(0, path.Length - obj.name.Length) + "SpriteSet";
                if (!System.IO.Directory.Exists(dpath))
                
{
                    System.IO.Directory.CreateDirectory(dpath);
                }


                
string file = dpath + "/" + name + ".png";
                
if (System.IO.File.Exists(file))
                
{
                    System.IO.File.Delete(file);
                }

                System.IO.File.WriteAllBytes(file, tex.EncodeToPNG());

                AssetDatabase.ImportAsset(file, ImportAssetOptions.ForceUpdate);
                TextureImporter importer 
= AssetImporter.GetAtPath(file) as TextureImporter;
                importer.spritesheet 
= metaList.ToArray();
                importer.spriteImportMode 
= SpriteImportMode.Multiple;
                importer.textureType 
= TextureImporterType.Sprite;
                importer.textureFormat 
= TextureImporterFormat.ARGB32;
                importer.mipmapEnabled 
= true;
                importer.mipmapFilter 
= TextureImporterMipFilter.BoxFilter;
                importer.assetBundleName 
= "ui_image/" + name.ToLower();
                AssetDatabase.ImportAsset(file);
                AssetDatabase.Refresh();
            }

        }

        
return true;
    }


    [MenuItem(
"Tool/Combine Sprites")]
    [MenuItem(
"Assets/Tool/Combine Sprites")]
    
public static void CombineSprites()
    
{
        EditorUtility.DisplayProgressBar(
"Combine Sprites""Initializing "0);
        
try
        
{
            Object obj 
= Selection.activeObject;
            
string path = AssetDatabase.GetAssetPath(obj.GetInstanceID());
            
string dpath = path.Substring(0, path.Length - obj.name.Length) + "SpriteSet";

            
if (System.IO.Directory.Exists(path))
            
{
                
string[] directories = System.IO.Directory.GetDirectories(path);
                
int count = 0;
                
if (directories.Length > 0)
                
{
                    
foreach (var directory in directories)
                    
{
                        count
++;
                        EditorUtility.DisplayProgressBar(
"Combine Sprites"string.Format("combing {0}", count), (float)(count) / (directories.Length));
                        
if (!CombineSpritesHelper(directory, dpath, string.Concat(obj.name, "_", count.ToString()), 1))
                        
{
                            
break;
                        }

                    }

                }

                
else
                
{
                    EditorUtility.DisplayProgressBar(
"Combine Sprites""combing 0"1);
                    CombineSpritesHelper(path, dpath, obj.name, 
1);
                }

            }

        }

        
catch (System.Exception e)
        
{
            Debug.LogError(e);
        }

        EditorUtility.ClearProgressBar();
    }

使用方法很简单,可以修改源码中的路径,可以将多个Single Sprite合成一个Multi Sprite。然后在供,UGUI使用,注意最好保存好合并前的源文件,不然可能造成新增图片打图集后对应不上从而造成引用丢失。
0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 手绘板连接电脑绘画有点迟钝怎么办 走路不小心滑了一下特尴尬怎么办 小孩子头撞了头发长不出来怎么办 小孩子头磕破了不长头发怎么办 晚上洗了冷水头早上头痛怎么办 头发洗了一天就油了怎么办 米诺地尔搽剂喷了头皮油怎么办 头发可以种植吗如果是秃顶怎么办 前额头发少怎么办如何使头发增多 头发又细又软又少怎么办 宝宝一岁了头发又少又黄怎么办 生完孩子头发掉的厉害怎么办 洗完头发后头发很蓬松怎么办 头发掉的厉害怎么办吃什么好得快 头发掉的很厉害怎么办吃什么好 我头发掉的厉害怎么办吃什么药 头发干枯毛躁掉发怎么办吃什么 最近洗头时头发掉的厉害怎么办 生完小孩头发掉的厉害怎么办 生完小孩后头发掉的厉害怎么办 生完孩子后严重掉头发怎么办 生过孩子后掉头发严重怎么办 孩孑16岁了高中没考上怎么办 小孩的嘴巴里有点点该怎么办 小孩从出生哭笑嘴巴有点歪怎么办 儿童耳朵受伤后嘴巴歪了怎么办 手机锁屏图案忘了怎么办求解锁 忘给仓鼠买吃的了怎么办 两岁宝宝不爱吃饭只喝奶粉怎么办 下载百度云压缩包要提取密码怎么办 微信表情包图片过大无法添加怎么办 管理员吧群员全部踢了群主怎么办 微信笑脸表情斗图文字没有了怎么办 钨珠钢笔头用完笔墨了怎么办 暴走大事件被禁六一红鼻子节怎么办 弯腰推东西把腰闪了怎么办 怀孕初期弯腰捡东西腰不舒服怎么办 突然弯腰捡东西腰闪了怎么办 跑步机上的磁铁掉了怎么办 微信解封辅助申诉信息不一致怎么办 穿越火线进游戏字体变小了怎么办