少年修仙传客户端基础资源
client_Wu Xijin
2019-04-13 2e18fd3baad48b8d0de900a86f8fc73764e9f59a
3335 添加分析图片资源的工具.
1个文件已修改
246 ■■■■■ 已修改文件
Assets/Editor/Tool/WindowImageCheck.cs 246 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Assets/Editor/Tool/WindowImageCheck.cs
@@ -1,10 +1,16 @@
using System.Collections;
//------------------------------------------------------------------
//本文件中的工具提供在编辑器环境下,快速整理UI图片相关的资源
//-------------------------------------------------------------------
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEditor;
using UnityEngine.UI;
using System.IO;
using System;
using System.Threading;
using System.Text.RegularExpressions;
public class WindowImageCheck
{
@@ -77,3 +83,241 @@
    }
}
public class RemoveUnUsedSpriteQuickly
{
    static string uiroot1 = "Assets/ResourcesOut/UI/Window";
    static string uiroot2 = "Assets/ResourcesOut/UI/PriorityWindow";
    static string uiroot3 = "Assets/ResourcesOut/UI/Prefab";
    static string spriteroot = "Assets/ResourcesOut/UI/Sprite";
    static List<string> prefabTexts = new List<string>();
    static Dictionary<string, Sprite> processObjects = new Dictionary<string, Sprite>();
    static List<AnalyzeTask> tasks = new List<AnalyzeTask>();
    static int taskCount = 1;
    static int completedTaskCount = 0;
    static List<IconConfig> configs;
    [MenuItem("程序/移除无用的Sprite")]
    public static void RemoveUnUsedSprites()
    {
        try
        {
            EditorApplication.update += OnUpdate;
            IconConfig.Init(true);
            configs = IconConfig.GetValues();
            LoadPrefabTexts();
            FindSprites();
            taskCount = 0;
            completedTaskCount = 0;
            foreach (var task in tasks)
            {
                task.total = task.sprites.Count;
                taskCount += task.total;
            }
            Analyze();
        }
        catch (Exception e)
        {
            EditorApplication.update -= OnUpdate;
            EditorUtility.ClearProgressBar();
        }
    }
    static void LoadPrefabTexts()
    {
        var guids = new List<string>();
        guids.AddRange(AssetDatabase.FindAssets("Win t:prefab", new string[] { uiroot1 }));
        guids.AddRange(AssetDatabase.FindAssets("Win t:prefab", new string[] { uiroot2 }));
        guids.AddRange(AssetDatabase.FindAssets("Win t:prefab", new string[] { uiroot3 }));
        var assetPaths = new List<string>();
        foreach (var item in guids)
        {
            assetPaths.Add(AssetDatabase.GUIDToAssetPath(item));
        }
        prefabTexts.Clear();
        foreach (var path in assetPaths)
        {
            prefabTexts.Add(File.ReadAllText(Application.dataPath + path.Substring(6, path.Length - 6)));
        }
    }
    static void FindSprites()
    {
        processObjects.Clear();
        tasks.Clear();
        var sprites = new List<Sprite>();
        var guids = new List<string>();
        var subFolders = AssetDatabase.GetSubFolders(spriteroot);
        foreach (var folder in subFolders)
        {
            guids.AddRange(AssetDatabase.FindAssets("t:sprite", new string[] { folder }));
        }
        foreach (var guid in guids)
        {
            sprites.Add(AssetDatabase.LoadAssetAtPath<Sprite>(AssetDatabase.GUIDToAssetPath(guid)));
        }
        var count = 0;
        var task = new AnalyzeTask();
        tasks.Add(task);
        foreach (var asset in sprites)
        {
            var path = AssetDatabase.GetAssetPath(asset);
            var guid = AssetDatabase.AssetPathToGUID(path);
            processObjects[guid] = asset;
            var folderName = Path.GetDirectoryName(path).Split('/').GetLast();
            if (folderName == "Frame")
            {
                continue;
            }
            task.Add(new SpriteInfo()
            {
                name = asset.name,
                guid = guid,
                folder = folderName
            });
            count++;
            if (count >= 500)
            {
                count = 0;
                task = new AnalyzeTask();
                tasks.Add(task);
            }
        }
    }
    static void Analyze()
    {
        foreach (var task in tasks)
        {
            ThreadPool.QueueUserWorkItem(x =>
            {
                for (int i = 0; i < task.sprites.Count; i++)
                {
                    task.completed++;
                    var info = task.sprites[i];
                    if (ContainByIconTable(info))
                    {
                        continue;
                    }
                    if (RefrenceByPrefab(info))
                    {
                        continue;
                    }
                    info.unUsed = true;
                    task.sprites[i] = info;
                }
                task.done = true;
            });
        }
    }
    static void ProcessUnUsedSprites()
    {
        var total = 0;
        foreach (var task in tasks)
        {
            foreach (var sprite in task.sprites)
            {
                if (sprite.unUsed)
                {
                    //AssetDatabase.DeleteAsset(AssetDatabase.GUIDToAssetPath(sprite.guid));
                    Debug.LogFormat("找到一张无用的图片:文件夹->{0};图片名称->{1}", sprite.folder, sprite.name);
                    total++;
                }
            }
        }
        Debug.LogFormat("累计找到{0}张无用图片", total);
    }
    static bool ContainByIconTable(SpriteInfo info)
    {
        return configs.FindIndex(x => { return x.folder.ToLower() == info.folder.ToLower() && x.sprite == info.name; }) != -1;
    }
    static bool RefrenceByPrefab(SpriteInfo info)
    {
        foreach (var content in prefabTexts)
        {
            if (Regex.IsMatch(content, info.guid))
            {
                return true;
            }
        }
        return false;
    }
    static void OnUpdate()
    {
        var done = true;
        completedTaskCount = 0;
        foreach (var task in tasks)
        {
            completedTaskCount += task.completed;
            if (!task.done)
            {
                done = false;
            }
        }
        EditorUtility.DisplayProgressBar("分析无用Sprite",
            string.Format("正在分析第{0}张Sprite,共计{1}张", completedTaskCount + 1, taskCount),
            (float)completedTaskCount / taskCount);
        if (done)
        {
            EditorUtility.ClearProgressBar();
            ProcessUnUsedSprites();
            EditorApplication.update -= OnUpdate;
        }
    }
    struct SpriteInfo
    {
        public string guid;
        public string name;
        public string folder;
        public bool unUsed;
    }
    class AnalyzeTask
    {
        public int total;
        public int completed;
        public bool done;
        public List<SpriteInfo> sprites;
        public AnalyzeTask()
        {
            sprites = new List<SpriteInfo>();
        }
        public void Add(SpriteInfo info)
        {
            sprites.Add(info);
        }
    }
}