Browse Source

[unity] Fixed SkeletonGraphic with multiple materials displaying white square and issuing error when number of renderers changes in SkeletonGraphic.Rebuild. Closes #1826.

Harald Csaszar 4 years ago
parent
commit
82a0de85bc

+ 24 - 6
spine-unity/Assets/Spine/Runtime/spine-unity/Components/SkeletonGraphic.cs

@@ -72,6 +72,8 @@ namespace Spine.Unity {
 		public bool unscaledTime;
 		public bool unscaledTime;
 		public bool allowMultipleCanvasRenderers = false;
 		public bool allowMultipleCanvasRenderers = false;
 		public List<CanvasRenderer> canvasRenderers = new List<CanvasRenderer>();
 		public List<CanvasRenderer> canvasRenderers = new List<CanvasRenderer>();
+		protected List<RawImage> rawImages = new List<RawImage>();
+		protected int usedRenderersCount = 0;
 
 
 		// Submesh Separation
 		// Submesh Separation
 		public const string SeparatorPartGameObjectName = "Part";
 		public const string SeparatorPartGameObjectName = "Part";
@@ -200,6 +202,7 @@ namespace Spine.Unity {
 		protected override void Awake () {
 		protected override void Awake () {
 
 
 			base.Awake ();
 			base.Awake ();
+			SyncRawImagesWithCanvasRenderers();
 			if (!this.IsValid) {
 			if (!this.IsValid) {
 #if UNITY_EDITOR
 #if UNITY_EDITOR
 				// workaround for special import case of open scene where OnValidate and Awake are
 				// 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) {
 		public override void Rebuild (CanvasUpdate update) {
 			base.Rebuild(update);
 			base.Rebuild(update);
 			if (canvasRenderer.cull) return;
 			if (canvasRenderer.cull) return;
-			if (update == CanvasUpdate.PreRender) UpdateMesh();
+			if (update == CanvasUpdate.PreRender) UpdateMesh(keepRendererCount : true);
 			if (allowMultipleCanvasRenderers) canvasRenderer.Clear();
 			if (allowMultipleCanvasRenderers) canvasRenderer.Clear();
 		}
 		}
 
 
@@ -253,6 +256,12 @@ namespace Spine.Unity {
 			ApplyAnimation();
 			ApplyAnimation();
 		}
 		}
 
 
+		protected void SyncRawImagesWithCanvasRenderers () {
+			rawImages.Clear();
+			foreach (var canvasRenderer in canvasRenderers)
+				rawImages.Add(canvasRenderer.GetComponent<RawImage>());
+		}
+
 		protected void UpdateAnimationStatus (float deltaTime) {
 		protected void UpdateAnimationStatus (float deltaTime) {
 			deltaTime *= timeScale;
 			deltaTime *= timeScale;
 			skeleton.Update(deltaTime);
 			skeleton.Update(deltaTime);
@@ -264,7 +273,7 @@ namespace Spine.Unity {
 				BeforeApply(this);
 				BeforeApply(this);
 
 
 			if (updateMode != UpdateMode.OnlyEventTimelines)
 			if (updateMode != UpdateMode.OnlyEventTimelines)
-				state.Apply(skeleton);
+			state.Apply(skeleton);
 			else
 			else
 				state.ApplyEventTimelinesOnly(skeleton);
 				state.ApplyEventTimelinesOnly(skeleton);
 
 
@@ -452,6 +461,7 @@ namespace Spine.Unity {
 				}
 				}
 			}
 			}
 			canvasRenderers = newList;
 			canvasRenderers = newList;
+			SyncRawImagesWithCanvasRenderers();
 		}
 		}
 
 
 		public void Initialize (bool overwrite) {
 		public void Initialize (bool overwrite) {
@@ -503,7 +513,7 @@ namespace Spine.Unity {
 				OnRebuild(this);
 				OnRebuild(this);
 		}
 		}
 
 
-		public void UpdateMesh () {
+		public void UpdateMesh (bool keepRendererCount = false) {
 			if (!this.IsValid) return;
 			if (!this.IsValid) return;
 
 
 			skeleton.SetColor(this.color);
 			skeleton.SetColor(this.color);
@@ -513,7 +523,7 @@ namespace Spine.Unity {
 				UpdateMeshSingleCanvasRenderer();
 				UpdateMeshSingleCanvasRenderer();
 			}
 			}
 			else {
 			else {
-				UpdateMeshMultipleCanvasRenderers(currentInstructions);
+				UpdateMeshMultipleCanvasRenderers(currentInstructions, keepRendererCount);
 			}
 			}
 
 
 			if (OnMeshAndMaterialsUpdated != null)
 			if (OnMeshAndMaterialsUpdated != null)
@@ -574,15 +584,18 @@ namespace Spine.Unity {
 			}
 			}
 
 
 			//this.UpdateMaterial(); // note: This would allocate memory.
 			//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,
 			MeshGenerator.GenerateSkeletonRendererInstruction(currentInstructions, skeleton, null,
 				enableSeparatorSlots ? separatorSlots : null,
 				enableSeparatorSlots ? separatorSlots : null,
 				enableSeparatorSlots ? separatorSlots.Count > 0 : false,
 				enableSeparatorSlots ? separatorSlots.Count > 0 : false,
 				false);
 				false);
 
 
 			int submeshCount = currentInstructions.submeshInstructions.Count;
 			int submeshCount = currentInstructions.submeshInstructions.Count;
+			if (keepRendererCount && submeshCount != usedRenderersCount)
+				return;
 			EnsureCanvasRendererCount(submeshCount);
 			EnsureCanvasRendererCount(submeshCount);
 			EnsureMeshesCount(submeshCount);
 			EnsureMeshesCount(submeshCount);
 			EnsureSeparatorPartCount();
 			EnsureSeparatorPartCount();
@@ -618,7 +631,10 @@ namespace Spine.Unity {
 
 
 				var submeshMaterial = submeshInstructionItem.material;
 				var submeshMaterial = submeshInstructionItem.material;
 				var canvasRenderer = canvasRenderers[i];
 				var canvasRenderer = canvasRenderers[i];
-				canvasRenderer.gameObject.SetActive(true);
+				if (i >= usedRenderersCount) {
+					canvasRenderer.gameObject.SetActive(true);
+					rawImages[i].Rebuild(CanvasUpdate.PreRender);
+				}
 				canvasRenderer.SetMesh(targetMesh);
 				canvasRenderer.SetMesh(targetMesh);
 				canvasRenderer.materialCount = 1;
 				canvasRenderer.materialCount = 1;
 
 
@@ -647,6 +663,7 @@ namespace Spine.Unity {
 			}
 			}
 
 
 			DisableUnusedCanvasRenderers(usedCount : submeshCount);
 			DisableUnusedCanvasRenderers(usedCount : submeshCount);
+			usedRenderersCount = submeshCount;
 		}
 		}
 
 
 		protected void EnsureCanvasRendererCount (int targetCount) {
 		protected void EnsureCanvasRendererCount (int targetCount) {
@@ -663,6 +680,7 @@ namespace Spine.Unity {
 				var rawImage = go.AddComponent<RawImage>();
 				var rawImage = go.AddComponent<RawImage>();
 				rawImage.maskable = this.maskable;
 				rawImage.maskable = this.maskable;
 				rawImage.raycastTarget = false;
 				rawImage.raycastTarget = false;
+				rawImages.Add(rawImage);
 			}
 			}
 		}
 		}