ReferenceManager.cs 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147
  1. namespace AtlasUtility
  2. {
  3. using UnityEditor;
  4. using UnityEngine;
  5. using UnityEditor.SceneManagement;
  6. using System;
  7. using System.IO;
  8. using System.Linq;
  9. using System.Collections.Generic;
  10. using System.Text.RegularExpressions;
  11. public class ReferenceManager
  12. {
  13. public static void FindReference(string path)
  14. {
  15. SerializationMode userSerializationMode = EditorSettings.serializationMode;
  16. EditorSettings.serializationMode = SerializationMode.ForceText;
  17. string guid = AssetDatabase.AssetPathToGUID(path);
  18. List<string> pathList = GetAllFile(true);
  19. for (int i = 0; i < pathList.Count; i++)
  20. {
  21. EditorUtility.DisplayProgressBar("匹配", pathList[i], (i + 1) / (float)pathList.Count);
  22. int count = Regex.Matches(File.ReadAllText(pathList[i]), guid).Count;
  23. if (count > 0)
  24. {
  25. Debug.LogWarning($"{count}处引用 {pathList[i].GetRelativePath()}");
  26. }
  27. }
  28. EditorUtility.ClearProgressBar();
  29. EditorSettings.serializationMode = userSerializationMode;
  30. }
  31. public static void ChangeReference(bool includeMaterial, List<string> fromList, List<string> toList)
  32. {
  33. if (fromList.Count != toList.Count)
  34. {
  35. throw new Exception("遇到一个Bug");
  36. }
  37. if (fromList.Count == 0)
  38. {
  39. return;
  40. }
  41. AssetDatabase.SaveAssets();
  42. EditorSceneManager.SaveOpenScenes();
  43. SerializationMode userSerializationMode = EditorSettings.serializationMode;
  44. EditorSettings.serializationMode = SerializationMode.ForceText;
  45. List<string> pathList = GetAllFile(includeMaterial);
  46. for (int i = 0; i < pathList.Count; i++)
  47. {
  48. EditorUtility.DisplayProgressBar("修改引用", Path.GetFileNameWithoutExtension(pathList[i]), (i + 1) / (float)pathList.Count);
  49. string originText = File.ReadAllText(pathList[i]);
  50. string newText = originText;
  51. for (int j = 0; j < fromList.Count; j++)
  52. {
  53. newText = newText.Replace(fromList[j], toList[j]);
  54. }
  55. if (newText != originText)
  56. {
  57. File.WriteAllText(pathList[i], newText);
  58. }
  59. }
  60. EditorUtility.ClearProgressBar();
  61. EditorSettings.serializationMode = userSerializationMode;
  62. AssetDatabase.Refresh();
  63. }
  64. public static List<string> GetAllFile(bool includeMaterial)
  65. {
  66. List<string> searchExtension = new List<string>()
  67. {
  68. ".asset",
  69. ".anim",
  70. ".unity",
  71. ".prefab"
  72. };
  73. if (includeMaterial)
  74. {
  75. searchExtension.Add(".mat");
  76. }
  77. List<string> pathList = Directory.GetFiles(Application.dataPath, "*.*", SearchOption.AllDirectories).Where
  78. (
  79. path =>
  80. {
  81. string extension = Path.GetExtension(path);
  82. if (searchExtension.Contains(extension))
  83. {
  84. return true;
  85. }
  86. else
  87. {
  88. return false;
  89. }
  90. }
  91. )
  92. .ToList();
  93. return pathList;
  94. }
  95. public static List<string> GetChildSpritePath(string atlasPath)
  96. {
  97. string atlasGUID = AssetDatabase.AssetPathToGUID(atlasPath);
  98. List<string> spritePathList = new List<string>();
  99. List<AtlasReferencePair> referencePairList = AtlasReferenceTable.ReadAllLine();
  100. foreach (var referencePair in referencePairList)
  101. {
  102. AtlasReference atlasReference = referencePair.AtlasReference;
  103. AtlasReference sourceAtlasReference = referencePair.SourceAtlasReference;
  104. if (atlasReference.GUID == atlasGUID)
  105. {
  106. spritePathList.Add(AssetDatabase.GUIDToAssetPath(sourceAtlasReference.GUID));
  107. }
  108. }
  109. return spritePathList;
  110. }
  111. }
  112. }