From 2e18fd3baad48b8d0de900a86f8fc73764e9f59a Mon Sep 17 00:00:00 2001
From: client_Wu Xijin <364452445@qq.com>
Date: 星期六, 13 四月 2019 18:03:35 +0800
Subject: [PATCH] 3335 添加分析图片资源的工具.

---
 Assets/Editor/Tool/WindowImageCheck.cs |  246 +++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 245 insertions(+), 1 deletions(-)

diff --git a/Assets/Editor/Tool/WindowImageCheck.cs b/Assets/Editor/Tool/WindowImageCheck.cs
index 39cae1f..9335879 100644
--- a/Assets/Editor/Tool/WindowImageCheck.cs
+++ b/Assets/Editor/Tool/WindowImageCheck.cs
@@ -1,10 +1,16 @@
-锘縰sing System.Collections;
+锘�//------------------------------------------------------------------
+//鏈枃浠朵腑鐨勫伐鍏锋彁渚涘湪缂栬緫鍣ㄧ幆澧冧笅锛屽揩閫熸暣鐞哢I鍥剧墖鐩稿叧鐨勮祫婧�
+//-------------------------------------------------------------------
+
+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("绋嬪簭/绉婚櫎鏃犵敤鐨凷prite")]
+    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("姝e湪鍒嗘瀽绗瑊0}寮燬prite,鍏辫{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);
+        }
+    }
+
+}

--
Gitblit v1.8.0