Пример #1
0
    /// <summary>
    /// 根据在AtlasDatabase中的数据判断是否压缩过
    /// </summary>
    /// <param name="path">atlas的prefab文件路径</param>
    /// <returns>若db中不存在该路径则返回false,表示没有被压缩过;若db存在该路径,则判断其isOriginal属性</returns>
    public static bool AtlasAlreadyShrinked(string path)
    {
        AtlasProperty ap = db.GetAtlasProperty(path);

        if (ap == null)
        {
            return(false);
        }
        return(!ap.isOriginal);
    }
Пример #2
0
    /// <summary>
    /// 搜集项目中的atlas以及贴图资源显示在文件列表中
    /// </summary>
    public static void CollectAtlas()
    {
        string baseDir = Application.dataPath.Substring(0, Application.dataPath.IndexOf("Assets")) + "Assets/MLDJ";

        GameObject[]      prefabs     = BobShrinker.GetPrefabListUsingFileSys(baseDir);
        List <GameObject> prefabsList = new List <GameObject>(prefabs);

        GameObject[] atlaslist = BobShrinker.GetUIAtlasListFromPrefabList(prefabs);
        for (int i = 0; i < atlaslist.Length; i++)
        {
            BobUtils.DisplayProgressBar(i, atlaslist.Length, "搜集UIAtlas", atlaslist[i].name);
            string atlaspath = AssetDatabase.GetAssetPath(atlaslist[i]);
            if (!BobShrinker.db.ContainsPath(atlaspath))
            {
                AtlasProperty originalAtlasProp = BobShrinker.GetAtlasProperty(atlaslist[i].GetComponent <UIAtlas>(), true);
                BobShrinker.db.SaveAtlasData(atlaspath, originalAtlasProp, originalAtlasProp);
            }
            prefabsList.Remove(atlaslist[i].gameObject);
        }

        BobUtils.ClearProgressBar();
        Object[] dependencies = EditorUtility.CollectDependencies(prefabsList.ToArray());
        for (int i = 0; i < dependencies.Length; i++)
        {
            if (dependencies[i] is Texture2D)
            {
                BobUtils.DisplayProgressBar(i, dependencies.Length, "搜集Textures", dependencies[i].name);
                string texturePath = AssetDatabase.GetAssetPath(dependencies[i]);
                if (!BobShrinker.db.ContainsPath(texturePath))
                {
                    TextureImporter ti = TextureImporter.GetAtPath(texturePath) as TextureImporter;
                    if (ti == null)
                    {
                        Debug.LogError(texturePath);
                        continue;
                    }
                    int maxTextSize          = 0;
                    TextureImporterFormat tf = new TextureImporterFormat();
                    bool ret = ti.GetPlatformTextureSettings("WP8", out maxTextSize, out tf);//获取WP8的平台设置
                    if (ret == false)
                    {
                        maxTextSize = ti.maxTextureSize;
                        ti.SetPlatformTextureSettings("WP8", maxTextSize, ti.textureFormat); //若没有设置WP8平台,则用default的设置来设置
                    }
                    //备份原始属性
                    TextureProperty originalTextureProp = new TextureProperty(maxTextSize, ti.mipmapEnabled);
                    originalTextureProp.isOriginal = true;
                    BobShrinker.db.SaveTextureData(texturePath, originalTextureProp, originalTextureProp);
                }
            }
        }
        BobUtils.ClearProgressBar();
    }
Пример #3
0
    /// <summary>
    /// 设置Atlas数据
    /// </summary>
    /// <param name="path"></param>
    /// <param name="origin"></param>
    /// <param name="cur"></param>
    public void SaveAtlasData(string path, AtlasProperty origin, AtlasProperty cur)
    {
        int _index = mAtlasPaths.IndexOf(path);

        if (_index == -1)
        {
            mAtlasPaths.Add(path);
            mAtlasOriginalInfoList.Add(origin);
            mAtlasCurrentInfoList.Add(cur);
        }
        else
        {
            mAtlasOriginalInfoList[_index] = origin;
            mAtlasCurrentInfoList[_index]  = cur;
        }
    }
Пример #4
0
    /// <summary>
    /// 压缩UIAtlas
    /// </summary>
    /// <param name="uiatlasobj"></param>
    /// <returns></returns>
    public static ShrinkResult ShrinkAtlas(Object uiatlasobj)
    {
        AtlasProperty originalAtlasProp = null;
        ShrinkResult  ret = prepareShrinkAtlas(uiatlasobj, ref originalAtlasProp);

        if (ret != ShrinkResult.Success)
        {
            return(ret);
        }

        UIAtlas             uiatlas = ((GameObject)uiatlasobj).GetComponent <UIAtlas>();
        BetterList <string> sl      = uiatlas.GetListOfSprites();

        //备份原始尺寸
        originalAtlasProp = GetAtlasProperty(uiatlas, true);

        float times = 2f;

        uiatlas.scale /= times;

        foreach (string sn in sl)
        {
            UISpriteData sd = uiatlas.GetSprite(sn);
            sd.x      /= (int)times;
            sd.y      /= (int)times;
            sd.width  /= (int)times;
            sd.height /= (int)times;

            sd.borderBottom /= (int)times;
            sd.borderLeft   /= (int)times;
            sd.borderRight  /= (int)times;
            sd.borderTop    /= (int)times;

            sd.paddingTop    /= (int)times;
            sd.paddingBottom /= (int)times;
            sd.paddingLeft   /= (int)times;
            sd.paddingRight  /= (int)times;
        }
        uiatlas.pixelSize *= times;
        uiatlas.MarkAsDirty();

        AtlasProperty currentAtlasProp = GetAtlasProperty(uiatlas);

        SaveAtlasData(uiatlas, originalAtlasProp, currentAtlasProp);

        return(ShrinkResult.Success);
    }
Пример #5
0
    /// <summary>
    /// 为压缩uiatlas做准备,包括压缩贴图及备份原始数据
    /// </summary>
    /// <param name="uiatlasobj"></param>
    /// <param name="originalAtlasProp">用于存储uiatlas的原始数据</param>
    /// <returns></returns>
    private static ShrinkResult prepareShrinkAtlas(Object uiatlasobj, ref AtlasProperty originalAtlasProp)
    {
        UIAtlas uiatlas   = ((GameObject)uiatlasobj).GetComponent <UIAtlas>();
        string  assetPath = AssetDatabase.GetAssetPath(uiatlas.gameObject);

        if (AtlasAlreadyShrinked(assetPath))
        {//已经处理过
            return(ShrinkResult.Success);
        }

        if (null == uiatlas.spriteMaterial || null == uiatlas.spriteList)
        {
            return(ShrinkResult.Failure);
        }

        BetterList <string> sl = uiatlas.GetListOfSprites();

        if (sl == null)
        {
            return(ShrinkResult.Failure);
        }

        //先把纹理都缩了
        Object[]         dependObjs  = new Object[] { uiatlas.spriteMaterial.mainTexture }; //EditorUtility.CollectDependencies(new Object[] { uiatlas.gameObject }); //获取依赖的资源
        List <Texture2D> textureList = new List <Texture2D>();

        for (int i = 0; i < dependObjs.Length; i++)
        {//搜集依赖的纹理资源
            if (dependObjs[i] is Texture2D)
            {
                textureList.Add(dependObjs[i] as Texture2D);
            }
        }
        for (int index = 0; index < textureList.Count; ++index)
        {
            ShrinkResult sret = ShrinkTexture(textureList[index]);
            if (sret != ShrinkResult.Success)
            {
                RecoverUIAtlasFromMeta(uiatlasobj);
                return(ShrinkResult.Failure);
            }
        }


        return(ShrinkResult.Success);
    }
Пример #6
0
    /// <summary>
    /// 获取Atlas的属性信息保存在AtlasProperty中
    /// </summary>
    /// <param name="uiatlas"></param>
    /// <param name="isOriginal">指定这一属性是否是原始属性</param>
    /// <returns>返回的AtlasProperty中包含了uiatlas的属性</returns>
    public static AtlasProperty GetAtlasProperty(UIAtlas uiatlas, bool isOriginal = false)
    {
        AtlasProperty atlasProp = new AtlasProperty();
        Vector4       spd, spb, spp;

        foreach (string sn in uiatlas.GetListOfSprites())
        {
            UISpriteData sd = uiatlas.GetSprite(sn);
            spd = new Vector4(sd.x, sd.y, sd.width, sd.height);
            spb = new Vector4(sd.borderLeft, sd.borderRight, sd.borderBottom, sd.borderTop);
            spp = new Vector4(sd.paddingLeft, sd.paddingRight, sd.paddingBottom, sd.paddingTop);
            SpriteDetail sddd = new SpriteDetail(spd, spb, spp);
            atlasProp.AddSpriteDetail(sddd);
        }
        atlasProp.scale      = uiatlas.scale;
        atlasProp.pixelSize  = uiatlas.pixelSize;
        atlasProp.isOriginal = isOriginal;
        return(atlasProp);
    }
Пример #7
0
    /// <summary>
    /// 显示第index个Atlas的属性
    /// </summary>
    /// <param name="index"></param>
    private void ShowAtlasProperty(int index)
    {
        GUILayout.Label(BobShrinker.db.mAtlasPaths[index]);
        List <SpriteDetail> originalSpriteDetails = BobShrinker.db.mAtlasOriginalInfoList[index].SpriteDetails;
        List <SpriteDetail> currentSpriteDetails  = BobShrinker.db.mAtlasCurrentInfoList[index].SpriteDetails;
        AtlasProperty       originAtlas           = BobShrinker.db.mAtlasOriginalInfoList[index];
        AtlasProperty       currentAtlas          = BobShrinker.db.mAtlasCurrentInfoList[index];

        GUILayout.Label("origin: " + originAtlas.pixelSize + " " + originAtlas.scale);
        GUILayout.Label("current: " + currentAtlas.pixelSize + " " + currentAtlas.scale);
        for (int i = 0; i < originalSpriteDetails.Count; i++)
        {
            GUILayout.Label(i.ToString() + " original Detail ");
            GUILayout.Label("    Demension: " + originalSpriteDetails[i].Demension.ToString());
            GUILayout.Label("    Padding: " + originalSpriteDetails[i].Padding.ToString());
            GUILayout.Label("    Border: " + originalSpriteDetails[i].Border.ToString());

            GUILayout.Label(i.ToString() + " current Detail ");
            GUILayout.Label("    Demension: " + currentSpriteDetails[i].Demension.ToString());
            GUILayout.Label("    Padding: " + currentSpriteDetails[i].Padding.ToString());
            GUILayout.Label("    Border: " + currentSpriteDetails[i].Border.ToString());
        }
    }
Пример #8
0
    /// <summary>
    /// 回复UIAtlas
    /// </summary>
    /// <param name="uiatlas"></param>
    public static void RecoverUIAtlasFromMeta(Object uiatlasobj)
    {
        UIAtlas uiatlas   = ((GameObject)uiatlasobj).GetComponent <UIAtlas>();
        string  assetpath = AssetDatabase.GetAssetPath(uiatlas.gameObject);

        if (null == uiatlas.spriteMaterial || null == uiatlas.spriteList)
        {
            return;
        }
        //先把纹理都恢复了
        Object[]         dependObjs  = new Object[] { uiatlas.spriteMaterial.mainTexture };//获取纹理
        List <Texture2D> textureList = new List <Texture2D>();

        for (int i = 0; i < dependObjs.Length; i++)
        {
            if (dependObjs[i] is Texture2D)
            {
                textureList.Add(dependObjs[i] as Texture2D);
            }
        }

        for (int i = textureList.Count - 1; i >= 0; --i)
        {
            try
            {
                RecoverTextureFromMeta(textureList[i]);
            }
            catch (System.Exception e)
            {
                Debug.Log(e.ToString() + " " + textureList[i].name);
            }
        }

        if (!AtlasAlreadyShrinked(assetpath))
        {//并未缩减过,则不对它进行操作
            return;
        }
        AtlasProperty afterAtlasPro = db.GetAtlasProperty(AssetDatabase.GetAssetPath(uiatlas.gameObject), true);

        uiatlas = ((GameObject)uiatlasobj).GetComponent <UIAtlas>();
        BetterList <string> sl = uiatlas.GetListOfSprites();

        if (sl == null)
        {
            return;
        }
        uiatlas.scale     = afterAtlasPro.scale;
        uiatlas.pixelSize = afterAtlasPro.pixelSize;
        for (int i = 0; i < afterAtlasPro.SpriteDetails.Count; i++)
        {
            UISpriteData sd  = uiatlas.GetSprite(sl[i]);
            SpriteDetail spd = afterAtlasPro.SpriteDetails[i];

            sd.x      = (int)spd.Demension.x;
            sd.y      = (int)spd.Demension.y;
            sd.width  = (int)spd.Demension.z;
            sd.height = (int)spd.Demension.w;

            sd.borderLeft   = (int)spd.Border.x;
            sd.borderRight  = (int)spd.Border.y;
            sd.borderBottom = (int)spd.Border.z;
            sd.borderTop    = (int)spd.Border.w;

            sd.paddingLeft   = (int)spd.Padding.x;
            sd.paddingRight  = (int)spd.Padding.y;
            sd.paddingBottom = (int)spd.Padding.z;
            sd.paddingTop    = (int)spd.Padding.w;
        }
        uiatlas.MarkAsDirty();
        AtlasProperty currentAtlas = GetAtlasProperty(uiatlas, true);

        SaveAtlasData(uiatlas, afterAtlasPro, currentAtlas);
    }
Пример #9
0
 /// <summary>
 /// 保存uiatlas改变前后的信息
 /// </summary>
 /// <param name="uiatlas"></param>
 /// <param name="originalAtlasProp"></param>
 /// <param name="currentAtlasProp"></param>
 private static void SaveAtlasData(UIAtlas uiatlas, AtlasProperty originalAtlasProp, AtlasProperty currentAtlasProp)
 {
     db.SaveAtlasData(AssetDatabase.GetAssetPath(uiatlas.gameObject), originalAtlasProp, currentAtlasProp);
     EditorUtility.SetDirty(db);
 }
Пример #10
0
    /// <summary>
    /// 添加单个文件路径
    /// </summary>
    /// <param name="filepath"></param>
    private void AddFileItems(string filepath)
    {
        filepath = filepath.Replace('\\', '/');
        Object obj = AssetDatabase.LoadAssetAtPath(filepath, typeof(UnityEngine.Object));

        if (obj == null)
        {
            return;
        }

        if (!System.IO.File.Exists(filepath) && System.IO.Directory.Exists(filepath))
        {///如果是目录,则遍历其中的所有文件
            string[] files = System.IO.Directory.GetFiles(filepath, "*.*", System.IO.SearchOption.AllDirectories);
            for (int i = 0; i < files.Length; ++i)
            {
                AddFileItems(files[i]);
            }
            return;
        }
        if (obj is Texture)
        {
            if (BobShrinker.db.mTexturePaths.Contains(filepath))
            {
                return;
            }
            else
            {
                TextureImporter ti = TextureImporter.GetAtPath(filepath) as TextureImporter;
                if (ti == null)
                {
                    return;
                }
                BobUtils.DisplayProgressBar(1, 1, "添加文件", filepath);
                int maxTextSize          = 0;
                TextureImporterFormat tf = new TextureImporterFormat();
                bool ret = ti.GetPlatformTextureSettings("WP8", out maxTextSize, out tf);//获取WP8的平台设置
                if (ret == false)
                {
                    maxTextSize = ti.maxTextureSize;
                    ti.SetPlatformTextureSettings("WP8", maxTextSize, ti.textureFormat); //若没有设置WP8平台,则用default的设置来设置
                }
                //备份原始属性
                TextureProperty originalTextureProp = new TextureProperty(maxTextSize, ti.mipmapEnabled);
                originalTextureProp.isOriginal = true;
                BobShrinker.db.SaveTextureData(filepath, originalTextureProp, originalTextureProp);
            }
        }
        if (obj is GameObject)
        {
            GameObject go      = obj as GameObject;
            UIAtlas    uiatlas = go.GetComponent <UIAtlas>();
            if (uiatlas != null)
            {
                if (BobShrinker.db.mAtlasPaths.Contains(filepath))
                {
                    return;
                }
                else if (uiatlas.spriteMaterial == null)
                {
                    Debug.LogError(filepath + " has no materials");
                    return;
                }
                else
                {
                    BobUtils.DisplayProgressBar(1, 1, "添加文件", filepath);
                    AtlasProperty originalAtlasProp = BobShrinker.GetAtlasProperty(uiatlas, true);
                    BobShrinker.db.SaveAtlasData(filepath, originalAtlasProp, originalAtlasProp);
                }
            }

            List <string> dependencies = BobUtils.CollectDependencies(filepath);//获取依赖资源 接着AddItems
            for (int i = 0; i < dependencies.Count; ++i)
            {
                AddFileItems(dependencies[i]);
            }
        }
    }