zoukankan      html  css  js  c++  java
  • NGUI查找未使用图集、未使用精灵及名字重复的精灵

    1.遍历atlasPath目录,找到需要处理的所有图集。
    2.查找ui预制体目录,查找目录下的预制体的所有UISprite组件,获取该组件的图集、spriteName属性,设置图集的使用次数情况。
    3.输出unuseAtlas、unuseSprites、duplicateSprites三个数组,并写入到Assets/UnuseAtlas.json文件中。
    /// <summary>
        /// 查找名字重复、未使用的图集和精灵
        /// 只查询预制体直接引用,不考虑配置表引用
        /// </summary>
        [MenuItem("Tools/查找未使用的图集和精灵")]
        public static void FindUnusualAltas() 
        {
            Dictionary<INGUIAtlas, Dictionary<string, int>> atlasInfo = new Dictionary<INGUIAtlas, Dictionary<string, int>>();
            string[] atlasPath = new string[] { "Assets/Design/Interface/Atlas"};    // TODO 指定项目里图集的父节点 需修改
            string[] uiPrefabsPath = new string[] { "Assets/Design/Interface/Prefab"};    // TODO 指定项目里ui预制体的父节点 需修改
            string[] rejectAtlas = new string[] {
                "bp_big_icon", "data_f", "int_achievements_", "int_atlas_clan_ico_2",
                "int_avatars", "int_boost", "int_frame","product_icon_atlas", "RankSmallIcon", "RankSmallIcon"
            };    // TODO 过滤图集,例如道具等在配置文件配置的图集 需修改
            
            string[] atlasGuids = AssetDatabase.FindAssets("t:NGUIAtlas", atlasPath);
            Dictionary<string, List<string>> spriteNameDic = new Dictionary<string, List<string>>();
            
            if (atlasGuids!= null && atlasGuids.Length > 0)
            {
                foreach (string  guid in atlasGuids)
                {
                    string path = AssetDatabase.GUIDToAssetPath(guid);
                    NGUIAtlas obj = AssetDatabase.LoadAssetAtPath(path, typeof(NGUIAtlas)) as NGUIAtlas;
    
                    if (obj) {
                        string atlaName = obj.name;
                        bool isReject = false;
    
                        foreach (var reject in rejectAtlas) {
                            if (atlaName.Contains(reject)) {
                                isReject = true;
                                break;
                            }
                        }
                        
                        if (isReject) continue;
    
                        List<UISpriteData> spriteList = obj.spriteList;
    
                        if (spriteList != null && spriteList.Count > 0) {
                            Dictionary<string, int> spriteDic = new Dictionary<string, int>();
                            for (int i = 0; i < spriteList.Count - 1; i++) {
                                string spriteName = spriteList[i].name;
                                spriteDic.Add(spriteName, 0);
    
                                List<string> nameList;
                                if (spriteNameDic.TryGetValue(spriteName, out nameList)) {
                                    nameList.Add(obj.name);
                                } else {
                                    nameList = new List<string>{obj.name};
                                    spriteNameDic.Add(spriteName, nameList);
                                }
                            }
                        
                            atlasInfo.Add(obj, spriteDic);
                        }
                    }
                }
            }
            
            string[] guids = AssetDatabase.FindAssets("t:Prefab", uiPrefabsPath);
            
            if (guids!= null && guids.Length > 0)
            {
                EditorUtility.DisplayProgressBar("Find...", "Start handle", 0);
                int progress = 0;
                foreach (string  guid in guids)
                {
                    progress++;
                    string path = AssetDatabase.GUIDToAssetPath(guid);
                    GameObject obj = AssetDatabase.LoadAssetAtPath(path, typeof(GameObject)) as GameObject;
                    
                    UISprite[] sprites = obj.GetComponentsInChildren<UISprite>(true);
                    foreach (UISprite item in sprites) {
                        Dictionary<string, int> spriteDic;
                        if (item.atlas != null && atlasInfo.TryGetValue(item.atlas, out spriteDic)) {
                            string spriteName = item.spriteName;
                            int useTimes = 0;
                            
                            if (!string.IsNullOrEmpty(spriteName) && spriteDic.TryGetValue(spriteName, out useTimes)) 
                            {
                                spriteDic[spriteName] = useTimes + 1;
                            }
                        }
                    }
                    
                    EditorUtility.ClearProgressBar();
                }
            }
            
            List<string> unuseAtlas = new List<string>();//没有用到的图集
            List<string> unuseSprites = new List<string>();//图集内没有用到的精灵
            List<string> duplicateSprites = new List<string>();//重复的图片名字
    
            foreach (var atlaInfo in atlasInfo) {
                int useTimes = 0;
                string atlaName = (atlaInfo.Key as NGUIAtlas).name;
    
                foreach (var spriteInfo in atlaInfo.Value) 
                {
                    if (spriteInfo.Value == 0) {
                        unuseSprites.Add(string.Format("未用到精灵 图集:{0}, 精灵:{1}", atlaName, spriteInfo.Key));
                    }
    
                    useTimes += spriteInfo.Value;
                }
    
                if (useTimes == 0) {
                    unuseAtlas.Add(string.Format("未用到图集:{0}", atlaName));
                }
            }
    
            foreach (var nameList in spriteNameDic) {
                string duplacateStr = "";
                if (nameList.Value != null && nameList.Value.Count > 2) 
                {
                    for (int i = 0; i < nameList.Value.Count - 1; i++) {
                        duplacateStr += nameList.Value[i] + ", ";
                    }
                    
                    duplicateSprites.Add(string.Format("重复的精灵名字, 精灵名:{0},所在图集:{1}", nameList.Key, duplacateStr));
                }
            }
    
            string line = "
    ";
            var sb = new StringBuilder();
            sb.Append("//图集检索
    ");
            sb.Append("//未使用图集列表
    ");
            sb.Append("unuseAtlas={
    ");
            unuseAtlas.ForEach(item => sb.Append(String.Format("    {0},
    ", item)));
            sb.Append("}
    ");
            
            sb.Append("//未使用精灵列表
    ");
            sb.Append("unuseSprites={
    ");
            unuseSprites.ForEach(item => sb.Append(String.Format("    {0},
    ", item)));
            sb.Append("}
    ");
            
            sb.Append("//命名重复精灵
    ");
            sb.Append("duplicateSprites={
    ");
            duplicateSprites.ForEach(item => sb.Append(String.Format("    {0}
    ", item)));
            sb.Append("}
    ");
            
            System.IO.File.WriteAllText(Path.Combine(Application.dataPath, "UnuseAtlas.json"), sb.ToString());
            
            GGDebug.Debug(sb.ToString());
            AssetDatabase.SaveAssets();
        }
    

     最终输出格式:

    //图集检索
    //未使用图集列表
    unuseAtlas={
        未用到图集:int_atlas_back_result,
        未用到图集:int_atlas_back_strategic,
        未用到图集:int_atlas_clan_ico_1,
        未用到图集:int_atlas_icons,
        未用到图集:int_bind_phone,
        未用到图集:int_boxes,
        未用到图集:int_direct_spawn,
        未用到图集:int_emblem_conf,
        未用到图集:int_emblem_res,
        未用到图集:int_header_images,
        未用到图集:int_ico_units_f2,
        未用到图集:int_medals,
        未用到图集:int_packs,
        未用到图集:int_panel_darken,
        未用到图集:int_person_f1_doc_minister,
        未用到图集:int_person_f1_general_colonnel,
        未用到图集:int_person_f1_secretary,
        未用到图集:int_person_f2_commander_tech,
        未用到图集:int_person_f2_general_saboteur,
        未用到图集:int_person_f2_infantry_moloh,
        未用到图集:int_ranks,
        未用到图集:int_ranks_atlas,
        未用到图集:panel_home_atlas,
        未用到图集:ready_battle_ Atlas,
    }
    //未使用精灵列表
    unuseSprites={
        未用到精灵 图集:Backpack_Atlas, 精灵:bg_03,
        未用到精灵 图集:Backpack_Atlas, 精灵:bg_tv,
        未用到精灵 图集:Backpack_Atlas, 精灵:ic_01,
        未用到精灵 图集:Backpack_Atlas, 精灵:ic_02_off,
        未用到精灵 图集:Backpack_Atlas, 精灵:ic_03_off,
        未用到精灵 图集:Backpack_Atlas, 精灵:ic_04,
        未用到精灵 图集:Backpack_Atlas, 精灵:ic_04_off,
        未用到精灵 图集:Backpack_Atlas, 精灵:ic_3,
        未用到精灵 图集:Backpack_Atlas, 精灵:ic_play ,
        未用到精灵 图集:mall, 精灵:btn_shop,
        未用到精灵 图集:mall, 精灵:common_txt,
        未用到精灵 图集:mall, 精灵:diamonds_ic,
        未用到精灵 图集:mall, 精灵:level_number_0,
        未用到精灵 图集:mall, 精灵:line_bg,
        未用到精灵 图集:mall, 精灵:lucky_bg09,
        未用到精灵 图集:mall, 精灵:lucky_bg12,
        未用到精灵 图集:mall, 精灵:lucky_bg21,
        未用到精灵 图集:mall, 精灵:mall_0,
        未用到精灵 图集:mall, 精灵:shop_bg01,
        未用到精灵 图集:mall, 精灵:shop_label02,
        未用到精灵 图集:rank_list, 精灵:ic_01,
        未用到精灵 图集:rank_list, 精灵:me_bg,
        未用到精灵 图集:rank_list, 精灵:size_02,
        未用到精灵 图集:RankBigIconAtlas, 精灵:ic_colonel_2,
        未用到精灵 图集:RankBigIconAtlas, 精灵:ic_colonel_3,
        未用到精灵 图集:RankBigIconAtlas, 精灵:ic_general_1,
        未用到精灵 图集:RankBigIconAtlas, 精灵:ic_general_2,
        未用到精灵 图集:RankBigIconAtlas, 精灵:ic_general_3,
        未用到精灵 图集:RankBigIconAtlas, 精灵:ic_greatMarshal,
        未用到精灵 图集:RankBigIconAtlas, 精灵:ic_greatMarshal_1,
        未用到精灵 图集:RankBigIconAtlas, 精灵:ic_greatMarshal_2,
        未用到精灵 图集:RankBigIconAtlas, 精灵:ic_honor,
        未用到精灵 图集:RankBigIconAtlas, 精灵:ic_honor_1,
        未用到精灵 图集:RankBigIconAtlas, 精灵:ic_lieutenant_2,
        未用到精灵 图集:RankBigIconAtlas, 精灵:ic_lieutenant_3,
        未用到精灵 图集:RankBigIconAtlas, 精灵:ic_marshal_1,
        未用到精灵 图集:RankBigIconAtlas, 精灵:ic_marshal_2,
        未用到精灵 图集:RankBigIconAtlas, 精灵:ic_marshal_3,
        未用到精灵 图集:RankBigIconAtlas, 精灵:ic_marshal_5,
        未用到精灵 图集:RankBigIconAtlas, 精灵:ic_sergeant_2,
        未用到精灵 图集:RankBigIconAtlas, 精灵:ic_sergeant_3,
        未用到精灵 图集:ranking_02, 精灵:btn_bank,
        未用到精灵 图集:ranking_02, 精灵:btn_bg02,
        未用到精灵 图集:ranking_02, 精灵:btn_x,
        未用到精灵 图集:ranking_02, 精灵:ic_bg,
        未用到精灵 图集:ranking_02, 精灵:ic_bg2,
        未用到精灵 图集:ranking_02, 精灵:xbg_01,
    }
    //命名重复精灵
    duplicateSprites={
        重复的精灵名字, 精灵名:bg_01,所在图集:Backpack_Atlas, battle_result, battle_ui, int_common_ui, int_daily_sign, int_mail, int_normal_battle, int_personal_info, int_record, panel_talent_atlas, ,
        重复的精灵名字, 精灵名:bg_02,所在图集:Backpack_Atlas, battle_result, battle_ui, int_activity, int_daily_sign, int_mail, int_normal_battle, int_record, login_atlas, panel_talent_atlas, ,
        重复的精灵名字, 精灵名:bg_03,所在图集:Backpack_Atlas, battle_ui, int_activity, int_daily_sign, int_mail, int_normal_battle, int_record, login_atlas, ,
        重复的精灵名字, 精灵名:ic_01,所在图集:Backpack_Atlas, battle_ui, int_clan, int_record, login_atlas, panel_talent_atlas, rank_list, ,
        重复的精灵名字, 精灵名:ic_02,所在图集:Backpack_Atlas, battle_ui, int_record, login_atlas, panel_talent_atlas, rank_list, ,
        重复的精灵名字, 精灵名:ic_04,所在图集:Backpack_Atlas, battle_ui, int_common_ui, int_record, login_atlas, panel_talent_atlas, ,
        重复的精灵名字, 精灵名:1,所在图集:battle_result, battle_ui, campaign_task, friend, int_common_ui, loading, product_big_icon, ,
        重复的精灵名字, 精灵名:2,所在图集:battle_result, battle_ui, campaign_task, friend, int_common_ui, loading, product_big_icon, ,
        重复的精灵名字, 精灵名:3,所在图集:battle_result, battle_ui, campaign_task, int_common_ui, loading, product_big_icon, ,
        重复的精灵名字, 精灵名:4,所在图集:battle_result, campaign_task, int_common_ui, ,
        重复的精灵名字, 精灵名:5,所在图集:battle_result, campaign_task, ,
    }
    

      

  • 相关阅读:
    Android控制软键盘的现实与隐藏
    Android调用手机浏览器
    DatePicker隐藏年/月/日
    ecplise中设置字符编码
    Git问题总结
    Git的简单使用
    资源
    equals和==
    class文件查看
    Class file collision
  • 原文地址:https://www.cnblogs.com/wang-jin-fu/p/13391156.html
Copyright © 2011-2022 走看看