|
|
- 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<ShowAllNotUseResourceCheck>(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<string, bool> mapReourceUsedOther = new Dictionary<string, bool>(); //资源是否被代码引用
- static private List<string> checkType = new List<string>(); //检测的类型
- static private List<string> allResource = new List<string>(); //所有使用资源
- static private List<string> notUseReource = new List<string>(); //没有使用过的资源
- static private string searchModule = "bag"; //需要搜索的模块
- Vector2 scrollPos = Vector2.zero;
- static private string curSearchPath = ""; //当前搜索的图片的路径
-
- static private List<string> findPrefabs = new List<string>(); //被引用的预制体
-
- private void StartCheck()
- {
- List<string> withoutExtensions = new List<string>() { ".prefab" };
- string[] files = Directory.GetFiles(Application.dataPath + "/LuaFramework/AssetBundleRes/ui/", "*.*", SearchOption.AllDirectories)
- .Where(s => withoutExtensions.Contains(Path.GetExtension(s).ToLower())).ToArray();
-
- List<string> withoutExtensions2 = new List<string>() { ".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<string> withoutExtensions = new List<string>() { ".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<ShowAllNotUseResourceCheck>(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<string>();
- notUseReource = new List<string>();
- 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<Image>(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<ExtendButtonScale>();
- if (!com)
- img.gameObject.AddComponent<ExtendButtonScale>();
- }
-
- }
-
- 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('\\', '/');
- }
- }
|