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