ReferenceCheck.cs 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151
  1. using UnityEngine;
  2. using UnityEditor;
  3. using System.Collections.Generic;
  4. using System.Text;
  5. using System.Text.RegularExpressions;
  6. using System.IO;
  7. /// <summary>
  8. /// 检查项目中Missing的Component
  9. /// 如果Component的某些引用丢失,打印报错信息,打印丢失引用GameObject的路径
  10. /// </summary>
  11. public class ReferenceCheck
  12. {
  13. static string[] mAllFiles = null;
  14. static Queue<string> findFiles = new Queue<string>();
  15. [MenuItem("Assets/FindImageReferences")]
  16. public static void FindImageReferences()
  17. {
  18. findFiles.Clear();
  19. EditorSettings.serializationMode = SerializationMode.ForceText;
  20. string path = AssetDatabase.GetAssetPath(Selection.activeObject);
  21. PrefabAssetType assetType = PrefabUtility.GetPrefabAssetType(Selection.activeObject);
  22. if (assetType == PrefabAssetType.NotAPrefab)
  23. {
  24. mAllFiles = FileUtils.TraverseAllFiles(Application.dataPath, "*.*", "*.prefab*.unity*.mat*.asset");
  25. string[] prefabFiles = FileUtils.TraverseAllFiles(path, "*.*", "*.tga*.png*.jpg*.gif");
  26. for (int idx = 0; idx < prefabFiles.Length; idx++)
  27. {
  28. findFiles.Enqueue(prefabFiles[idx]);
  29. }
  30. NextFile();
  31. }
  32. else
  33. {
  34. if (!string.IsNullOrEmpty(path))
  35. {
  36. mAllFiles = FileUtils.TraverseAllFiles(Application.dataPath, "*.*", "*.prefab*.unity*.mat*.asset");
  37. Inner_FindReferences(path, true);
  38. }
  39. }
  40. }
  41. [MenuItem("Assets/FindMatReferences")]
  42. public static void FindMatReferences()
  43. {
  44. findFiles.Clear();
  45. EditorSettings.serializationMode = SerializationMode.ForceText;
  46. string path = AssetDatabase.GetAssetPath(Selection.activeObject);
  47. PrefabAssetType assetType = PrefabUtility.GetPrefabAssetType(Selection.activeObject);
  48. if (assetType == PrefabAssetType.NotAPrefab)
  49. {
  50. mAllFiles = FileUtils.TraverseAllFiles(Application.dataPath, "*.*", "*.prefab*.unity*.mat*.asset");
  51. string[] prefabFiles = FileUtils.TraverseAllFiles(path, "*.*", "*.mat");
  52. for (int idx = 0; idx < prefabFiles.Length; idx++)
  53. {
  54. findFiles.Enqueue(prefabFiles[idx]);
  55. }
  56. NextFile();
  57. }
  58. else
  59. {
  60. if (!string.IsNullOrEmpty(path))
  61. {
  62. mAllFiles = FileUtils.TraverseAllFiles(Application.dataPath, "*.*", "*.prefab*.unity*.mat*.asset");
  63. Inner_FindReferences(path, true);
  64. }
  65. }
  66. }
  67. [MenuItem("Assets/Find References")]
  68. public static void FindReferences()
  69. {
  70. findFiles.Clear();
  71. EditorSettings.serializationMode = SerializationMode.ForceText;
  72. string path = AssetDatabase.GetAssetPath(Selection.activeObject);
  73. PrefabAssetType assetType = PrefabUtility.GetPrefabAssetType(Selection.activeObject);
  74. if(assetType == PrefabAssetType.NotAPrefab)
  75. {
  76. mAllFiles = FileUtils.TraverseAllFiles(Application.dataPath, "*.*", "*.prefab*.unity*.mat*.asset");
  77. string[] prefabFiles = FileUtils.TraverseAllFiles(path, "*.*", "*.prefab");
  78. for (int idx = 0; idx < prefabFiles.Length; idx++)
  79. {
  80. findFiles.Enqueue(prefabFiles[idx]);
  81. }
  82. NextFile();
  83. }
  84. else
  85. {
  86. if (!string.IsNullOrEmpty(path))
  87. {
  88. mAllFiles = FileUtils.TraverseAllFiles(Application.dataPath, "*.*", "*.prefab*.unity*.mat*.asset");
  89. Inner_FindReferences(path, true);
  90. }
  91. }
  92. }
  93. static bool Inner_FindReferences(string path, bool detail = false)
  94. {
  95. StringBuilder strBuilder = new StringBuilder();
  96. strBuilder.AppendLine(string.Format("查找文件:{0}", path));
  97. bool bFind = false;
  98. string guid = AssetDatabase.AssetPathToGUID(path);
  99. int startIndex = 0;
  100. EditorApplication.update = delegate ()
  101. {
  102. string file = mAllFiles[startIndex];
  103. bool isCancel = EditorUtility.DisplayCancelableProgressBar("匹配资源中", file, (float)startIndex / (float)mAllFiles.Length);
  104. if (File.Exists(file) && Regex.IsMatch(File.ReadAllText(file), guid))
  105. {
  106. bFind = true;
  107. strBuilder.AppendLine(file);
  108. }
  109. startIndex++;
  110. if (isCancel || startIndex >= mAllFiles.Length)
  111. {
  112. EditorUtility.ClearProgressBar();
  113. EditorApplication.update = null;
  114. startIndex = 0;
  115. if (!bFind)
  116. Debug.Log(path+" 没有被使用过");
  117. else if (detail)
  118. Debug.Log(strBuilder.ToString());
  119. if (!isCancel)
  120. {
  121. NextFile();
  122. }
  123. }
  124. };
  125. return bFind;
  126. }
  127. static void NextFile()
  128. {
  129. if (findFiles.Count > 0)
  130. {
  131. string path = findFiles.Dequeue();
  132. Inner_FindReferences(path,true);
  133. }
  134. }
  135. }