No Description
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

SpriteLibrarySourceAssetImporter.cs 9.8KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222
  1. using System.Collections.Generic;
  2. using System.IO;
  3. using UnityEditor.AssetImporters;
  4. using UnityEngine;
  5. using UnityEngine.U2D.Animation;
  6. namespace UnityEditor.U2D.Animation
  7. {
  8. /// <summary>
  9. /// A ScriptedImporter that imports .spriteLib extension file to generate
  10. /// SpriteLibraryAsset
  11. /// </summary>
  12. [ScriptedImporter(1, "spriteLib")]
  13. public class SpriteLibrarySourceAssetImporter : ScriptedImporter
  14. {
  15. [SerializeField]
  16. SpriteLibraryAsset m_PrimaryLibrary;
  17. /// <summary>
  18. /// Implementation of ScriptedImporter.OnImportAsset
  19. /// </summary>
  20. /// <param name="ctx">
  21. /// This argument contains all the contextual information needed to process the import
  22. /// event and is also used by the custom importer to store the resulting Unity Asset.
  23. /// </param>
  24. public override void OnImportAsset(AssetImportContext ctx)
  25. {
  26. var spriteLib = ScriptableObject.CreateInstance<SpriteLibraryAsset>();
  27. spriteLib.name = Path.GetFileNameWithoutExtension(assetPath);
  28. var sourceAsset = UnityEditorInternal.InternalEditorUtility.LoadSerializedFileAndForget(assetPath);
  29. if (sourceAsset?.Length > 0)
  30. {
  31. var sourceLibraryAsset = sourceAsset[0] as SpriteLibrarySourceAsset;
  32. if (sourceLibraryAsset != null)
  33. {
  34. if (!HasValidMainLibrary(sourceLibraryAsset, assetPath))
  35. sourceLibraryAsset.primaryLibraryID = string.Empty;
  36. UpdateSpriteLibrarySourceAssetLibraryWithMainAsset(sourceLibraryAsset);
  37. foreach (var cat in sourceLibraryAsset.library)
  38. {
  39. spriteLib.AddCategoryLabel(null, cat.name, null);
  40. foreach (var entry in cat.overrideEntries)
  41. {
  42. spriteLib.AddCategoryLabel(entry.spriteOverride, cat.name, entry.name);
  43. }
  44. }
  45. if (!string.IsNullOrEmpty(sourceLibraryAsset.primaryLibraryID))
  46. {
  47. var primaryAssetPath = AssetDatabase.GUIDToAssetPath(sourceLibraryAsset.primaryLibraryID);
  48. ctx.DependsOnArtifact(AssetDatabase.GUIDToAssetPath(sourceLibraryAsset.primaryLibraryID));
  49. m_PrimaryLibrary = AssetDatabase.LoadAssetAtPath<SpriteLibraryAsset>(primaryAssetPath);
  50. }
  51. }
  52. }
  53. ctx.AddObjectToAsset("SpriteLib", spriteLib, IconUtility.LoadIconResource("Sprite Library", "Icons/Light", "Icons/Dark"));
  54. }
  55. internal static void UpdateSpriteLibrarySourceAssetLibraryWithMainAsset(SpriteLibrarySourceAsset sourceLibraryAsset)
  56. {
  57. var so = new SerializedObject(sourceLibraryAsset);
  58. var library = so.FindProperty("m_Library");
  59. var mainLibraryAssetAssetPath = AssetDatabase.GUIDToAssetPath(sourceLibraryAsset.primaryLibraryID);
  60. var mainLibraryAsset = AssetDatabase.LoadAssetAtPath<SpriteLibraryAsset>(mainLibraryAssetAssetPath);
  61. SpriteLibraryDataInspector.UpdateLibraryWithNewMainLibrary(mainLibraryAsset, library);
  62. if (so.hasModifiedProperties)
  63. so.ApplyModifiedPropertiesWithoutUndo();
  64. }
  65. internal static bool HasValidMainLibrary(SpriteLibrarySourceAsset sourceLibraryAsset, string assetPath)
  66. {
  67. if (string.IsNullOrEmpty(sourceLibraryAsset.primaryLibraryID))
  68. return false;
  69. var primaryLibraryPath = AssetDatabase.GUIDToAssetPath(sourceLibraryAsset.primaryLibraryID);
  70. if (assetPath == primaryLibraryPath)
  71. return false;
  72. var primaryAssetParentChain = GetAssetParentChain(AssetDatabase.LoadAssetAtPath<SpriteLibraryAsset>(primaryLibraryPath));
  73. foreach (var parentLibrary in primaryAssetParentChain)
  74. {
  75. var parentPath = AssetDatabase.GetAssetPath(parentLibrary);
  76. if (parentPath == assetPath)
  77. return false;
  78. }
  79. return true;
  80. }
  81. internal static SpriteLibrarySourceAsset LoadSpriteLibrarySourceAsset(string path)
  82. {
  83. var loadedObjects = UnityEditorInternal.InternalEditorUtility.LoadSerializedFileAndForget(path);
  84. foreach (var obj in loadedObjects)
  85. {
  86. if (obj is SpriteLibrarySourceAsset)
  87. return (SpriteLibrarySourceAsset)obj;
  88. }
  89. return null;
  90. }
  91. internal static void SaveSpriteLibrarySourceAsset(SpriteLibrarySourceAsset obj, string path)
  92. {
  93. if (!HasValidMainLibrary(obj, path))
  94. obj.primaryLibraryID = string.Empty;
  95. UnityEditorInternal.InternalEditorUtility.SaveToSerializedFileAndForget(new [] {obj}, path, true);
  96. }
  97. [MenuItem("internal:Assets/Convert to SpriteLibrarySourceAsset", true)]
  98. static bool ConvertToSpriteLibrarySourceAssetValidate()
  99. {
  100. foreach (var obj in Selection.objects)
  101. {
  102. if (obj is SpriteLibraryAsset)
  103. return true;
  104. }
  105. return false;
  106. }
  107. [MenuItem("internal:Assets/Convert to SpriteLibrarySourceAsset")]
  108. static void ConvertToSourceAsset()
  109. {
  110. foreach (var obj in Selection.objects)
  111. {
  112. if (obj is SpriteLibraryAsset)
  113. {
  114. var asset = (SpriteLibraryAsset) obj;
  115. var path = AssetDatabase.GetAssetPath(asset);
  116. var currentAssetPath = Path.GetDirectoryName(path);
  117. var fileName = Path.GetFileNameWithoutExtension(path);
  118. var convertFileName = fileName + ".spriteLib";
  119. convertFileName = AssetDatabase.GenerateUniqueAssetPath(Path.Combine(currentAssetPath, convertFileName));
  120. var convertAsset = ScriptableObject.CreateInstance<SpriteLibrarySourceAsset>();
  121. convertAsset.SetLibrary(new List<SpriteLibCategoryOverride>(asset.categories.Count));
  122. for (int i = 0; i < asset.categories.Count; ++i)
  123. {
  124. var category = asset.categories[i];
  125. var newCategory = new SpriteLibCategoryOverride()
  126. {
  127. overrideEntries = new List<SpriteCategoryEntryOverride>(category.categoryList.Count),
  128. name = category.name,
  129. entryOverrideCount = 0,
  130. fromMain = false
  131. };
  132. convertAsset.AddCategory(newCategory);
  133. for (int j = 0; j < category.categoryList.Count; ++j)
  134. {
  135. newCategory.overrideEntries.Add(new SpriteCategoryEntryOverride()
  136. {
  137. name = category.categoryList[j].name,
  138. sprite = null,
  139. fromMain = false,
  140. spriteOverride = category.categoryList[j].sprite
  141. });
  142. }
  143. }
  144. SpriteLibrarySourceAssetImporter.SaveSpriteLibrarySourceAsset(convertAsset, convertFileName);
  145. }
  146. }
  147. AssetDatabase.Refresh();
  148. }
  149. internal static SpriteLibraryAsset GetAssetParent(SpriteLibraryAsset asset)
  150. {
  151. var currentAssetPath = AssetDatabase.GetAssetPath(asset);
  152. var sourceAsset = LoadSpriteLibrarySourceAsset(currentAssetPath);
  153. var primaryLibraryId = sourceAsset != null ? sourceAsset.primaryLibraryID : null;
  154. if (primaryLibraryId != null)
  155. {
  156. var primaryLibraryAssetAssetPath = AssetDatabase.GUIDToAssetPath(primaryLibraryId);
  157. return AssetDatabase.LoadAssetAtPath<SpriteLibraryAsset>(primaryLibraryAssetAssetPath);
  158. }
  159. return null;
  160. }
  161. internal static List<SpriteLibraryAsset> GetAssetParentChain(SpriteLibraryAsset asset)
  162. {
  163. var chain = new List<SpriteLibraryAsset>();
  164. if (asset != null)
  165. {
  166. var parent = GetAssetParent(asset);
  167. while (parent != null && !chain.Contains(parent))
  168. {
  169. chain.Add(parent);
  170. parent = GetAssetParent(parent);
  171. }
  172. }
  173. return chain;
  174. }
  175. }
  176. internal class SpriteLibrarySourceAssetPostProcessor: AssetPostprocessor
  177. {
  178. void OnPreprocessAsset()
  179. {
  180. if (assetImporter is SpriteLibrarySourceAssetImporter)
  181. {
  182. var obj = SpriteLibrarySourceAssetImporter.LoadSpriteLibrarySourceAsset(assetPath);
  183. if (obj != null)
  184. {
  185. SpriteLibraryAsset mainLibraryAsset = null;
  186. var mainLibraryAssetAssetPath = AssetDatabase.GUIDToAssetPath(obj.primaryLibraryID);
  187. mainLibraryAsset = AssetDatabase.LoadAssetAtPath<SpriteLibraryAsset>(mainLibraryAssetAssetPath);
  188. var so = new SerializedObject(obj);
  189. var library = so.FindProperty("m_Library");
  190. SpriteLibraryDataInspector.UpdateLibraryWithNewMainLibrary(mainLibraryAsset, library);
  191. if (so.hasModifiedProperties)
  192. {
  193. so.ApplyModifiedPropertiesWithoutUndo();
  194. SpriteLibrarySourceAssetImporter.SaveSpriteLibrarySourceAsset(obj, assetPath);
  195. }
  196. }
  197. }
  198. }
  199. }
  200. }