From 568e5ef0494ffa2d20ee82d4a67340b162c16d72 Mon Sep 17 00:00:00 2001 From: Harald Csaszar Date: Thu, 6 Jun 2024 15:59:05 +0200 Subject: [PATCH] [unity] Fixed RenderExistingMesh causing unnecessary allocation. Additional code cleanup and added robustness. Closes #2543. --- .../Sample Components/RenderExistingMesh.cs | 41 ++++++++++++++----- .../Assets/Spine Examples/package.json | 2 +- 2 files changed, 31 insertions(+), 12 deletions(-) diff --git a/spine-unity/Assets/Spine Examples/Scripts/Sample Components/RenderExistingMesh.cs b/spine-unity/Assets/Spine Examples/Scripts/Sample Components/RenderExistingMesh.cs index d2a266bc9..06f23e978 100644 --- a/spine-unity/Assets/Spine Examples/Scripts/Sample Components/RenderExistingMesh.cs +++ b/spine-unity/Assets/Spine Examples/Scripts/Sample Components/RenderExistingMesh.cs @@ -31,6 +31,10 @@ #define NEW_PREFAB_SYSTEM #endif +#if UNITY_2018_2_OR_NEWER +#define HAS_GET_SHARED_MATERIALS +#endif + using System.Collections.Generic; using UnityEngine; @@ -59,20 +63,28 @@ namespace Spine.Unity.Examples { private Dictionary replacementMaterialDict = new Dictionary(); private Material[] sharedMaterials = new Material[0]; +#if HAS_GET_SHARED_MATERIALS + private List parentMaterials = new List(); +#endif #if UNITY_EDITOR private void Reset () { if (referenceRenderer == null) { - referenceRenderer = this.transform.parent.GetComponentInParent(); - if (!referenceRenderer) - return; + if (this.transform.parent) + referenceRenderer = this.transform.parent.GetComponentInParent(); + if (referenceRenderer == null) return; } - +#if HAS_GET_SHARED_MATERIALS + referenceRenderer.GetSharedMaterials(parentMaterials); + int parentMaterialsCount = parentMaterials.Count; +#else Material[] parentMaterials = referenceRenderer.sharedMaterials; - if (replacementMaterials.Length != parentMaterials.Length) { - replacementMaterials = new MaterialReplacement[parentMaterials.Length]; + int parentMaterialsCount = parentMaterials.Length; +#endif + if (replacementMaterials.Length != parentMaterialsCount) { + replacementMaterials = new MaterialReplacement[parentMaterialsCount]; } - for (int i = 0; i < parentMaterials.Length; ++i) { + for (int i = 0; i < parentMaterialsCount; ++i) { replacementMaterials[i].originalMaterial = parentMaterials[i]; replacementMaterials[i].replacementMaterial = parentMaterials[i]; } @@ -82,9 +94,15 @@ namespace Spine.Unity.Examples { #endif void Awake () { + ownRenderer = this.GetComponent(); + ownMeshFilter = this.GetComponent(); + if (referenceRenderer == null) { - referenceRenderer = this.transform.parent.GetComponentInParent(); + if (this.transform.parent != null) + referenceRenderer = this.transform.parent.GetComponentInParent(); + if (referenceRenderer == null) return; } + referenceMeshFilter = referenceRenderer.GetComponent(); // subscribe to OnMeshAndMaterialsUpdated SkeletonAnimation skeletonRenderer = referenceRenderer.GetComponent(); @@ -93,9 +111,6 @@ namespace Spine.Unity.Examples { skeletonRenderer.OnMeshAndMaterialsUpdated += UpdateOnCallback; updateViaSkeletonCallback = true; } - referenceMeshFilter = referenceRenderer.GetComponent(); - ownRenderer = this.GetComponent(); - ownMeshFilter = this.GetComponent(); InitializeDict(); } @@ -131,6 +146,10 @@ namespace Spine.Unity.Examples { } void UpdateMaterials () { +#if UNITY_EDITOR + if (!referenceRenderer) return; + if (!referenceMeshFilter) Reset(); +#endif ownMeshFilter.sharedMesh = referenceMeshFilter.sharedMesh; Material[] parentMaterials = referenceRenderer.sharedMaterials; diff --git a/spine-unity/Assets/Spine Examples/package.json b/spine-unity/Assets/Spine Examples/package.json index 71b12aebb..1edd0ba82 100644 --- a/spine-unity/Assets/Spine Examples/package.json +++ b/spine-unity/Assets/Spine Examples/package.json @@ -2,7 +2,7 @@ "name": "com.esotericsoftware.spine.spine-unity-examples", "displayName": "spine-unity Runtime Examples", "description": "This plugin provides example scenes and scripts for the spine-unity runtime.", - "version": "4.2.33", + "version": "4.2.34", "unity": "2018.3", "author": { "name": "Esoteric Software",