暫無描述
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.

SpriteLibraryInspector.cs 8.8KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210
  1. using System.Collections.Generic;
  2. using UnityEngine;
  3. using UnityEngine.Scripting.APIUpdating;
  4. using UnityEngine.U2D.Animation;
  5. namespace UnityEditor.U2D.Animation
  6. {
  7. [CustomEditor(typeof(SpriteLibrary))]
  8. [CanEditMultipleObjects]
  9. [MovedFrom("UnityEditor.Experimental.U2D.Animation")]
  10. internal class SpriteLibraryInspector : Editor
  11. {
  12. static class Style
  13. {
  14. public static string libraryDifferentValue = L10n.Tr("Sprite Library has different values.");
  15. }
  16. SpriteLibCombineCache m_OverrideLibraryObject;
  17. SerializedObject m_OverrideLibraryCache;
  18. SerializedProperty m_MasterLibraryProperty;
  19. SpriteLibraryAsset m_MasterLibraryObject;
  20. SerializedProperty m_MasterLibraryCategories;
  21. SerializedProperty m_OverrideLibraryCategories;
  22. SpriteLibraryDataInspector m_SpriteLibraryDataInspector;
  23. long m_PreviousModificationHash;
  24. List<SpriteLibrary> m_CachedLibraryTargets = new List<SpriteLibrary>();
  25. List<SpriteResolver> m_CachedResolvers = new List<SpriteResolver>();
  26. public void OnEnable()
  27. {
  28. m_OverrideLibraryObject = ScriptableObject.CreateInstance<SpriteLibCombineCache>();
  29. m_OverrideLibraryCache = new SerializedObject(m_OverrideLibraryObject);
  30. m_OverrideLibraryCategories = m_OverrideLibraryCache.FindProperty("m_Library");
  31. m_MasterLibraryProperty = serializedObject.FindProperty("m_SpriteLibraryAsset");
  32. m_MasterLibraryCategories = serializedObject.FindProperty("m_Library");
  33. UpdateMasterLibraryObject();
  34. CacheTargets();
  35. UpdateSpriteLibraryDataCache();
  36. }
  37. void UpdateMasterLibraryObject()
  38. {
  39. m_MasterLibraryObject = (SpriteLibraryAsset)m_MasterLibraryProperty.objectReferenceValue;
  40. }
  41. void CacheTargets()
  42. {
  43. m_CachedLibraryTargets.Clear();
  44. foreach(var t in targets)
  45. m_CachedLibraryTargets.Add(t as SpriteLibrary);
  46. m_CachedResolvers.Clear();
  47. foreach (var sl in m_CachedLibraryTargets)
  48. {
  49. var resolvers = sl.GetComponentsInChildren<SpriteResolver>();
  50. m_CachedResolvers.AddRange(resolvers);
  51. }
  52. }
  53. void UpdateSpriteLibraryDataCache()
  54. {
  55. if(m_MasterLibraryCategories.hasMultipleDifferentValues)
  56. return;
  57. if (m_MasterLibraryProperty.hasMultipleDifferentValues)
  58. return;
  59. CopySpriteLibraryToOverride(m_OverrideLibraryObject.library, m_MasterLibraryCategories);
  60. m_OverrideLibraryCache.Update();
  61. SpriteLibraryDataInspector.UpdateLibraryWithNewMainLibrary(m_MasterLibraryObject, m_OverrideLibraryCategories);
  62. m_SpriteLibraryDataInspector = new SpriteLibraryDataInspector(serializedObject, m_OverrideLibraryCategories);
  63. m_OverrideLibraryCache.ApplyModifiedPropertiesWithoutUndo();
  64. }
  65. public override void OnInspectorGUI()
  66. {
  67. RefreshMasterLibraryAssetData();
  68. serializedObject.Update();
  69. m_OverrideLibraryCache.Update();
  70. EditorGUI.BeginChangeCheck();
  71. EditorGUILayout.PropertyField(m_MasterLibraryProperty);
  72. if (EditorGUI.EndChangeCheck())
  73. {
  74. UpdateMasterLibraryObject();
  75. UpdateSpriteLibraryDataCache();
  76. serializedObject.ApplyModifiedProperties();
  77. UpdateSpriteResolvers();
  78. }
  79. if (m_SpriteLibraryDataInspector != null)
  80. {
  81. EditorGUI.BeginChangeCheck();
  82. m_SpriteLibraryDataInspector.OnGUI();
  83. if (EditorGUI.EndChangeCheck())
  84. {
  85. m_OverrideLibraryCache.ApplyModifiedProperties();
  86. CopyOverrideToSpriteLibrary(m_OverrideLibraryObject.library, m_MasterLibraryCategories);
  87. serializedObject.ApplyModifiedProperties();
  88. foreach(var spriteLib in m_CachedLibraryTargets)
  89. spriteLib.CacheOverrides();
  90. UpdateSpriteResolvers();
  91. }
  92. }
  93. else
  94. {
  95. EditorGUILayout.HelpBox(Style.libraryDifferentValue, MessageType.Info);
  96. }
  97. }
  98. void RefreshMasterLibraryAssetData()
  99. {
  100. var modificationHash = m_MasterLibraryObject ? m_MasterLibraryObject.modificationHash : 0;
  101. if (m_PreviousModificationHash != modificationHash)
  102. {
  103. UpdateSpriteLibraryDataCache();
  104. UpdateSpriteResolvers();
  105. m_PreviousModificationHash = modificationHash;
  106. }
  107. }
  108. void UpdateSpriteResolvers()
  109. {
  110. foreach (var resolver in m_CachedResolvers)
  111. {
  112. resolver.ResolveSpriteToSpriteRenderer();
  113. resolver.spriteLibChanged = true;
  114. }
  115. }
  116. static void CopySpriteLibraryToOverride(List<SpriteLibCategoryOverride> libOverride, SerializedProperty lib)
  117. {
  118. libOverride.Clear();
  119. if (lib.arraySize == 0)
  120. return;
  121. var categoryEntries = lib.GetArrayElementAtIndex(0);
  122. for (var i = 0; i < lib.arraySize; ++i)
  123. {
  124. var overrideCategory = new SpriteLibCategoryOverride()
  125. {
  126. categoryList = new List<SpriteCategoryEntry>(),
  127. entryOverrideCount = 0,
  128. fromMain = false,
  129. name = categoryEntries.FindPropertyRelative(SpriteLibraryPropertyString.name).stringValue,
  130. overrideEntries = new List<SpriteCategoryEntryOverride>()
  131. };
  132. var entries = categoryEntries.FindPropertyRelative(SpriteLibraryPropertyString.categoryList);
  133. var overrideCategoryEntries = overrideCategory.overrideEntries;
  134. if (entries.arraySize > 0)
  135. {
  136. var entry = entries.GetArrayElementAtIndex(0);
  137. for (var j = 0; j < entries.arraySize; ++j)
  138. {
  139. overrideCategoryEntries.Add(new SpriteCategoryEntryOverride()
  140. {
  141. fromMain = false,
  142. name = entry.FindPropertyRelative(SpriteLibraryPropertyString.name).stringValue,
  143. sprite = (Sprite)entry.FindPropertyRelative(SpriteLibraryPropertyString.sprite).objectReferenceValue,
  144. spriteOverride = (Sprite)entry.FindPropertyRelative(SpriteLibraryPropertyString.sprite).objectReferenceValue
  145. });
  146. entry.Next(false);
  147. }
  148. }
  149. libOverride.Add(overrideCategory);
  150. categoryEntries.Next(false);
  151. }
  152. }
  153. static void CopyOverrideToSpriteLibrary(List<SpriteLibCategoryOverride> libOverride, SerializedProperty lib)
  154. {
  155. lib.arraySize = 0;
  156. if (libOverride.Count == 0)
  157. return;
  158. for (var i = 0; i < libOverride.Count; ++i)
  159. {
  160. var libOverrideElement = libOverride[i];
  161. if (!libOverrideElement.fromMain || libOverrideElement.entryOverrideCount > 0)
  162. {
  163. lib.arraySize += 1;
  164. var libElement = lib.GetArrayElementAtIndex(lib.arraySize - 1);
  165. libElement.FindPropertyRelative(SpriteLibraryPropertyString.name).stringValue = libOverrideElement.name;
  166. var overrideEntries = libOverrideElement.overrideEntries;
  167. var entries = libElement.FindPropertyRelative(SpriteLibraryPropertyString.categoryList);
  168. entries.arraySize = 0;
  169. if (overrideEntries.Count > 0)
  170. {
  171. for (var j = 0; j < overrideEntries.Count; ++j)
  172. {
  173. var overrideEntry = overrideEntries[j];
  174. if (!overrideEntry.fromMain ||
  175. overrideEntry.sprite != overrideEntry.spriteOverride)
  176. {
  177. entries.arraySize += 1;
  178. var entry = entries.GetArrayElementAtIndex(entries.arraySize - 1);
  179. entry.FindPropertyRelative(SpriteLibraryPropertyString.name).stringValue = overrideEntry.name;
  180. entry.FindPropertyRelative(SpriteLibraryPropertyString.sprite).objectReferenceValue = overrideEntry.spriteOverride;
  181. }
  182. }
  183. }
  184. }
  185. }
  186. }
  187. }
  188. }