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

本文介绍了一个Unity3D 5.0的图集合并扩展工具,该工具旨在解决UGUI和AssetBundle打包过程中产生的资源包过大的问题,以优化内存使用和提高加载效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

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

http://www.cppblog.com/shly/archive/2015/12/09/212443.html

 

 

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

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(1024, 1024, TextureFormat.ARGB32, true);
            Rect[] uvs = UITexturePacker.PackTextures(tex, texList.ToArray(), 4, 4, 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;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值