From 82a0de85bc8feea2179461eac4d4de8ed259a9a5 Mon Sep 17 00:00:00 2001 From: Harald Csaszar Date: Fri, 8 Jan 2021 17:59:18 +0100 Subject: [PATCH] [unity] Fixed SkeletonGraphic with multiple materials displaying white square and issuing error when number of renderers changes in SkeletonGraphic.Rebuild. Closes #1826. --- .../spine-unity/Components/SkeletonGraphic.cs | 30 +++++++++++++++---- 1 file changed, 24 insertions(+), 6 deletions(-) diff --git a/spine-unity/Assets/Spine/Runtime/spine-unity/Components/SkeletonGraphic.cs b/spine-unity/Assets/Spine/Runtime/spine-unity/Components/SkeletonGraphic.cs index 457ba3124..0950505c0 100644 --- a/spine-unity/Assets/Spine/Runtime/spine-unity/Components/SkeletonGraphic.cs +++ b/spine-unity/Assets/Spine/Runtime/spine-unity/Components/SkeletonGraphic.cs @@ -72,6 +72,8 @@ namespace Spine.Unity { public bool unscaledTime; public bool allowMultipleCanvasRenderers = false; public List canvasRenderers = new List(); + protected List rawImages = new List(); + protected int usedRenderersCount = 0; // Submesh Separation public const string SeparatorPartGameObjectName = "Part"; @@ -200,6 +202,7 @@ namespace Spine.Unity { protected override void Awake () { base.Awake (); + SyncRawImagesWithCanvasRenderers(); if (!this.IsValid) { #if UNITY_EDITOR // workaround for special import case of open scene where OnValidate and Awake are @@ -217,7 +220,7 @@ namespace Spine.Unity { public override void Rebuild (CanvasUpdate update) { base.Rebuild(update); if (canvasRenderer.cull) return; - if (update == CanvasUpdate.PreRender) UpdateMesh(); + if (update == CanvasUpdate.PreRender) UpdateMesh(keepRendererCount : true); if (allowMultipleCanvasRenderers) canvasRenderer.Clear(); } @@ -253,6 +256,12 @@ namespace Spine.Unity { ApplyAnimation(); } + protected void SyncRawImagesWithCanvasRenderers () { + rawImages.Clear(); + foreach (var canvasRenderer in canvasRenderers) + rawImages.Add(canvasRenderer.GetComponent()); + } + protected void UpdateAnimationStatus (float deltaTime) { deltaTime *= timeScale; skeleton.Update(deltaTime); @@ -264,7 +273,7 @@ namespace Spine.Unity { BeforeApply(this); if (updateMode != UpdateMode.OnlyEventTimelines) - state.Apply(skeleton); + state.Apply(skeleton); else state.ApplyEventTimelinesOnly(skeleton); @@ -452,6 +461,7 @@ namespace Spine.Unity { } } canvasRenderers = newList; + SyncRawImagesWithCanvasRenderers(); } public void Initialize (bool overwrite) { @@ -503,7 +513,7 @@ namespace Spine.Unity { OnRebuild(this); } - public void UpdateMesh () { + public void UpdateMesh (bool keepRendererCount = false) { if (!this.IsValid) return; skeleton.SetColor(this.color); @@ -513,7 +523,7 @@ namespace Spine.Unity { UpdateMeshSingleCanvasRenderer(); } else { - UpdateMeshMultipleCanvasRenderers(currentInstructions); + UpdateMeshMultipleCanvasRenderers(currentInstructions, keepRendererCount); } if (OnMeshAndMaterialsUpdated != null) @@ -574,15 +584,18 @@ namespace Spine.Unity { } //this.UpdateMaterial(); // note: This would allocate memory. + usedRenderersCount = 0; } - protected void UpdateMeshMultipleCanvasRenderers (SkeletonRendererInstruction currentInstructions) { + protected void UpdateMeshMultipleCanvasRenderers (SkeletonRendererInstruction currentInstructions, bool keepRendererCount) { MeshGenerator.GenerateSkeletonRendererInstruction(currentInstructions, skeleton, null, enableSeparatorSlots ? separatorSlots : null, enableSeparatorSlots ? separatorSlots.Count > 0 : false, false); int submeshCount = currentInstructions.submeshInstructions.Count; + if (keepRendererCount && submeshCount != usedRenderersCount) + return; EnsureCanvasRendererCount(submeshCount); EnsureMeshesCount(submeshCount); EnsureSeparatorPartCount(); @@ -618,7 +631,10 @@ namespace Spine.Unity { var submeshMaterial = submeshInstructionItem.material; var canvasRenderer = canvasRenderers[i]; - canvasRenderer.gameObject.SetActive(true); + if (i >= usedRenderersCount) { + canvasRenderer.gameObject.SetActive(true); + rawImages[i].Rebuild(CanvasUpdate.PreRender); + } canvasRenderer.SetMesh(targetMesh); canvasRenderer.materialCount = 1; @@ -647,6 +663,7 @@ namespace Spine.Unity { } DisableUnusedCanvasRenderers(usedCount : submeshCount); + usedRenderersCount = submeshCount; } protected void EnsureCanvasRendererCount (int targetCount) { @@ -663,6 +680,7 @@ namespace Spine.Unity { var rawImage = go.AddComponent(); rawImage.maskable = this.maskable; rawImage.raycastTarget = false; + rawImages.Add(rawImage); } }