GuidMapperExporter.cs 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163
  1. using System;
  2. using System.IO;
  3. using System.Linq;
  4. using UnityEditor;
  5. using UnityEngine;
  6. using AssetBank.Settings;
  7. using System.Collections.Generic;
  8. using IntelligentProjectAnalyzer.Helper;
  9. namespace AssetBank.Editor.Tools
  10. {
  11. public static class GuidMapperExporter
  12. {
  13. private enum ExportFor
  14. {
  15. Script,
  16. Scene,
  17. Prefab,
  18. ScriptableObject,
  19. All
  20. }
  21. [Serializable]
  22. public class GuidMapper
  23. {
  24. public string Guid { get; set; }
  25. public string Path { get; set; }
  26. }
  27. [MenuItem("Tools/GUID Exporter/Export Script GUIDs")]
  28. public static void ExportScriptGuids()
  29. {
  30. Export(ExportFor.Script);
  31. }
  32. [MenuItem("Tools/GUID Exporter/Export Scene GUIDs")]
  33. public static void ExportSceneGuids()
  34. {
  35. Export(ExportFor.Scene);
  36. }
  37. [MenuItem("Tools/GUID Exporter/Export Prefab GUIDs")]
  38. public static void ExportPrefabGuids()
  39. {
  40. Export(ExportFor.Prefab);
  41. }
  42. [MenuItem("Tools/GUID Exporter/Export ScriptableObject GUIDs")]
  43. public static void ExportScriptableObjectGuids()
  44. {
  45. Export(ExportFor.ScriptableObject);
  46. }
  47. private static void Export(ExportFor exportFor)
  48. {
  49. var (searchPattern, extension) = GetSearchPattern(exportFor);
  50. var searchResults = AssetDatabase.FindAssets(searchPattern, new[] { "Assets" });
  51. var settings = ProjectExporterSettings.GetOrCreateSettings();
  52. var folderToIgnore = settings.FoldersToIgnore;
  53. var mapperList = new List<GuidMapper>();
  54. foreach (var guid in searchResults)
  55. {
  56. var path = AssetDatabase.GUIDToAssetPath(guid);
  57. if (extension != "*" && !path.EndsWith(extension)) continue;
  58. var directoryName = Path.GetDirectoryName(path);
  59. if (folderToIgnore.Any(folder => directoryName != null && directoryName.StartsWith(folder, StringComparison.OrdinalIgnoreCase))) continue;
  60. var guidMapper = new GuidMapper
  61. {
  62. Guid = guid,
  63. Path = path
  64. };
  65. mapperList.Add(guidMapper);
  66. }
  67. var savePath = EditorUtility.SaveFilePanel("Save GUID Mapper", Application.dataPath, $"{exportFor} - guidMapper", "json");
  68. if (!string.IsNullOrEmpty(savePath))
  69. {
  70. JsonFileSystem.Write(mapperList, savePath);
  71. }
  72. Debug.Log($"Successfully exported {mapperList.Count} {exportFor} GUIDs");
  73. }
  74. private static (string searchPattern, string extension) GetSearchPattern(ExportFor exportFor)
  75. {
  76. return exportFor switch
  77. {
  78. ExportFor.Script => ("t:MonoScript", "cs"),
  79. ExportFor.Scene => ("t:SceneAsset", "unity"),
  80. ExportFor.Prefab => ("t:Prefab", "prefab"),
  81. ExportFor.ScriptableObject => ("t:ScriptableObject", "asset"),
  82. ExportFor.All => ("", "*"),
  83. _ => throw new ArgumentOutOfRangeException(nameof(exportFor), exportFor, null)
  84. };
  85. }
  86. [MenuItem("Tools/GUID Exporter/Export All GUIDs")]
  87. public static void ExportAllGuids()
  88. {
  89. BulkExport();
  90. }
  91. private static void BulkExport()
  92. {
  93. var typeToGuidMapper = new Dictionary<Type, List<GuidMapper>>();
  94. var settings = ProjectExporterSettings.GetOrCreateSettings();
  95. var folderToIgnore = settings.FoldersToIgnore;
  96. var assets = AssetDatabase.FindAssets("", new[] { "Assets" });
  97. foreach (var guid in assets)
  98. {
  99. var path = AssetDatabase.GUIDToAssetPath(guid);
  100. if (folderToIgnore.Any(folder => path.StartsWith(folder, StringComparison.OrdinalIgnoreCase))) continue;
  101. var extension = Path.GetExtension(path);
  102. var type = AssetDatabase.GetMainAssetTypeAtPath(path);
  103. if (type == null || extension == null) continue;
  104. if (type.IsSubclassOf(typeof(ScriptableObject)) && extension == ".asset")
  105. {
  106. type = typeof(ScriptableObject);
  107. }
  108. if (type == typeof(DefaultAsset) && File.GetAttributes(path).HasFlag(FileAttributes.Directory))
  109. {
  110. continue;
  111. }
  112. var guidMapper = new GuidMapper
  113. {
  114. Guid = guid,
  115. Path = path
  116. };
  117. if (!typeToGuidMapper.ContainsKey(type))
  118. {
  119. typeToGuidMapper[type] = new List<GuidMapper>();
  120. }
  121. typeToGuidMapper[type].Add(guidMapper);
  122. }
  123. var savePath = EditorUtility.SaveFilePanel("Save GUID Mappers", Application.dataPath, "guidMappers", "json");
  124. if (!string.IsNullOrEmpty(savePath))
  125. {
  126. foreach (var (type, guidMappers) in typeToGuidMapper)
  127. {
  128. var friendlyName = type.Name.Split('.').Last();
  129. var fileName = $"{friendlyName} - guidMapper";
  130. var filePath = Path.Combine(Path.GetDirectoryName(savePath) ?? Application.dataPath, fileName);
  131. JsonFileSystem.Write(guidMappers, filePath);
  132. }
  133. }
  134. Debug.Log($"Exported {typeToGuidMapper.Count} GUID Mappers");
  135. }
  136. }
  137. }