mirror of
https://github.com/EsotericSoftware/spine-runtimes.git
synced 2026-03-26 22:49:01 +08:00
[unity] Fixed SkeletonGraphic with multiple materials displaying white square and issuing error when number of renderers changes in SkeletonGraphic.Rebuild. Closes #1826.
This commit is contained in:
parent
e95e130e9b
commit
82a0de85bc
@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user