diff --git a/spine-unity/Assets/Spine/Editor/spine-unity/Editor/AssetDatabaseAvailabilityDetector.cs b/spine-unity/Assets/Spine/Editor/spine-unity/Editor/AssetDatabaseAvailabilityDetector.cs index ec76a4a78..398f0c176 100644 --- a/spine-unity/Assets/Spine/Editor/spine-unity/Editor/AssetDatabaseAvailabilityDetector.cs +++ b/spine-unity/Assets/Spine/Editor/spine-unity/Editor/AssetDatabaseAvailabilityDetector.cs @@ -32,20 +32,20 @@ using UnityEngine; namespace Spine.Unity.Editor { public static class AssetDatabaseAvailabilityDetector { - const string MARKER_RESOURCE_NAME = "SpineAssetDatabaseMarker"; - private static bool _isMarkerLoaded; + const string MarkerResourceName = "SpineAssetDatabaseMarker"; + private static bool isMarkerLoaded; public static bool IsAssetDatabaseAvailable (bool forceCheck = false) { - if (!forceCheck && _isMarkerLoaded) + if (!forceCheck && isMarkerLoaded) return true; - TextAsset markerTextAsset = Resources.Load(MARKER_RESOURCE_NAME); - _isMarkerLoaded = markerTextAsset != null; + TextAsset markerTextAsset = Resources.Load(AssetDatabaseAvailabilityDetector.MarkerResourceName); + isMarkerLoaded = markerTextAsset != null; if (markerTextAsset != null) { Resources.UnloadAsset(markerTextAsset); } - return _isMarkerLoaded; + return isMarkerLoaded; } } } diff --git a/spine-unity/Assets/Spine/Editor/spine-unity/Editor/SkeletonDebugWindow.cs b/spine-unity/Assets/Spine/Editor/spine-unity/Editor/SkeletonDebugWindow.cs index abab90f5e..604619bdc 100644 --- a/spine-unity/Assets/Spine/Editor/spine-unity/Editor/SkeletonDebugWindow.cs +++ b/spine-unity/Assets/Spine/Editor/spine-unity/Editor/SkeletonDebugWindow.cs @@ -228,11 +228,11 @@ namespace Spine.Unity.Editor { EditorGUI.EndDisabledGroup(); // Flip - EditorGUILayout.BeginHorizontal(GUILayout.MaxWidth(160f)); - EditorGUILayout.LabelField("Scale", GUILayout.MaxWidth(EditorGUIUtility.labelWidth - 20f)); - skeleton.ScaleX = EditorGUILayout.DelayedFloatField(".ScaleX", skeleton.ScaleX, GUILayout.MaxWidth(70f)); - skeleton.ScaleY = EditorGUILayout.DelayedFloatField(".ScaleY", skeleton.ScaleY, GUILayout.MaxWidth(70f)); - GUILayout.EndHorizontal(); + skeleton.ScaleX = EditorGUILayout.DelayedFloatField(".ScaleX", skeleton.ScaleX); + skeleton.ScaleY = EditorGUILayout.DelayedFloatField(".ScaleY", skeleton.ScaleY); + //EditorGUILayout.BeginHorizontal(GUILayout.MaxWidth(160f)); + ////EditorGUILayout.LabelField("Scale", GUILayout.Width(EditorGUIUtility.labelWidth - 20f)); + //GUILayout.EndHorizontal(); // Color skeleton.SetColor(EditorGUILayout.ColorField(".R .G .B .A", skeleton.GetColor())); diff --git a/spine-unity/Assets/Spine/Editor/spine-unity/Editor/SpineAtlasAssetInspector.cs b/spine-unity/Assets/Spine/Editor/spine-unity/Editor/SpineAtlasAssetInspector.cs index 758bfe748..f068cb2a3 100644 --- a/spine-unity/Assets/Spine/Editor/spine-unity/Editor/SpineAtlasAssetInspector.cs +++ b/spine-unity/Assets/Spine/Editor/spine-unity/Editor/SpineAtlasAssetInspector.cs @@ -134,7 +134,7 @@ namespace Spine.Unity.Editor { } EditorGUILayout.Space(); - if (SpineInspectorUtility.LargeCenteredButton(SpineInspectorUtility.TempContent("Set Mipmap Bias to " + SpineEditorUtilities.Preferences.DEFAULT_MIPMAPBIAS))) { + if (SpineInspectorUtility.LargeCenteredButton(SpineInspectorUtility.TempContent("Set Mipmap Bias to " + SpineEditorUtilities.Preferences.DEFAULT_MIPMAPBIAS, tooltip: "This may help textures with mipmaps be less blurry when used for 2D sprites."))) { foreach (var m in atlasAsset.materials) { var texture = m.mainTexture; texture.mipMapBias = SpineEditorUtilities.Preferences.DEFAULT_MIPMAPBIAS; @@ -261,12 +261,18 @@ namespace Spine.Unity.Editor { } #else if (atlasFile.objectReferenceValue != null) { - EditorGUILayout.LabelField("Atlas Regions", EditorStyles.boldLabel); + + int baseIndent = EditorGUI.indentLevel; var regions = SpineAtlasAssetInspector.GetRegions(atlasAsset.GetAtlas()); + int regionsCount = regions.Count; + using (new EditorGUILayout.HorizontalScope()) { + EditorGUILayout.LabelField("Atlas Regions", EditorStyles.boldLabel); + EditorGUILayout.LabelField(string.Format("{0} regions total", regionsCount)); + } AtlasPage lastPage = null; - for (int i = 0; i < regions.Count; i++) { + for (int i = 0; i < regionsCount; i++) { if (lastPage != regions[i].page) { if (lastPage != null) { EditorGUILayout.Separator(); diff --git a/spine-unity/Assets/Spine/Editor/spine-unity/Editor/SpineEditorUtilities.cs b/spine-unity/Assets/Spine/Editor/spine-unity/Editor/SpineEditorUtilities.cs index 1b4e5d701..5043aa1fd 100644 --- a/spine-unity/Assets/Spine/Editor/spine-unity/Editor/SpineEditorUtilities.cs +++ b/spine-unity/Assets/Spine/Editor/spine-unity/Editor/SpineEditorUtilities.cs @@ -1165,15 +1165,13 @@ namespace Spine.Unity.Editor { internal static readonly List additionalSpawnTypes = new List(); - public static void IngestAdvancedRenderSettings (SkeletonRenderer skeletonRenderer) { + public static void TryInitializeSkeletonRendererSettings (SkeletonRenderer skeletonRenderer, Skin skin = null) { const string PMAShaderQuery = "Spine/Skeleton"; const string TintBlackShaderQuery = "Tint Black"; - if (skeletonRenderer == null) - return; + if (skeletonRenderer == null) return; var skeletonDataAsset = skeletonRenderer.skeletonDataAsset; - if (skeletonDataAsset == null) - return; + if (skeletonDataAsset == null) return; bool pmaVertexColors = false; bool tintBlack = false; @@ -1199,6 +1197,14 @@ namespace Spine.Unity.Editor { skeletonRenderer.pmaVertexColors = pmaVertexColors; skeletonRenderer.tintBlack = tintBlack; + skeletonRenderer.zSpacing = SpineEditorUtilities.Preferences.defaultZSpacing; + + var data = skeletonDataAsset.GetSkeletonData(false); + bool noSkins = data.DefaultSkin == null && (data.Skins == null || data.Skins.Count == 0); // Support attachmentless/skinless SkeletonData. + skin = skin ?? data.DefaultSkin ?? (noSkins ? null : data.Skins.Items[0]); + if (skin != null) { + skeletonRenderer.initialSkinName = skin.Name; + } } public static SkeletonAnimation InstantiateSkeletonAnimation (SkeletonDataAsset skeletonDataAsset, string skinName, bool destroyInvalid = true) { @@ -1227,8 +1233,9 @@ namespace Spine.Unity.Editor { GameObject go = new GameObject(spineGameObjectName, typeof(MeshFilter), typeof(MeshRenderer), typeof(SkeletonAnimation)); SkeletonAnimation newSkeletonAnimation = go.GetComponent(); newSkeletonAnimation.skeletonDataAsset = skeletonDataAsset; - IngestAdvancedRenderSettings(newSkeletonAnimation); + TryInitializeSkeletonRendererSettings(newSkeletonAnimation, skin); + // Initialize try { newSkeletonAnimation.Initialize(false); } catch (System.Exception e) { @@ -1239,16 +1246,6 @@ namespace Spine.Unity.Editor { throw e; } - // Set Defaults - bool noSkins = data.DefaultSkin == null && (data.Skins == null || data.Skins.Count == 0); // Support attachmentless/skinless SkeletonData. - skin = skin ?? data.DefaultSkin ?? (noSkins ? null : data.Skins.Items[0]); - if (skin != null) { - newSkeletonAnimation.initialSkinName = skin.Name; - newSkeletonAnimation.skeleton.SetSkin(skin); - } - - newSkeletonAnimation.zSpacing = SpineEditorUtilities.Preferences.defaultZSpacing; - newSkeletonAnimation.skeleton.Update(0); newSkeletonAnimation.state.Update(0); newSkeletonAnimation.state.Apply(newSkeletonAnimation.skeleton); @@ -1274,7 +1271,22 @@ namespace Spine.Unity.Editor { return InstantiateSkeletonMecanim(skeletonDataAsset, skeletonDataAsset.GetSkeletonData(true).FindSkin(skinName)); } - public static SkeletonMecanim InstantiateSkeletonMecanim (SkeletonDataAsset skeletonDataAsset, Skin skin = null) { + public static SkeletonMecanim InstantiateSkeletonMecanim (SkeletonDataAsset skeletonDataAsset, Skin skin = null, bool destroyInvalid = true) { + SkeletonData data = skeletonDataAsset.GetSkeletonData(true); + + if (data == null) { + for (int i = 0; i < skeletonDataAsset.atlasAssets.Length; i++) { + string reloadAtlasPath = AssetDatabase.GetAssetPath(skeletonDataAsset.atlasAssets[i]); + skeletonDataAsset.atlasAssets[i] = (AtlasAssetBase)AssetDatabase.LoadAssetAtPath(reloadAtlasPath, typeof(AtlasAssetBase)); + } + data = skeletonDataAsset.GetSkeletonData(false); + } + + if (data == null) { + Debug.LogWarning("InstantiateSkeletonMecanim tried to instantiate a skeleton from an invalid SkeletonDataAsset."); + return null; + } + string spineGameObjectName = string.Format("Spine Mecanim GameObject ({0})", skeletonDataAsset.name.Replace("_SkeletonData", "")); GameObject go = new GameObject(spineGameObjectName, typeof(MeshFilter), typeof(MeshRenderer), typeof(Animator), typeof(SkeletonMecanim)); @@ -1285,32 +1297,26 @@ namespace Spine.Unity.Editor { go.GetComponent().runtimeAnimatorController = skeletonDataAsset.controller; - SkeletonMecanim anim = go.GetComponent(); - anim.skeletonDataAsset = skeletonDataAsset; - IngestAdvancedRenderSettings(anim); + SkeletonMecanim newSkeletonMecanim = go.GetComponent(); + newSkeletonMecanim.skeletonDataAsset = skeletonDataAsset; + TryInitializeSkeletonRendererSettings(newSkeletonMecanim, skin); - SkeletonData data = skeletonDataAsset.GetSkeletonData(true); - if (data == null) { - for (int i = 0; i < skeletonDataAsset.atlasAssets.Length; i++) { - string reloadAtlasPath = AssetDatabase.GetAssetPath(skeletonDataAsset.atlasAssets[i]); - skeletonDataAsset.atlasAssets[i] = (AtlasAssetBase)AssetDatabase.LoadAssetAtPath(reloadAtlasPath, typeof(AtlasAssetBase)); + // Initialize + try { + newSkeletonMecanim.Initialize(false); + } catch (System.Exception e) { + if (destroyInvalid) { + Debug.LogWarning("Editor-instantiated SkeletonAnimation threw an Exception. Destroying GameObject to prevent orphaned GameObject."); + GameObject.DestroyImmediate(go); } - data = skeletonDataAsset.GetSkeletonData(true); + throw e; } - // Set defaults - skin = skin ?? data.DefaultSkin ?? data.Skins.Items[0]; - anim.zSpacing = SpineEditorUtilities.Preferences.defaultZSpacing; + newSkeletonMecanim.skeleton.Update(0); + newSkeletonMecanim.skeleton.UpdateWorldTransform(); + newSkeletonMecanim.LateUpdate(); - anim.Initialize(false); - anim.skeleton.SetSkin(skin); - anim.initialSkinName = skin.Name; - - anim.skeleton.Update(0); - anim.skeleton.UpdateWorldTransform(); - anim.LateUpdate(); - - return anim; + return newSkeletonMecanim; } #endif #endregion diff --git a/spine-unity/Assets/Spine/Runtime/spine-unity/Asset Types/SkeletonDataAsset.cs b/spine-unity/Assets/Spine/Runtime/spine-unity/Asset Types/SkeletonDataAsset.cs index 544a7a782..fe2f90b12 100644 --- a/spine-unity/Assets/Spine/Runtime/spine-unity/Asset Types/SkeletonDataAsset.cs +++ b/spine-unity/Assets/Spine/Runtime/spine-unity/Asset Types/SkeletonDataAsset.cs @@ -100,6 +100,13 @@ namespace Spine.Unity { stateData = null; } + public AnimationStateData GetAnimationStateData () { + if (stateData != null) + return stateData; + GetSkeletonData(false); + return stateData; + } + /// Loads, caches and returns the SkeletonData from the skeleton data file. Returns the cached SkeletonData after the first time it is called. Pass false to prevent direct errors from being logged. public SkeletonData GetSkeletonData (bool quiet) { if (skeletonJSON == null) { @@ -187,6 +194,18 @@ namespace Spine.Unity { FillStateData(); } + public void FillStateData () { + if (stateData != null) { + stateData.defaultMix = defaultMix; + + for (int i = 0, n = fromAnimation.Length; i < n; i++) { + if (fromAnimation[i].Length == 0 || toAnimation[i].Length == 0) + continue; + stateData.SetMix(fromAnimation[i], toAnimation[i], duration[i]); + } + } + } + internal Atlas[] GetAtlasArray () { var returnList = new System.Collections.Generic.List(atlasAssets.Length); for (int i = 0; i < atlasAssets.Length; i++) { @@ -215,25 +234,6 @@ namespace Spine.Unity { return json.ReadSkeletonData(input); } - public void FillStateData () { - if (stateData != null) { - stateData.defaultMix = defaultMix; - - for (int i = 0, n = fromAnimation.Length; i < n; i++) { - if (fromAnimation[i].Length == 0 || toAnimation[i].Length == 0) - continue; - stateData.SetMix(fromAnimation[i], toAnimation[i], duration[i]); - } - } - } - - public AnimationStateData GetAnimationStateData () { - if (stateData != null) - return stateData; - GetSkeletonData(false); - return stateData; - } - } } diff --git a/spine-unity/Assets/Spine/Runtime/spine-unity/Asset Types/SpineAtlasAsset.cs b/spine-unity/Assets/Spine/Runtime/spine-unity/Asset Types/SpineAtlasAsset.cs index a7d88979a..fd3ff9e64 100644 --- a/spine-unity/Assets/Spine/Runtime/spine-unity/Asset Types/SpineAtlasAsset.cs +++ b/spine-unity/Assets/Spine/Runtime/spine-unity/Asset Types/SpineAtlasAsset.cs @@ -115,8 +115,6 @@ namespace Spine.Unity { } #endregion - - void Reset () { Clear(); }