diff --git a/spine-unity/Assets/spine-unity/Modules/CustomMaterials/Editor/SkeletonRendererCustomMaterialsInspector.cs b/spine-unity/Assets/spine-unity/Modules/CustomMaterials/Editor/SkeletonRendererCustomMaterialsInspector.cs index 1a2379021..fbf2a5945 100644 --- a/spine-unity/Assets/spine-unity/Modules/CustomMaterials/Editor/SkeletonRendererCustomMaterialsInspector.cs +++ b/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 { - public override void OnInspectorGUI() { - SkeletonRendererCustomMaterials obj = (SkeletonRendererCustomMaterials) target; - // Just draw the default inspector and reapply overrides on any change + #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(); + 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() == null); + } + #endregion + + public override void OnInspectorGUI() { + var component = (SkeletonRendererCustomMaterials)target; + var skeletonRenderer = component.skeletonRenderer; + + // 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(); + } } } } diff --git a/spine-unity/Assets/spine-unity/Modules/CustomMaterials/SkeletonRendererCustomMaterials.cs b/spine-unity/Assets/spine-unity/Modules/CustomMaterials/SkeletonRendererCustomMaterials.cs index 6eece8f92..a7bfe507d 100644 --- a/spine-unity/Assets/spine-unity/Modules/CustomMaterials/SkeletonRendererCustomMaterials.cs +++ b/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 customMaterialOverrides = new List(); - public List CustomSlotMaterials { - get { return customSlotMaterials; } - } + #if UNITY_EDITOR + void Reset () { + skeletonRenderer = GetComponent(); - public List CustomMaterialOverrides { - get { return customMaterialOverrides; } - } + // Populate atlas list + if (skeletonRenderer != null && skeletonRenderer.skeletonDataAsset != null) { + AtlasAsset[] atlasAssets = skeletonRenderer.skeletonDataAsset.atlasAssets; - public void SetCustomSlotMaterials() { + var initialAtlasMaterialOverrides = new List(); + 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 List CustomSlotMaterials { get { return customSlotMaterials; } } + public List 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); } } - - private void OnEnable() { - if (skeletonRenderer == null) { + + // OnEnable applies the overrides at runtime and when the editor loads. + void OnEnable () { + if (skeletonRenderer == null) skeletonRenderer = GetComponent(); + + if (skeletonRenderer == null) { + Debug.LogError("skeletonRenderer == null"); + return; } skeletonRenderer.Initialize(false); @@ -112,33 +131,18 @@ namespace Spine.Unity { SetCustomSlotMaterials(); } - private void OnDisable() { + + // 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(); } - private void Reset() { - skeletonRenderer = GetComponent(); - - // Populate atlas list - if (skeletonRenderer != null && skeletonRenderer.skeletonDataAsset != null) { - AtlasAsset[] atlasAssets = skeletonRenderer.skeletonDataAsset.atlasAssets; - - List initialAtlasMaterialOverrides = new List(); - 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; - } - } - [Serializable] public class MaterialOverride { public bool overrideDisabled; @@ -148,7 +152,6 @@ namespace Spine.Unity { public class SlotMaterialOverride : MaterialOverride { [SpineSlot] public string slotName; - public Material material; } diff --git a/spine-unity/Assets/spine-unity/Modules/CustomMaterials/readme.txt b/spine-unity/Assets/spine-unity/Modules/CustomMaterials/readme.txt new file mode 100644 index 000000000..917077577 --- /dev/null +++ b/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. \ No newline at end of file diff --git a/spine-unity/Assets/spine-unity/Modules/CustomMaterials/readme.txt.meta b/spine-unity/Assets/spine-unity/Modules/CustomMaterials/readme.txt.meta new file mode 100644 index 000000000..a97910679 --- /dev/null +++ b/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: