using System.Collections.Generic; using UnityEngine; using UnityEditor; using System.IO; using System.Linq; using UnityEngine.UI; using System; public class ShowAllNotUseResourceCheck : EditorWindow { enum UIType { NotUseRes = 1, FindReferences = 2, } [MenuItem("Tools/删除资源工具", false, 1000)] static public void OpenPrefabTool() { uitype = UIType.NotUseRes; ShowAllNotUseResourceCheck checkWin = (ShowAllNotUseResourceCheck)EditorWindow.GetWindow(false, "checkWin", true); checkWin.autoRepaintOnSceneChange = true; LoadConfig(); checkWin.Show(); } [MenuItem("Assets/Find References", false)] static public void FindResReferences() { uitype = UIType.FindReferences; StarFind(); } static UIType uitype = UIType.NotUseRes; static Dictionary mapReourceUsedOther = new Dictionary(); //资源是否被代码引用 static private List checkType = new List(); //检测的类型 static private List allResource = new List(); //所有使用资源 static private List notUseReource = new List(); //没有使用过的资源 static private string searchModule = "bag"; //需要搜索的模块 Vector2 scrollPos = Vector2.zero; static private string curSearchPath = ""; //当前搜索的图片的路径 static private List findPrefabs = new List(); //被引用的预制体 private void StartCheck() { List withoutExtensions = new List() { ".prefab" }; string[] files = Directory.GetFiles(Application.dataPath + "/LuaFramework/AssetBundleRes/ui/", "*.*", SearchOption.AllDirectories) .Where(s => withoutExtensions.Contains(Path.GetExtension(s).ToLower())).ToArray(); List withoutExtensions2 = new List() { ".png", ".jpg" }; //所有project 里面的资源 string[] UIReource = Directory.GetFiles(Application.dataPath + "/LuaFramework/AssetBundleRes/ui/" + searchModule, "*.*", SearchOption.AllDirectories) .Where(s => withoutExtensions2.Contains(Path.GetExtension(s).ToLower())).ToArray(); for (int i = 0; i < UIReource.Length; i++) { UIReource[i] = UIReource[i].Replace("\\", "/"); int index = UIReource[i].IndexOf("Assets"); UIReource[i] = UIReource[i].Substring(index); } float count = 0; foreach (string file in files) { count++; EditorUtility.DisplayProgressBar("Processing...", "检索中....", count / files.Length); string strFile = file.Substring(file.IndexOf("Asset")).Replace('\\', '/'); string[] dependenciesFiles = AssetDatabase.GetDependencies(strFile, false); foreach (string depFile in dependenciesFiles) { bool isNeedShow = false; foreach (string type in checkType) { //存在设置类型 需要显示 if (depFile.IndexOf(type) > -1) { isNeedShow = true; break; } } if (isNeedShow == false) { continue; } allResource.Add(depFile); } } EditorUtility.ClearProgressBar(); for (int i = 0; i < UIReource.Length; i++) { bool isUse = false; foreach (string usePath in allResource) { if (UIReource[i] == usePath) { isUse = true; break; } } if (isUse == false) { notUseReource.Add(UIReource[i]); } } } static void StarFind() { findPrefabs.Clear(); if (Selection.activeObject == null) { EditorUtility.DisplayDialog("提示", "没有选中物体", "确定"); return; } string path = AssetDatabase.GetAssetPath(Selection.activeObject); curSearchPath = path; if (string.IsNullOrEmpty(path)) { EditorUtility.DisplayDialog("提示", "没有选中物体", "确定"); return; } List withoutExtensions = new List() { ".prefab" }; string[] files = Directory.GetFiles(Application.dataPath + "/LuaFramework/AssetBundleRes/ui/", "*.*", SearchOption.AllDirectories) .Where(s => withoutExtensions.Contains(Path.GetExtension(s).ToLower())).ToArray(); float count = 0; foreach (string file in files) { count++; EditorUtility.DisplayProgressBar("Processing...", "检索中....", count / files.Length); string strFile = file.Substring(file.IndexOf("Asset")).Replace('\\', '/'); string[] dependenciesFiles = AssetDatabase.GetDependencies(strFile, false); foreach (string depFile in dependenciesFiles) { if (path == depFile) { findPrefabs.Add(strFile); } } } EditorUtility.ClearProgressBar(); if (findPrefabs.Count == 0) { EditorUtility.DisplayDialog("搜索结果", "没有找到任何预制体引用", "确定"); } else { EditorUtility.DisplayDialog("搜索结果", "有" + findPrefabs.Count + "个预制体引用了该素材", "确定"); ShowAllNotUseResourceCheck checkWin = (ShowAllNotUseResourceCheck)EditorWindow.GetWindow(false, "checkWin", true); checkWin.autoRepaintOnSceneChange = true; checkWin.Show(); } } void OnGUI() { if (uitype == UIType.NotUseRes) { OnNotUseResGUI(); } else { OnFindReferencesGUI(); } } void OnNotUseResGUI() { EditorGUILayout.BeginHorizontal(); if (GUILayout.Button("列出所有未使用过的图片", GUILayout.Width(200))) { allResource = new List(); notUseReource = new List(); checkType.Clear(); checkType.Add(".jpg"); checkType.Add(".png"); StartCheck(); } EditorGUILayout.LabelField("搜索模块:", GUILayout.MaxWidth(45)); searchModule = EditorGUILayout.TextField(searchModule, GUILayout.MaxWidth(200)); EditorGUILayout.EndHorizontal(); scrollPos = EditorGUILayout.BeginScrollView(scrollPos); foreach (var path in notUseReource) { EditorGUILayout.BeginHorizontal(); Texture2D t = (Texture2D)AssetDatabase.LoadAssetAtPath(path, typeof(Texture2D)); EditorGUILayout.ObjectField(t, typeof(Texture2D), false); string module = "", name = ""; GetModuleAndName(path, out module, out name); EditorGUILayout.TextField(module, GUILayout.MaxWidth(100)); EditorGUILayout.TextField(name, GUILayout.MaxWidth(200)); GUI.backgroundColor = Color.red; if (GUILayout.Button("删除图片", GUILayout.Width(100))) { if (mapReourceUsedOther.ContainsKey(path)) { mapReourceUsedOther.Remove(path); SaveConfig(); } File.Delete(path); AssetDatabase.Refresh(); } GUI.backgroundColor = Color.white; if (mapReourceUsedOther.ContainsKey(path) && mapReourceUsedOther[path] == true) { if (GUILayout.Button("取消", GUILayout.Width(200))) { mapReourceUsedOther[path] = false; SaveConfig(); AssetDatabase.Refresh(); } } else { if (GUILayout.Button("设置为代码使用", GUILayout.Width(200))) { if (mapReourceUsedOther.ContainsKey(path)) mapReourceUsedOther[path] = true; else mapReourceUsedOther.Add(path, true); SaveConfig(); AssetDatabase.Refresh(); } } EditorGUILayout.EndHorizontal(); } EditorGUILayout.EndScrollView(); } void OnFindReferencesGUI() { EditorGUILayout.BeginHorizontal(); GUI.backgroundColor = Color.green; if (GUILayout.Button("给所有预制件添加点击动画", GUILayout.Width(150))) { int i = 0; foreach (var path in findPrefabs) { AddButtonScale(path, true); i++; } AssetDatabase.Refresh(); AssetDatabase.SaveAssets(); EditorUtility.DisplayDialog("添加完成","添加了 " + i + "个预制件的点击动画", "确定"); } EditorGUILayout.EndHorizontal(); GUI.backgroundColor = Color.white; scrollPos = EditorGUILayout.BeginScrollView(scrollPos); foreach (var path in findPrefabs) { EditorGUILayout.BeginHorizontal(); GameObject t = (GameObject)AssetDatabase.LoadAssetAtPath(path, typeof(GameObject)); EditorGUILayout.ObjectField(t, typeof(GameObject), false); GUI.backgroundColor = Color.green; if (GUILayout.Button("打开预制体", GUILayout.Width(100))) { string[] files = Directory.GetFiles(Application.dataPath + "/LuaFramework/AssetBundleRes/ui/", t.name + ".prefab", SearchOption.AllDirectories); if (files.Length == 1) { U3DExtends.UIEditorHelper.LoadLayoutByPath(files[0]); } } GUI.backgroundColor = Color.green; if (GUILayout.Button("添加点击缩放动画", GUILayout.Width(150))) { AddButtonScale(path, false); } GUI.backgroundColor = Color.white; EditorGUILayout.EndHorizontal(); } EditorGUILayout.EndScrollView(); } void GetModuleAndName(string str, out string module, out string name) { string temp = ""; module = ""; name = ""; int index = str.IndexOf("ui"); temp = str.Substring(index); temp = temp.Replace(".png", ""); string[] strs = temp.Split('/'); if (strs.Length >= 4) { module = strs[1]; name = strs[3]; } } static void SaveConfig() { string path = Application.dataPath + @"/Editor/NotUseResourceCheck/NotUseResConfig.txt"; StreamWriter sw; FileInfo fi = new FileInfo(path); sw = fi.CreateText(); foreach (var item in mapReourceUsedOther) { if (item.Value) sw.WriteLine(item.Key); } sw.Close(); sw.Dispose(); } static void LoadConfig() { mapReourceUsedOther.Clear(); string path = Application.dataPath + @"/Editor/NotUseResourceCheck/NotUseResConfig.txt"; StreamReader sr = null; sr = File.OpenText(path); if (sr != null) { string t_Line; while ((t_Line = sr.ReadLine()) != null) { mapReourceUsedOther.Add(t_Line, true); } sr.Close(); sr.Dispose(); } } void AddButtonScale(string path, bool is_all) { string filePath = GetRelativeAssetsPath(path); Debug.Log("当前处理预制体 " + filePath); GameObject _prefab = AssetDatabase.LoadAssetAtPath(filePath, typeof(GameObject)) as GameObject; if (_prefab == null) { Debug.Log("该路径不能正常加载预制体 = >>> " + filePath); return; } GameObject find_obj = PrefabUtility.InstantiatePrefab(_prefab) as GameObject; if (find_obj == null) { Debug.Log("该路径不实例化预制体 = >>> " + filePath); return; } bool isChange = false; string select_res_path = curSearchPath; Image[] imgs = find_obj.GetComponentsInChildren(true); foreach (var img in imgs) { Texture cur_texture = img.mainTexture; string cur_path = AssetDatabase.GetAssetPath(cur_texture); if (cur_path == select_res_path) { isChange = true; Debug.Log(cur_path + " 节点添加了点击动画"); var com = img.gameObject.GetComponent(); if (!com) img.gameObject.AddComponent(); } } if (isChange) { PrefabUtility.ReplacePrefab(find_obj, _prefab, ReplacePrefabOptions.Default); } MonoBehaviour.DestroyImmediate(find_obj); if (isChange && !is_all) { AssetDatabase.Refresh(); AssetDatabase.SaveAssets(); } } private string GetRelativeAssetsPath(string path) { return "Assets" + Path.GetFullPath(path).Replace(Path.GetFullPath(Application.dataPath), "").Replace('\\', '/'); } }