// 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