From 3ff14fc186d3457709868946b4eafda76dd8d82a Mon Sep 17 00:00:00 2001 From: pharan Date: Tue, 4 Dec 2018 19:42:58 +0800 Subject: [PATCH] [unity] Update separator slot APIs. --- .../spine-unity/Editor/SkeletonDebugWindow.cs | 2 +- .../Editor/SkeletonRendererInspector.cs | 7 +++- .../Components/SkeletonRenderer.cs | 41 +++++++++++++++++++ .../SkeletonPartsRenderer.cs | 3 +- .../SkeletonRenderSeparator.cs | 13 ++++-- 5 files changed, 60 insertions(+), 6 deletions(-) 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 f32650ae3..c8209d6f2 100644 --- a/spine-unity/Assets/Spine/Editor/spine-unity/Editor/SkeletonDebugWindow.cs +++ b/spine-unity/Assets/Spine/Editor/spine-unity/Editor/SkeletonDebugWindow.cs @@ -477,7 +477,7 @@ namespace Spine.Unity.Editor { } } else { foreach (var slot in skeleton.DrawOrder) { - var slotNames = SkeletonRendererInspector.GetSeparatorSlotMember(skeletonRenderer); + var slotNames = SkeletonRendererInspector.GetSeparatorSlotNames(skeletonRenderer); for (int i = 0, n = slotNames.Length; i < n; i++) { if (string.Equals(slotNames[i], slot.Data.Name, System.StringComparison.Ordinal)) { EditorGUILayout.LabelField(SeparatorString); diff --git a/spine-unity/Assets/Spine/Editor/spine-unity/Editor/SkeletonRendererInspector.cs b/spine-unity/Assets/Spine/Editor/spine-unity/Editor/SkeletonRendererInspector.cs index d36fa14a8..021ba4ff0 100644 --- a/spine-unity/Assets/Spine/Editor/spine-unity/Editor/SkeletonRendererInspector.cs +++ b/spine-unity/Assets/Spine/Editor/spine-unity/Editor/SkeletonRendererInspector.cs @@ -341,7 +341,12 @@ namespace Spine.Unity.Editor { } } - public static string[] GetSeparatorSlotMember (SkeletonRenderer skeletonRenderer) { + public static void SetSeparatorSlotNames (SkeletonRenderer skeletonRenderer, string[] newSlotNames) { + var field = SpineInspectorUtility.GetNonPublicField(typeof(SkeletonRenderer), SeparatorSlotNamesFieldName); + field.SetValue(skeletonRenderer, newSlotNames); + } + + public static string[] GetSeparatorSlotNames (SkeletonRenderer skeletonRenderer) { var field = SpineInspectorUtility.GetNonPublicField(typeof(SkeletonRenderer), SeparatorSlotNamesFieldName); return field.GetValue(skeletonRenderer) as string[]; } diff --git a/spine-unity/Assets/Spine/Runtime/spine-unity/Components/SkeletonRenderer.cs b/spine-unity/Assets/Spine/Runtime/spine-unity/Components/SkeletonRenderer.cs index df8d8a8a3..f26bcd62b 100644 --- a/spine-unity/Assets/Spine/Runtime/spine-unity/Components/SkeletonRenderer.cs +++ b/spine-unity/Assets/Spine/Runtime/spine-unity/Components/SkeletonRenderer.cs @@ -367,6 +367,47 @@ namespace Spine.Unity { currentSmartMesh.instructionUsed.Set(currentInstructions); } + public void FindAndApplySeparatorSlots (string startsWith, bool clearExistingSeparators = true, bool updateStringArray = false) { + if (string.IsNullOrEmpty(startsWith)) return; + + FindAndApplySeparatorSlots( + (slotName) => slotName.StartsWith(startsWith), + clearExistingSeparators, + updateStringArray + ); + } + + public void FindAndApplySeparatorSlots (System.Func slotNamePredicate, bool clearExistingSeparators = true, bool updateStringArray = false) { + if (slotNamePredicate == null) return; + if (!valid) return; + + if (clearExistingSeparators) + separatorSlots.Clear(); + + var slots = skeleton.slots; + foreach (var slot in slots) { + if (slotNamePredicate.Invoke(slot.data.name)) + separatorSlots.Add(slot); + } + + if (updateStringArray) { + var detectedSeparatorNames = new List(); + foreach (var slot in skeleton.slots) { + string slotName = slot.data.name; + if (slotNamePredicate.Invoke(slotName)) + detectedSeparatorNames.Add(slotName); + } + if (!clearExistingSeparators) { + string[] originalNames = this.separatorSlotNames; + foreach (string originalName in originalNames) + detectedSeparatorNames.Add(originalName); + } + + this.separatorSlotNames = detectedSeparatorNames.ToArray(); + } + + } + public void ReapplySeparatorSlotNames () { if (!valid) return; diff --git a/spine-unity/Assets/Spine/Runtime/spine-unity/Modules/SkeletonRenderSeparator/SkeletonPartsRenderer.cs b/spine-unity/Assets/Spine/Runtime/spine-unity/Modules/SkeletonRenderSeparator/SkeletonPartsRenderer.cs index df61f15ca..3af331ca6 100644 --- a/spine-unity/Assets/Spine/Runtime/spine-unity/Modules/SkeletonRenderSeparator/SkeletonPartsRenderer.cs +++ b/spine-unity/Assets/Spine/Runtime/spine-unity/Modules/SkeletonRenderSeparator/SkeletonPartsRenderer.cs @@ -128,10 +128,11 @@ namespace Spine.Unity.Modules { meshRenderer.SetPropertyBlock(block); } - public static SkeletonPartsRenderer NewPartsRendererGameObject (Transform parent, string name) { + public static SkeletonPartsRenderer NewPartsRendererGameObject (Transform parent, string name, int sortingOrder = 0) { var go = new GameObject(name, typeof(MeshFilter), typeof(MeshRenderer)); go.transform.SetParent(parent, false); var returnComponent = go.AddComponent(); + returnComponent.MeshRenderer.sortingOrder = sortingOrder; return returnComponent; } diff --git a/spine-unity/Assets/Spine/Runtime/spine-unity/Modules/SkeletonRenderSeparator/SkeletonRenderSeparator.cs b/spine-unity/Assets/Spine/Runtime/spine-unity/Modules/SkeletonRenderSeparator/SkeletonRenderSeparator.cs index 8b8a80ce9..a0dccf165 100644 --- a/spine-unity/Assets/Spine/Runtime/spine-unity/Modules/SkeletonRenderSeparator/SkeletonRenderSeparator.cs +++ b/spine-unity/Assets/Spine/Runtime/spine-unity/Modules/SkeletonRenderSeparator/SkeletonRenderSeparator.cs @@ -106,6 +106,8 @@ namespace Spine.Unity.Modules { componentRenderers.Add(spr); } + srs.OnEnable(); + #if UNITY_EDITOR // Make sure editor updates properly in edit mode. if (!Application.isPlaying) { @@ -119,7 +121,7 @@ namespace Spine.Unity.Modules { } /// Add a child SkeletonPartsRenderer GameObject to this SkeletonRenderSeparator. - public void AddPartsRenderer (int sortingOrderIncrement = DefaultSortingOrderIncrement) { + public SkeletonPartsRenderer AddPartsRenderer (int sortingOrderIncrement = DefaultSortingOrderIncrement, string name = null) { int sortingLayerID = 0; int sortingOrder = 0; if (partsRenderers.Count > 0) { @@ -128,13 +130,18 @@ namespace Spine.Unity.Modules { sortingLayerID = previousMeshRenderer.sortingLayerID; sortingOrder = previousMeshRenderer.sortingOrder + sortingOrderIncrement; } - - var spr = SkeletonPartsRenderer.NewPartsRendererGameObject(skeletonRenderer.transform, partsRenderers.Count.ToString()); + + if (string.IsNullOrEmpty(name)) + name = partsRenderers.Count.ToString(); + + var spr = SkeletonPartsRenderer.NewPartsRendererGameObject(skeletonRenderer.transform, name); partsRenderers.Add(spr); var mr = spr.MeshRenderer; mr.sortingLayerID = sortingLayerID; mr.sortingOrder = sortingOrder; + + return spr; } #endregion