From 801081eae0e6618b94930662eff3f84bf2bdb695 Mon Sep 17 00:00:00 2001 From: pharan Date: Fri, 5 Oct 2018 04:18:15 +0800 Subject: [PATCH] [unity] Improved edit mode data reloading. --- .../Editor/SkeletonDataAssetInspector.cs | 17 ++++-- .../Editor/SpineEditorUtilities.cs | 60 ++++++++++++++----- 2 files changed, 58 insertions(+), 19 deletions(-) diff --git a/spine-unity/Assets/Spine/Editor/spine-unity/Editor/SkeletonDataAssetInspector.cs b/spine-unity/Assets/Spine/Editor/spine-unity/Editor/SkeletonDataAssetInspector.cs index 292193a5f..c2e09f31e 100644 --- a/spine-unity/Assets/Spine/Editor/spine-unity/Editor/SkeletonDataAssetInspector.cs +++ b/spine-unity/Assets/Spine/Editor/spine-unity/Editor/SkeletonDataAssetInspector.cs @@ -184,6 +184,10 @@ namespace Spine.Unity.Editor { if (serializedObject.ApplyModifiedProperties()) { this.Clear(); this.InitializeEditor(); + + if (SpineEditorUtilities.Preferences.autoReloadSceneSkeletons) + SpineEditorUtilities.DataReloadHandler.ReloadSceneSkeletonComponents(targetSkeletonDataAsset); + return; } } @@ -269,7 +273,9 @@ namespace Spine.Unity.Editor { using (new SpineInspectorUtility.BoxScope()) { EditorGUILayout.LabelField("SkeletonData", EditorStyles.boldLabel); EditorGUILayout.PropertyField(skeletonJSON, SpineInspectorUtility.TempContent(skeletonJSON.displayName, Icons.spine)); - EditorGUILayout.PropertyField(scale); + EditorGUILayout.DelayedFloatField(scale); //EditorGUILayout.PropertyField(scale); + EditorGUILayout.Space(); + EditorGUILayout.PropertyField(skeletonDataModifiers, true); } // Texture source field. @@ -306,7 +312,7 @@ namespace Spine.Unity.Editor { } } EditorGUILayout.PropertyField(skeletonJSON, SpineInspectorUtility.TempContent(skeletonJSON.displayName, Icons.spine)); - EditorGUILayout.PropertyField(scale); + EditorGUILayout.DelayedFloatField(scale); //EditorGUILayout.PropertyField(scale); EditorGUILayout.Space(); EditorGUILayout.PropertyField(skeletonDataModifiers, true); } @@ -464,8 +470,11 @@ namespace Spine.Unity.Editor { using (new EditorGUILayout.HorizontalScope()) { showAttachments = EditorGUILayout.ToggleLeft("Show Attachments", showAttachments, GUILayout.MaxWidth(150f)); if (showAttachments) { - if (skin != null && skin != defaultSkin) - EditorGUILayout.LabelField(SpineInspectorUtility.TempContent(skin.Name, Icons.skin)); + if (skin != null) { + int attachmentCount = skin.Attachments.Count; + EditorGUILayout.LabelField(SpineInspectorUtility.TempContent(string.Format("{0} ({1} attachment{2})", skin.Name, attachmentCount, SpineInspectorUtility.PluralThenS(attachmentCount)), Icons.skin)); + } + } } 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 b6648ec2a..1b4e5d701 100644 --- a/spine-unity/Assets/Spine/Editor/spine-unity/Editor/SpineEditorUtilities.cs +++ b/spine-unity/Assets/Spine/Editor/spine-unity/Editor/SpineEditorUtilities.cs @@ -204,15 +204,15 @@ namespace Spine.Unity.Editor { // Data Refresh Edit Mode. // This prevents deserialized SkeletonData from persisting from play mode to edit mode. -//#if UNITY_2017_2_OR_NEWER -// EditorApplication.playModeStateChanged -= DataReloadHandler.OnPlaymodeStateChanged; -// EditorApplication.playModeStateChanged += DataReloadHandler.OnPlaymodeStateChanged; -// DataReloadHandler.OnPlaymodeStateChanged(PlayModeStateChange.EnteredEditMode); -//#else -// EditorApplication.playmodeStateChanged -= DataReloadHandler.OnPlaymodeStateChanged; -// EditorApplication.playmodeStateChanged += DataReloadHandler.OnPlaymodeStateChanged; -// DataReloadHandler.OnPlaymodeStateChanged(); -//#endif +#if UNITY_2017_2_OR_NEWER + EditorApplication.playModeStateChanged -= DataReloadHandler.OnPlaymodeStateChanged; + EditorApplication.playModeStateChanged += DataReloadHandler.OnPlaymodeStateChanged; + DataReloadHandler.OnPlaymodeStateChanged(PlayModeStateChange.EnteredEditMode); +#else + EditorApplication.playmodeStateChanged -= DataReloadHandler.OnPlaymodeStateChanged; + EditorApplication.playmodeStateChanged += DataReloadHandler.OnPlaymodeStateChanged; + DataReloadHandler.OnPlaymodeStateChanged(); +#endif initialized = true; } @@ -257,6 +257,10 @@ namespace Spine.Unity.Editor { public const float DEFAULT_SCENE_ICONS_SCALE = 1f; public const string SCENE_ICONS_SCALE_KEY = "SPINE_SCENE_ICONS_SCALE"; + const bool DEFAULT_AUTO_RELOAD_SCENESKELETONS = true; + const string AUTO_RELOAD_SCENESKELETONS_KEY = "SPINE_AUTO_RELOAD_SCENESKELETONS"; + public static bool autoReloadSceneSkeletons = DEFAULT_AUTO_RELOAD_SCENESKELETONS; + static bool preferencesLoaded = false; public static void Load () { @@ -266,6 +270,8 @@ namespace Spine.Unity.Editor { defaultShader = EditorPrefs.GetString(DEFAULT_SHADER_KEY, DEFAULT_DEFAULT_SHADER); showHierarchyIcons = EditorPrefs.GetBool(SHOW_HIERARCHY_ICONS_KEY, DEFAULT_SHOW_HIERARCHY_ICONS); setTextureImporterSettings = EditorPrefs.GetBool(SET_TEXTUREIMPORTER_SETTINGS_KEY, DEFAULT_SET_TEXTUREIMPORTER_SETTINGS); + autoReloadSceneSkeletons = EditorPrefs.GetBool(AUTO_RELOAD_SCENESKELETONS_KEY, DEFAULT_AUTO_RELOAD_SCENESKELETONS); + SpineHandles.handleScale = EditorPrefs.GetFloat(SCENE_ICONS_SCALE_KEY, DEFAULT_SCENE_ICONS_SCALE); preferencesLoaded = true; } @@ -284,6 +290,8 @@ namespace Spine.Unity.Editor { HierarchyHandler.IconsOnPlaymodeStateChanged(); #endif } + autoReloadSceneSkeletons = EditorGUILayout.Toggle(new GUIContent("Auto-reload scene components", "Reloads Skeleton components in the scene whenever their SkeletonDataAsset is modified. This makes it so changes in the SkeletonDataAsset inspector are immediately reflected. This may be slow when your scenes have large numbers of SkeletonRenderers or SkeletonGraphic."), autoReloadSceneSkeletons); + EditorGUILayout.Separator(); @@ -319,7 +327,6 @@ namespace Spine.Unity.Editor { if (EditorGUI.EndChangeCheck()) EditorPrefs.SetFloat(DEFAULT_ZSPACING_KEY, defaultZSpacing); - EditorGUILayout.Space(); EditorGUILayout.LabelField("Handles and Gizmos", EditorStyles.boldLabel); EditorGUI.BeginChangeCheck(); @@ -352,7 +359,7 @@ namespace Spine.Unity.Editor { ReloadAllActiveSkeletonsEditMode(); } - static void ReloadAllActiveSkeletonsEditMode () { + public static void ReloadAllActiveSkeletonsEditMode () { if (EditorApplication.isPaused) return; if (EditorApplication.isPlaying) return; if (EditorApplication.isCompiling) return; @@ -378,13 +385,36 @@ namespace Spine.Unity.Editor { } foreach (var sr in activeSkeletonRenderers) { - sr.Initialize(true); - //Debug.Log(sr.name); - //Debug.Log(sr.valid); + var meshRenderer = sr.GetComponent(); + var sharedMaterials = meshRenderer.sharedMaterials; + foreach (var m in sharedMaterials) { + if (m == null) { + sr.Initialize(true); + break; + } + } } foreach (var sg in activeSkeletonGraphics) { - sg.Initialize(true); + if (sg.mainTexture == null) + sg.Initialize(true); + } + } + + public static void ReloadSceneSkeletonComponents (SkeletonDataAsset skeletonDataAsset) { + if (EditorApplication.isPaused) return; + if (EditorApplication.isPlaying) return; + if (EditorApplication.isCompiling) return; + if (EditorApplication.isPlayingOrWillChangePlaymode) return; + + var activeSkeletonRenderers = GameObject.FindObjectsOfType(); + foreach (var sr in activeSkeletonRenderers) { + if (sr.isActiveAndEnabled && sr.skeletonDataAsset == skeletonDataAsset) sr.Initialize(true); + } + + var activeSkeletonGraphics = GameObject.FindObjectsOfType(); + foreach (var sg in activeSkeletonGraphics) { + if (sg.isActiveAndEnabled && sg.skeletonDataAsset == skeletonDataAsset) sg.Initialize(true); } } }