GuidMapperExporter.cs 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180
  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. private static readonly string[] CommonModelExtensions = { ".fbx", ".obj", ".dae", ".gltf", ".glb", ".usdz", ".ply" };
  22. [Serializable]
  23. public class GuidMapper
  24. {
  25. public string Guid { get; set; }
  26. public string Path { get; set; }
  27. }
  28. [MenuItem("Tools/GUID Exporter/Export Script GUIDs")]
  29. public static void ExportScriptGuids()
  30. {
  31. Export(ExportFor.Script);
  32. }
  33. [MenuItem("Tools/GUID Exporter/Export Scene GUIDs")]
  34. public static void ExportSceneGuids()
  35. {
  36. Export(ExportFor.Scene);
  37. }
  38. [MenuItem("Tools/GUID Exporter/Export Prefab GUIDs")]
  39. public static void ExportPrefabGuids()
  40. {
  41. Export(ExportFor.Prefab);
  42. }
  43. [MenuItem("Tools/GUID Exporter/Export ScriptableObject GUIDs")]
  44. public static void ExportScriptableObjectGuids()
  45. {
  46. Export(ExportFor.ScriptableObject);
  47. }
  48. private static void Export(ExportFor exportFor)
  49. {
  50. var (searchPattern, extension) = GetSearchPattern(exportFor);
  51. var searchResults = AssetDatabase.FindAssets(searchPattern, new[] { "Assets" });
  52. var settings = ProjectExporterSettings.GetOrCreateSettings();
  53. var folderToIgnore = settings.FoldersToIgnore;
  54. var mapperList = new List<GuidMapper>();
  55. foreach (var guid in searchResults)
  56. {
  57. var path = AssetDatabase.GUIDToAssetPath(guid);
  58. if (extension != "*" && !path.EndsWith(extension)) continue;
  59. var directoryName = Path.GetDirectoryName(path);
  60. if (folderToIgnore.Any(folder => directoryName != null && directoryName.StartsWith(folder, StringComparison.OrdinalIgnoreCase))) continue;
  61. var guidMapper = new GuidMapper
  62. {
  63. Guid = guid,
  64. Path = path
  65. };
  66. mapperList.Add(guidMapper);
  67. }
  68. var savePath = EditorUtility.SaveFilePanel("Save GUID Mapper", Application.dataPath, $"{exportFor} - guidMapper", "json");
  69. if (!string.IsNullOrEmpty(savePath))
  70. {
  71. JsonFileSystem.Write(mapperList, savePath);
  72. }
  73. Debug.Log($"Successfully exported {mapperList.Count} {exportFor} GUIDs");
  74. }
  75. private static (string searchPattern, string extension) GetSearchPattern(ExportFor exportFor)
  76. {
  77. return exportFor switch
  78. {
  79. ExportFor.Script => ("t:MonoScript", "cs"),
  80. ExportFor.Scene => ("t:SceneAsset", "unity"),
  81. ExportFor.Prefab => ("t:Prefab", "prefab"),
  82. ExportFor.ScriptableObject => ("t:ScriptableObject", "asset"),
  83. ExportFor.All => ("", "*"),
  84. _ => throw new ArgumentOutOfRangeException(nameof(exportFor), exportFor, null)
  85. };
  86. }
  87. [MenuItem("Tools/GUID Exporter/Export All GUIDs")]
  88. public static void ExportAllGuids()
  89. {
  90. BulkExport();
  91. }
  92. private static void BulkExport()
  93. {
  94. var typeToGuidMapper = new Dictionary<Type, List<GuidMapper>>();
  95. var settings = ProjectExporterSettings.GetOrCreateSettings();
  96. var folderToIgnore = settings.FoldersToIgnore;
  97. var assets = AssetDatabase.FindAssets("", new[] { "Assets" });
  98. foreach (var guid in assets)
  99. {
  100. var path = AssetDatabase.GUIDToAssetPath(guid);
  101. if (folderToIgnore.Any(folder => path.StartsWith(folder, StringComparison.OrdinalIgnoreCase))) continue;
  102. var extension = Path.GetExtension(path);
  103. var type = AssetDatabase.GetMainAssetTypeAtPath(path);
  104. if (type == null || extension == null) continue;
  105. if (type == typeof(DefaultAsset) && File.GetAttributes(path).HasFlag(FileAttributes.Directory))
  106. {
  107. continue;
  108. }
  109. if (type.IsSubclassOf(typeof(ScriptableObject)) && extension == ".asset")
  110. {
  111. type = typeof(ScriptableObject);
  112. }
  113. if (type == typeof(GameObject))
  114. {
  115. if (extension == ".prefab")
  116. {
  117. type = typeof(Prefab);
  118. }
  119. else if (CommonModelExtensions.Contains(extension.ToLower()))
  120. {
  121. type = typeof(Model);
  122. }
  123. }
  124. var guidMapper = new GuidMapper
  125. {
  126. Guid = guid,
  127. Path = path
  128. };
  129. if (!typeToGuidMapper.ContainsKey(type))
  130. {
  131. typeToGuidMapper[type] = new List<GuidMapper>();
  132. }
  133. typeToGuidMapper[type].Add(guidMapper);
  134. }
  135. var savePath = EditorUtility.SaveFilePanel("Save GUID Mappers", Application.dataPath, "guidMappers", "json");
  136. if (!string.IsNullOrEmpty(savePath))
  137. {
  138. foreach (var (type, guidMappers) in typeToGuidMapper)
  139. {
  140. var friendlyName = type.Name.Split('.').Last();
  141. var fileName = $"{friendlyName} - guidMapper.json";
  142. var filePath = Path.Combine(Path.GetDirectoryName(savePath) ?? Application.dataPath, fileName);
  143. JsonFileSystem.Write(guidMappers, filePath);
  144. }
  145. }
  146. Debug.Log($"Exported {typeToGuidMapper.Count} GUID Mappers");
  147. }
  148. private class Prefab { }
  149. private class Model { }
  150. }
  151. }