// 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 { /// [Editor-Only] /// Additional data for a which is excluded from Runtime Builds. /// /// https://kybernetik.com.au/animancer/api/Animancer.Editor.TransitionLibraries/TransitionLibraryEditorData [AnimancerHelpUrl(typeof(TransitionLibraryEditorData))] public partial class TransitionLibraryEditorData : ScriptableObject { /************************************************************************************************************************/ private static readonly Dictionary LibraryToEditorData = new(); /************************************************************************************************************************/ [SerializeField, HideInInspector] private TransitionLibraryAsset _Library; /// The library this data is associated with. 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); } } /************************************************************************************************************************/ /// Registers this data for the . protected virtual void OnEnable() { if (_Library != null) LibraryToEditorData[_Library] = this; } /// Un-registers this data for the . protected virtual void OnDisable() { if (_Library != null) LibraryToEditorData.Remove(_Library); } /************************************************************************************************************************/ /// Tries to get the `data` associated with the `library`. 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; } /************************************************************************************************************************/ /// /// Returns the sub-asset of the `library` if one exists. /// 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; } /************************************************************************************************************************/ /// /// Returns the sub-asset of the `library` if one exists. /// Otherwise, creates and saves a new one. /// public static TransitionLibraryEditorData GetOrCreateEditorData(TransitionLibraryAsset library) { var data = library.GetEditorData(); if (data != null) return data; data = CreateInstance(); 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; } /************************************************************************************************************************/ } /// [Editor-Only] Extension methods for . /// https://kybernetik.com.au/animancer/api/Animancer.Editor.TransitionLibraries/TransitionLibraryEditorDataExtensions public static class TransitionLibraryEditorDataExtensions { /************************************************************************************************************************/ /// public static TransitionLibraryEditorData GetEditorData(this TransitionLibraryAsset library) => TransitionLibraryEditorData.GetEditorData(library); /// public static TransitionLibraryEditorData GetOrCreateEditorData(this TransitionLibraryAsset library) => TransitionLibraryEditorData.GetOrCreateEditorData(library); /************************************************************************************************************************/ } } #endif