TransitionLibraryEditorData.cs 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170
  1. // Animancer // https://kybernetik.com.au/animancer // Copyright 2018-2024 Kybernetik //
  2. #if UNITY_EDITOR
  3. using Animancer.TransitionLibraries;
  4. using System.Collections.Generic;
  5. using UnityEditor;
  6. using UnityEngine;
  7. namespace Animancer.Editor.TransitionLibraries
  8. {
  9. /// <summary>[Editor-Only]
  10. /// Additional data for a <see cref="TransitionLibraryAsset"/> which is excluded from Runtime Builds.
  11. /// </summary>
  12. /// https://kybernetik.com.au/animancer/api/Animancer.Editor.TransitionLibraries/TransitionLibraryEditorData
  13. [AnimancerHelpUrl(typeof(TransitionLibraryEditorData))]
  14. public partial class TransitionLibraryEditorData : ScriptableObject
  15. {
  16. /************************************************************************************************************************/
  17. private static readonly Dictionary<TransitionLibraryAsset, TransitionLibraryEditorData>
  18. LibraryToEditorData = new();
  19. /************************************************************************************************************************/
  20. [SerializeField, HideInInspector]
  21. private TransitionLibraryAsset _Library;
  22. /// <summary>The library this data is associated with.</summary>
  23. public TransitionLibraryAsset Library
  24. {
  25. get => _Library;
  26. private set
  27. {
  28. if (_Library == value)
  29. return;
  30. if (_Library != null)
  31. LibraryToEditorData.Remove(_Library);
  32. _Library = value;
  33. EditorUtility.SetDirty(this);
  34. if (_Library != null)
  35. LibraryToEditorData.Add(_Library, this);
  36. }
  37. }
  38. /************************************************************************************************************************/
  39. /// <summary>Registers this data for the <see cref="Library"/>.</summary>
  40. protected virtual void OnEnable()
  41. {
  42. if (_Library != null)
  43. LibraryToEditorData[_Library] = this;
  44. }
  45. /// <summary>Un-registers this data for the <see cref="Library"/>.</summary>
  46. protected virtual void OnDisable()
  47. {
  48. if (_Library != null)
  49. LibraryToEditorData.Remove(_Library);
  50. }
  51. /************************************************************************************************************************/
  52. /// <summary>Tries to get the `data` associated with the `library`.</summary>
  53. private static bool TryGet(
  54. TransitionLibraryAsset library,
  55. out TransitionLibraryEditorData data)
  56. {
  57. if (!LibraryToEditorData.TryGetValue(library, out data))
  58. return false;
  59. if (data != null)
  60. {
  61. data.Library = library;
  62. return true;
  63. }
  64. LibraryToEditorData.Remove(library);
  65. return false;
  66. }
  67. /************************************************************************************************************************/
  68. /// <summary>
  69. /// Returns the <see cref="TransitionLibraryEditorData"/> sub-asset of the `library` if one exists.
  70. /// </summary>
  71. public static TransitionLibraryEditorData GetEditorData(TransitionLibraryAsset library)
  72. {
  73. if (TryGet(library, out var data))
  74. return data;
  75. var assetPath = AssetDatabase.GetAssetPath(library);
  76. if (string.IsNullOrEmpty(assetPath))
  77. return null;
  78. var subAssets = AssetDatabase.LoadAllAssetsAtPath(assetPath);
  79. for (int i = 0; i < subAssets.Length; i++)
  80. {
  81. if (subAssets[i] is TransitionLibraryEditorData editorData)
  82. {
  83. editorData.Library = library;
  84. return editorData;
  85. }
  86. }
  87. return null;
  88. }
  89. /************************************************************************************************************************/
  90. /// <summary>
  91. /// Returns the <see cref="TransitionLibraryEditorData"/> sub-asset of the `library` if one exists.
  92. /// Otherwise, creates and saves a new one.
  93. /// </summary>
  94. public static TransitionLibraryEditorData GetOrCreateEditorData(TransitionLibraryAsset library)
  95. {
  96. var data = library.GetEditorData();
  97. if (data != null)
  98. return data;
  99. data = CreateInstance<TransitionLibraryEditorData>();
  100. data.name = "Editor Data";
  101. data.hideFlags = HideFlags.DontSaveInBuild | HideFlags.HideInHierarchy;
  102. data.Library = library;
  103. EditorApplication.CallbackFunction addSubAsset = null;
  104. addSubAsset = () =>
  105. {
  106. if (AssetDatabase.Contains(library))
  107. {
  108. EditorApplication.update -= addSubAsset;
  109. AssetDatabase.AddObjectToAsset(data, library);
  110. AssetDatabase.SaveAssets();
  111. }
  112. };
  113. EditorApplication.update += addSubAsset;
  114. return data;
  115. }
  116. /************************************************************************************************************************/
  117. }
  118. /// <summary>[Editor-Only] Extension methods for <see cref="TransitionLibraryEditorData"/>.</summary>
  119. /// https://kybernetik.com.au/animancer/api/Animancer.Editor.TransitionLibraries/TransitionLibraryEditorDataExtensions
  120. public static class TransitionLibraryEditorDataExtensions
  121. {
  122. /************************************************************************************************************************/
  123. /// <summary><see cref="TransitionLibraryEditorData.GetEditorData"/></summary>
  124. public static TransitionLibraryEditorData GetEditorData(this TransitionLibraryAsset library)
  125. => TransitionLibraryEditorData.GetEditorData(library);
  126. /// <summary><see cref="TransitionLibraryEditorData.GetOrCreateEditorData"/></summary>
  127. public static TransitionLibraryEditorData GetOrCreateEditorData(this TransitionLibraryAsset library)
  128. => TransitionLibraryEditorData.GetOrCreateEditorData(library);
  129. /************************************************************************************************************************/
  130. }
  131. }
  132. #endif