123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170 |
- // Animancer // https://kybernetik.com.au/animancer // Copyright 2018-2024 Kybernetik //
- #if UNITY_EDITOR
- using Animancer.TransitionLibraries;
- using System.Collections.Generic;
- using UnityEditor;
- using UnityEngine;
- namespace Animancer.Editor.TransitionLibraries
- {
- /// <summary>[Editor-Only]
- /// Additional data for a <see cref="TransitionLibraryAsset"/> which is excluded from Runtime Builds.
- /// </summary>
- /// https://kybernetik.com.au/animancer/api/Animancer.Editor.TransitionLibraries/TransitionLibraryEditorData
- [AnimancerHelpUrl(typeof(TransitionLibraryEditorData))]
- public partial class TransitionLibraryEditorData : ScriptableObject
- {
- /************************************************************************************************************************/
- private static readonly Dictionary<TransitionLibraryAsset, TransitionLibraryEditorData>
- LibraryToEditorData = new();
- /************************************************************************************************************************/
- [SerializeField, HideInInspector]
- private TransitionLibraryAsset _Library;
- /// <summary>The library this data is associated with.</summary>
- public TransitionLibraryAsset Library
- {
- get => _Library;
- private set
- {
- if (_Library == value)
- return;
- if (_Library != null)
- LibraryToEditorData.Remove(_Library);
- _Library = value;
- EditorUtility.SetDirty(this);
- if (_Library != null)
- LibraryToEditorData.Add(_Library, this);
- }
- }
- /************************************************************************************************************************/
- /// <summary>Registers this data for the <see cref="Library"/>.</summary>
- protected virtual void OnEnable()
- {
- if (_Library != null)
- LibraryToEditorData[_Library] = this;
- }
- /// <summary>Un-registers this data for the <see cref="Library"/>.</summary>
- protected virtual void OnDisable()
- {
- if (_Library != null)
- LibraryToEditorData.Remove(_Library);
- }
- /************************************************************************************************************************/
- /// <summary>Tries to get the `data` associated with the `library`.</summary>
- private static bool TryGet(
- TransitionLibraryAsset library,
- out TransitionLibraryEditorData data)
- {
- if (!LibraryToEditorData.TryGetValue(library, out data))
- return false;
- if (data != null)
- {
- data.Library = library;
- return true;
- }
- LibraryToEditorData.Remove(library);
- return false;
- }
- /************************************************************************************************************************/
- /// <summary>
- /// Returns the <see cref="TransitionLibraryEditorData"/> sub-asset of the `library` if one exists.
- /// </summary>
- public static TransitionLibraryEditorData GetEditorData(TransitionLibraryAsset library)
- {
- if (TryGet(library, out var data))
- return data;
- var assetPath = AssetDatabase.GetAssetPath(library);
- if (string.IsNullOrEmpty(assetPath))
- return null;
- var subAssets = AssetDatabase.LoadAllAssetsAtPath(assetPath);
- for (int i = 0; i < subAssets.Length; i++)
- {
- if (subAssets[i] is TransitionLibraryEditorData editorData)
- {
- editorData.Library = library;
- return editorData;
- }
- }
- return null;
- }
- /************************************************************************************************************************/
- /// <summary>
- /// Returns the <see cref="TransitionLibraryEditorData"/> sub-asset of the `library` if one exists.
- /// Otherwise, creates and saves a new one.
- /// </summary>
- public static TransitionLibraryEditorData GetOrCreateEditorData(TransitionLibraryAsset library)
- {
- var data = library.GetEditorData();
- if (data != null)
- return data;
- data = CreateInstance<TransitionLibraryEditorData>();
- data.name = "Editor Data";
- data.hideFlags = HideFlags.DontSaveInBuild | HideFlags.HideInHierarchy;
- data.Library = library;
- EditorApplication.CallbackFunction addSubAsset = null;
- addSubAsset = () =>
- {
- if (AssetDatabase.Contains(library))
- {
- EditorApplication.update -= addSubAsset;
- AssetDatabase.AddObjectToAsset(data, library);
- AssetDatabase.SaveAssets();
- }
- };
- EditorApplication.update += addSubAsset;
- return data;
- }
- /************************************************************************************************************************/
- }
- /// <summary>[Editor-Only] Extension methods for <see cref="TransitionLibraryEditorData"/>.</summary>
- /// https://kybernetik.com.au/animancer/api/Animancer.Editor.TransitionLibraries/TransitionLibraryEditorDataExtensions
- public static class TransitionLibraryEditorDataExtensions
- {
- /************************************************************************************************************************/
- /// <summary><see cref="TransitionLibraryEditorData.GetEditorData"/></summary>
- public static TransitionLibraryEditorData GetEditorData(this TransitionLibraryAsset library)
- => TransitionLibraryEditorData.GetEditorData(library);
- /// <summary><see cref="TransitionLibraryEditorData.GetOrCreateEditorData"/></summary>
- public static TransitionLibraryEditorData GetOrCreateEditorData(this TransitionLibraryAsset library)
- => TransitionLibraryEditorData.GetOrCreateEditorData(library);
- /************************************************************************************************************************/
- }
- }
- #endif
|