Просмотр исходного кода

[Unity] Workflow cleanup for serialized custom materials module.

pharan 9 лет назад
Родитель
Сommit
bf35d4979e

+ 33 - 7
spine-unity/Assets/spine-unity/Modules/CustomMaterials/Editor/SkeletonRendererCustomMaterialsInspector.cs

@@ -2,25 +2,51 @@
  * SkeletonRendererCustomMaterialsInspector created by Lost Polygon
  * Full irrevocable rights and permissions granted to Esoteric Software
 *****************************************************************************/
-
+using UnityEngine;
 using UnityEditor;
+using Spine.Unity.Modules;
 
 namespace Spine.Unity.Editor {
 	[CustomEditor(typeof(SkeletonRendererCustomMaterials))]
 	public class SkeletonRendererCustomMaterialsInspector : UnityEditor.Editor {
+
+		#region SkeletonRenderer context menu
+		[MenuItem ("CONTEXT/SkeletonRenderer/Add Basic Serialized Custom Materials")]
+		static void AddSkeletonRendererCustomMaterials (MenuCommand menuCommand) {
+			var skeletonRenderer = (SkeletonRenderer)menuCommand.context;
+			var newComponent = skeletonRenderer.gameObject.AddComponent<SkeletonRendererCustomMaterials>();
+			Undo.RegisterCreatedObjectUndo(newComponent, "Add Basic Serialized Custom Materials");
+		}
+
+		[MenuItem ("CONTEXT/SkeletonRenderer/Add Basic Serialized Custom Materials", true)]
+		static bool AddSkeletonRendererCustomMaterials_Validate (MenuCommand menuCommand) {
+			var skeletonRenderer = (SkeletonRenderer)menuCommand.context;
+			return (skeletonRenderer.GetComponent<SkeletonRendererCustomMaterials>() == null);
+		}
+		#endregion
+
 		public override void OnInspectorGUI() {
-			SkeletonRendererCustomMaterials obj = (SkeletonRendererCustomMaterials) target;
+			var component = (SkeletonRendererCustomMaterials)target;
+			var skeletonRenderer = component.skeletonRenderer;
 
-			// Just draw the default inspector and reapply overrides on any change
+			// Draw the default inspector and reapply overrides on any change
 			EditorGUI.BeginChangeCheck();
 			{
 				DrawDefaultInspector();
 			}
 			if (EditorGUI.EndChangeCheck()) {
-				obj.RemoveCustomMaterialOverrides();
-				obj.RemoveCustomSlotMaterials();
-				obj.SetCustomMaterialOverrides();
-				obj.SetCustomSlotMaterials();
+				component.ReapplyOverrides();
+				if (skeletonRenderer != null)
+					skeletonRenderer.LateUpdate();
+			}
+
+			if (GUILayout.Button(new GUIContent("Clear and Reapply Changes", "Removes all non-serialized overrides in the SkeletonRenderer and reapplies the overrides on this component."))) {
+				if (skeletonRenderer != null) {
+					skeletonRenderer.CustomMaterialOverride.Clear();
+					skeletonRenderer.CustomSlotMaterials.Clear();
+					component.ReapplyOverrides();
+					skeletonRenderer.LateUpdate();
+				}
 			}
 		}
 	}

+ 54 - 51
spine-unity/Assets/spine-unity/Modules/CustomMaterials/SkeletonRendererCustomMaterials.cs

@@ -7,9 +7,11 @@ using System;
 using System.Collections.Generic;
 using UnityEngine;
 
-namespace Spine.Unity {
+namespace Spine.Unity.Modules {
 	[ExecuteInEditMode]
 	public class SkeletonRendererCustomMaterials : MonoBehaviour {
+
+		#region Inspector
 		public SkeletonRenderer skeletonRenderer;
 
 		[SerializeField]
@@ -18,20 +20,47 @@ namespace Spine.Unity {
 		[SerializeField]
 		private List<AtlasMaterialOverride> customMaterialOverrides = new List<AtlasMaterialOverride>();
 
-		public List<SlotMaterialOverride> CustomSlotMaterials {
-			get { return customSlotMaterials; }
-		}
+		#if UNITY_EDITOR
+		void Reset () {
+			skeletonRenderer = GetComponent<SkeletonRenderer>();
 
-		public List<AtlasMaterialOverride> CustomMaterialOverrides {
-			get { return customMaterialOverrides; }
+			// Populate atlas list 
+			if (skeletonRenderer != null && skeletonRenderer.skeletonDataAsset != null) {
+				AtlasAsset[] atlasAssets = skeletonRenderer.skeletonDataAsset.atlasAssets;
+
+				var initialAtlasMaterialOverrides = new List<AtlasMaterialOverride>();
+				foreach (AtlasAsset atlasAsset in atlasAssets) {
+					foreach (Material atlasMaterial in atlasAsset.materials) {
+						var atlasMaterialOverride = new AtlasMaterialOverride();
+						atlasMaterialOverride.overrideDisabled = true;
+						atlasMaterialOverride.originalMaterial = atlasMaterial;
+
+						initialAtlasMaterialOverrides.Add(atlasMaterialOverride);
+					}
+				}
+
+				customMaterialOverrides = initialAtlasMaterialOverrides;
+			}
 		}
+		#endif
+		#endregion
 
-		public void SetCustomSlotMaterials() {
+		public List<SlotMaterialOverride> CustomSlotMaterials { get { return customSlotMaterials; } }
+		public List<AtlasMaterialOverride> CustomMaterialOverrides { get { return customMaterialOverrides; } }
+
+		public void ReapplyOverrides () {
 			if (skeletonRenderer == null) {
 				Debug.LogError("skeletonRenderer == null");
 				return;
 			}
 
+			RemoveCustomMaterialOverrides();
+			RemoveCustomSlotMaterials();
+			SetCustomMaterialOverrides();
+			SetCustomSlotMaterials();
+		}
+
+		void SetCustomSlotMaterials () {
 			for (int i = 0; i < customSlotMaterials.Count; i++) {
 				SlotMaterialOverride slotMaterialOverride = customSlotMaterials[i];
 				if (slotMaterialOverride.overrideDisabled || string.IsNullOrEmpty(slotMaterialOverride.slotName))
@@ -42,12 +71,7 @@ namespace Spine.Unity {
 			}
 		}
 
-		public void RemoveCustomSlotMaterials() {
-			if (skeletonRenderer == null) {
-				Debug.LogError("skeletonRenderer == null");
-				return;
-			}
-
+		void RemoveCustomSlotMaterials () {
 			for (int i = 0; i < customSlotMaterials.Count; i++) {
 				SlotMaterialOverride slotMaterialOverride = customSlotMaterials[i];
 				if (string.IsNullOrEmpty(slotMaterialOverride.slotName))
@@ -67,12 +91,7 @@ namespace Spine.Unity {
 			}
 		}
 
-		public void SetCustomMaterialOverrides() {
-			if (skeletonRenderer == null) {
-				Debug.LogError("skeletonRenderer == null");
-				return;
-			}
-
+		void SetCustomMaterialOverrides () {
 			for (int i = 0; i < customMaterialOverrides.Count; i++) {
 				AtlasMaterialOverride atlasMaterialOverride = customMaterialOverrides[i];
 				if (atlasMaterialOverride.overrideDisabled)
@@ -82,12 +101,7 @@ namespace Spine.Unity {
 			}
 		}
 
-		public void RemoveCustomMaterialOverrides() {
-			if (skeletonRenderer == null) {
-				Debug.LogError("skeletonRenderer == null");
-				return;
-			}
-
+		void RemoveCustomMaterialOverrides () {
 			for (int i = 0; i < customMaterialOverrides.Count; i++) {
 				AtlasMaterialOverride atlasMaterialOverride = customMaterialOverrides[i];
 				Material currentMaterial;
@@ -101,10 +115,15 @@ namespace Spine.Unity {
 				skeletonRenderer.CustomMaterialOverride.Remove(atlasMaterialOverride.originalMaterial);
 			}
 		}
+			
+		// OnEnable applies the overrides at runtime and when the editor loads.
+		void OnEnable () {
+			if (skeletonRenderer == null)
+				skeletonRenderer = GetComponent<SkeletonRenderer>();
 
-		private void OnEnable() {
 			if (skeletonRenderer == null) {
-				skeletonRenderer = GetComponent<SkeletonRenderer>();
+				Debug.LogError("skeletonRenderer == null");
+				return;
 			}
 
             skeletonRenderer.Initialize(false);
@@ -112,31 +131,16 @@ namespace Spine.Unity {
 			SetCustomSlotMaterials();
 		}
 
-		private void OnDisable() {
-			RemoveCustomMaterialOverrides();
-			RemoveCustomSlotMaterials();
-		}
-
-		private void Reset() {
-			skeletonRenderer = GetComponent<SkeletonRenderer>();
-
-			// Populate atlas list
-			if (skeletonRenderer != null && skeletonRenderer.skeletonDataAsset != null) {
-				AtlasAsset[] atlasAssets = skeletonRenderer.skeletonDataAsset.atlasAssets;
-
-				List<AtlasMaterialOverride> initialAtlasMaterialOverrides = new List<AtlasMaterialOverride>();
-				foreach (AtlasAsset atlasAsset in atlasAssets) {
-					foreach (Material atlasMaterial in atlasAsset.materials) {
-						AtlasMaterialOverride atlasMaterialOverride = new AtlasMaterialOverride();
-						atlasMaterialOverride.overrideDisabled = true;
-						atlasMaterialOverride.originalMaterial = atlasMaterial;
-
-						initialAtlasMaterialOverrides.Add(atlasMaterialOverride);
-					}
-				}
 
-				customMaterialOverrides = initialAtlasMaterialOverrides;
+		// OnDisable removes the overrides at runtime and in the editor when the component is disabled or destroyed.
+		void OnDisable () {
+			if (skeletonRenderer == null) {
+				Debug.LogError("skeletonRenderer == null");
+				return;
 			}
+
+			RemoveCustomMaterialOverrides();
+			RemoveCustomSlotMaterials();
 		}
 
 		[Serializable]
@@ -148,7 +152,6 @@ namespace Spine.Unity {
 		public class SlotMaterialOverride : MaterialOverride {
 			[SpineSlot]
 			public string slotName;
-
 			public Material material;
 		}
 

+ 11 - 0
spine-unity/Assets/spine-unity/Modules/CustomMaterials/readme.txt

@@ -0,0 +1,11 @@
+SkeletonRendererCustomMaterials by LostPolygon
+===============================
+This is a basic serialization and inspector implementation for custom material overrides for SkeletonRenderer and its derived classes (SkeletonAnimation, SkeletonAnimator).
+
+## How to use
+Right-click on your SkeletonRenderer and select "Add Basic Serialized Custom Materials". This will add and initialize the SkeletonRendererCustomMaterials to the same object.
+
+You can use this to store material override settings for SkeletonRenderer instances/prefabs so they will be applied automatically when your scene starts or when the prefab is instantiated.
+
+This script is not intended for use with code.
+To dynamically set materials for your SkeletonRenderer through code, you can directly access `SkeletonRenderer.CustomMaterialOverride` for material array overrides and `SkeletonRenderer.CustomSlotMaterials` for slot material overrides.

+ 8 - 0
spine-unity/Assets/spine-unity/Modules/CustomMaterials/readme.txt.meta

@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 3d4db6c367e463c4cb5566afc490163c
+timeCreated: 1460572571
+licenseType: Free
+TextScriptImporter:
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: