using UnityEngine; using UnityEditor; using System.Collections.Generic; using System.Text; using System.Text.RegularExpressions; using System.IO; /// /// 检查项目中Missing的Component /// 如果Component的某些引用丢失,打印报错信息,打印丢失引用GameObject的路径 /// public class ReferenceCheck { static string[] mAllFiles = null; static Queue findFiles = new Queue(); [MenuItem("Assets/FindImageReferences")] public static void FindImageReferences() { findFiles.Clear(); EditorSettings.serializationMode = SerializationMode.ForceText; string path = AssetDatabase.GetAssetPath(Selection.activeObject); PrefabAssetType assetType = PrefabUtility.GetPrefabAssetType(Selection.activeObject); if (assetType == PrefabAssetType.NotAPrefab) { mAllFiles = FileUtils.TraverseAllFiles(Application.dataPath, "*.*", "*.prefab*.unity*.mat*.asset"); string[] prefabFiles = FileUtils.TraverseAllFiles(path, "*.*", "*.tga*.png*.jpg*.gif"); for (int idx = 0; idx < prefabFiles.Length; idx++) { findFiles.Enqueue(prefabFiles[idx]); } NextFile(); } else { if (!string.IsNullOrEmpty(path)) { mAllFiles = FileUtils.TraverseAllFiles(Application.dataPath, "*.*", "*.prefab*.unity*.mat*.asset"); Inner_FindReferences(path, true); } } } [MenuItem("Assets/FindMatReferences")] public static void FindMatReferences() { findFiles.Clear(); EditorSettings.serializationMode = SerializationMode.ForceText; string path = AssetDatabase.GetAssetPath(Selection.activeObject); PrefabAssetType assetType = PrefabUtility.GetPrefabAssetType(Selection.activeObject); if (assetType == PrefabAssetType.NotAPrefab) { mAllFiles = FileUtils.TraverseAllFiles(Application.dataPath, "*.*", "*.prefab*.unity*.mat*.asset"); string[] prefabFiles = FileUtils.TraverseAllFiles(path, "*.*", "*.mat"); for (int idx = 0; idx < prefabFiles.Length; idx++) { findFiles.Enqueue(prefabFiles[idx]); } NextFile(); } else { if (!string.IsNullOrEmpty(path)) { mAllFiles = FileUtils.TraverseAllFiles(Application.dataPath, "*.*", "*.prefab*.unity*.mat*.asset"); Inner_FindReferences(path, true); } } } [MenuItem("Assets/Find References")] public static void FindReferences() { findFiles.Clear(); EditorSettings.serializationMode = SerializationMode.ForceText; string path = AssetDatabase.GetAssetPath(Selection.activeObject); PrefabAssetType assetType = PrefabUtility.GetPrefabAssetType(Selection.activeObject); if(assetType == PrefabAssetType.NotAPrefab) { mAllFiles = FileUtils.TraverseAllFiles(Application.dataPath, "*.*", "*.prefab*.unity*.mat*.asset"); string[] prefabFiles = FileUtils.TraverseAllFiles(path, "*.*", "*.prefab"); for (int idx = 0; idx < prefabFiles.Length; idx++) { findFiles.Enqueue(prefabFiles[idx]); } NextFile(); } else { if (!string.IsNullOrEmpty(path)) { mAllFiles = FileUtils.TraverseAllFiles(Application.dataPath, "*.*", "*.prefab*.unity*.mat*.asset"); Inner_FindReferences(path, true); } } } static bool Inner_FindReferences(string path, bool detail = false) { StringBuilder strBuilder = new StringBuilder(); strBuilder.AppendLine(string.Format("查找文件:{0}", path)); bool bFind = false; string guid = AssetDatabase.AssetPathToGUID(path); int startIndex = 0; EditorApplication.update = delegate () { string file = mAllFiles[startIndex]; bool isCancel = EditorUtility.DisplayCancelableProgressBar("匹配资源中", file, (float)startIndex / (float)mAllFiles.Length); if (File.Exists(file) && Regex.IsMatch(File.ReadAllText(file), guid)) { bFind = true; strBuilder.AppendLine(file); } startIndex++; if (isCancel || startIndex >= mAllFiles.Length) { EditorUtility.ClearProgressBar(); EditorApplication.update = null; startIndex = 0; if (!bFind) Debug.Log(path+" 没有被使用过"); else if (detail) Debug.Log(strBuilder.ToString()); if (!isCancel) { NextFile(); } } }; return bFind; } static void NextFile() { if (findFiles.Count > 0) { string path = findFiles.Dequeue(); Inner_FindReferences(path,true); } } }