diff --git a/spine-unity/Assets/Spine/Editor/spine-unity/Editor/Asset Types/SkeletonDataAssetInspector.cs b/spine-unity/Assets/Spine/Editor/spine-unity/Editor/Asset Types/SkeletonDataAssetInspector.cs index be77de911..bf3a76b56 100644 --- a/spine-unity/Assets/Spine/Editor/spine-unity/Editor/Asset Types/SkeletonDataAssetInspector.cs +++ b/spine-unity/Assets/Spine/Editor/spine-unity/Editor/Asset Types/SkeletonDataAssetInspector.cs @@ -154,7 +154,7 @@ namespace Spine.Unity.Editor { void Clear () { preview.Clear(); - targetSkeletonDataAsset.Clear(); + SpineEditorUtilities.ClearSkeletonDataAsset(targetSkeletonDataAsset); targetSkeletonData = null; } diff --git a/spine-unity/Assets/Spine/Editor/spine-unity/Editor/Utility/AssetUtility.cs b/spine-unity/Assets/Spine/Editor/spine-unity/Editor/Utility/AssetUtility.cs index 7542516bb..92c4d41cf 100644 --- a/spine-unity/Assets/Spine/Editor/spine-unity/Editor/Utility/AssetUtility.cs +++ b/spine-unity/Assets/Spine/Editor/spine-unity/Editor/Utility/AssetUtility.cs @@ -493,7 +493,7 @@ namespace Spine.Unity.Editor { } Debug.LogFormat("Changes to '{0}' or atlas detected. Clearing SkeletonDataAsset: {1}", skeletonJSONPath, localPath); - skeletonDataAsset.Clear(); + SpineEditorUtilities.ClearSkeletonDataAsset(skeletonDataAsset); string guid = AssetDatabase.AssetPathToGUID(AssetDatabase.GetAssetPath(skeletonDataAsset)); string lastHash = EditorPrefs.GetString(guid + "_hash"); @@ -978,7 +978,7 @@ namespace Spine.Unity.Editor { AssetDatabase.CreateAsset(skeletonDataAsset, filePath); } else { skeletonDataAsset.atlasAssets = atlasAssets; - skeletonDataAsset.Clear(); + SpineEditorUtilities.ClearSkeletonDataAsset(skeletonDataAsset); } var skeletonData = skeletonDataAsset.GetSkeletonData(true); if (skeletonData != null) diff --git a/spine-unity/Assets/Spine/Editor/spine-unity/Editor/Utility/BlendModeMaterialsUtility.cs b/spine-unity/Assets/Spine/Editor/spine-unity/Editor/Utility/BlendModeMaterialsUtility.cs index d7a3977a9..476b2d556 100644 --- a/spine-unity/Assets/Spine/Editor/spine-unity/Editor/Utility/BlendModeMaterialsUtility.cs +++ b/spine-unity/Assets/Spine/Editor/spine-unity/Editor/Utility/BlendModeMaterialsUtility.cs @@ -96,7 +96,7 @@ namespace Spine.Unity.Editor { } } - skeletonDataAsset.Clear(); + SpineEditorUtilities.ClearSkeletonDataAsset(skeletonDataAsset); skeletonData = skeletonDataAsset.GetSkeletonData(true); if (anyMaterialsChanged) ReloadSceneSkeletons(skeletonDataAsset); @@ -164,7 +164,7 @@ namespace Spine.Unity.Editor { var skinEntries = new List(); - skeletonDataAsset.Clear(); + SpineEditorUtilities.ClearSkeletonDataAsset(skeletonDataAsset); skeletonDataAsset.isUpgradingBlendModeMaterials = true; SkeletonData skeletonData = skeletonDataAsset.GetSkeletonData(true); diff --git a/spine-unity/Assets/Spine/Editor/spine-unity/Editor/Utility/DataReloadHandler.cs b/spine-unity/Assets/Spine/Editor/spine-unity/Editor/Utility/DataReloadHandler.cs index 2125ff616..d29be7b9e 100644 --- a/spine-unity/Assets/Spine/Editor/spine-unity/Editor/Utility/DataReloadHandler.cs +++ b/spine-unity/Assets/Spine/Editor/spine-unity/Editor/Utility/DataReloadHandler.cs @@ -91,8 +91,7 @@ namespace Spine.Unity.Editor { } foreach (var skeletonDataAsset in skeletonDataAssetsToReload) { - skeletonDataAsset.Clear(); - skeletonDataAsset.GetSkeletonData(true); + ReloadSkeletonDataAsset(skeletonDataAsset, false); } foreach (var skeletonRenderer in activeSkeletonRenderers) @@ -119,14 +118,24 @@ namespace Spine.Unity.Editor { } } + public static void ClearAnimationReferenceAssets (SkeletonDataAsset skeletonDataAsset) { + ForEachAnimationReferenceAsset(skeletonDataAsset, (referenceAsset) => referenceAsset.Clear()); + } + public static void ReloadAnimationReferenceAssets (SkeletonDataAsset skeletonDataAsset) { + ForEachAnimationReferenceAsset(skeletonDataAsset, (referenceAsset) => referenceAsset.Initialize()); + } + + private static void ForEachAnimationReferenceAsset (SkeletonDataAsset skeletonDataAsset, + System.Action func) { + string[] guids = UnityEditor.AssetDatabase.FindAssets("t:AnimationReferenceAsset"); foreach (string guid in guids) { string path = UnityEditor.AssetDatabase.GUIDToAssetPath(guid); if (!string.IsNullOrEmpty(path)) { var referenceAsset = UnityEditor.AssetDatabase.LoadAssetAtPath(path); if (referenceAsset.SkeletonDataAsset == skeletonDataAsset) - referenceAsset.Initialize(); + func(referenceAsset); } } } diff --git a/spine-unity/Assets/Spine/Editor/spine-unity/Editor/Utility/SpineEditorUtilities.cs b/spine-unity/Assets/Spine/Editor/spine-unity/Editor/Utility/SpineEditorUtilities.cs index 49ae43cdf..ad0f488f4 100644 --- a/spine-unity/Assets/Spine/Editor/spine-unity/Editor/Utility/SpineEditorUtilities.cs +++ b/spine-unity/Assets/Spine/Editor/spine-unity/Editor/Utility/SpineEditorUtilities.cs @@ -266,14 +266,23 @@ namespace Spine.Unity.Editor { ReinitializeComponent(component); } - public static void ReloadSkeletonDataAsset (SkeletonDataAsset skeletonDataAsset) { - if (skeletonDataAsset != null) { + public static void ClearSkeletonDataAsset (SkeletonDataAsset skeletonDataAsset) { + skeletonDataAsset.Clear(); + DataReloadHandler.ClearAnimationReferenceAssets(skeletonDataAsset); + } + + public static void ReloadSkeletonDataAsset (SkeletonDataAsset skeletonDataAsset, bool clearAtlasAssets = true) { + if (skeletonDataAsset == null) + return; + + if (clearAtlasAssets) { foreach (AtlasAssetBase aa in skeletonDataAsset.atlasAssets) { if (aa != null) aa.Clear(); } - skeletonDataAsset.Clear(); } + ClearSkeletonDataAsset(skeletonDataAsset); skeletonDataAsset.GetSkeletonData(true); + DataReloadHandler.ReloadAnimationReferenceAssets(skeletonDataAsset); } public static void ReinitializeComponent (SkeletonRenderer component) { diff --git a/spine-unity/Assets/Spine/Runtime/spine-unity/Asset Types/AnimationReferenceAsset.cs b/spine-unity/Assets/Spine/Runtime/spine-unity/Asset Types/AnimationReferenceAsset.cs index 370704331..9564f3bb0 100644 --- a/spine-unity/Assets/Spine/Runtime/spine-unity/Asset Types/AnimationReferenceAsset.cs +++ b/spine-unity/Assets/Spine/Runtime/spine-unity/Asset Types/AnimationReferenceAsset.cs @@ -48,11 +48,16 @@ namespace Spine.Unity { if (animation == null) Initialize(); #endif - return animation; } } + /// Clears the cached animation corresponding to a loaded SkeletonData object. + /// Use this to force a reload for the next time Animation is called. + public void Clear () { + animation = null; + } + public void Initialize () { if (skeletonDataAsset == null) return; SkeletonData skeletonData = skeletonDataAsset.GetSkeletonData(AnimationReferenceAsset.QuietSkeletonData);