mirror of
https://github.com/EsotericSoftware/spine-runtimes.git
synced 2026-03-26 22:49:01 +08:00
[Unity] Workflow cleanup for serialized custom materials module.
This commit is contained in:
parent
1fe73b0f53
commit
bf35d4979e
@ -2,25 +2,51 @@
|
|||||||
* SkeletonRendererCustomMaterialsInspector created by Lost Polygon
|
* SkeletonRendererCustomMaterialsInspector created by Lost Polygon
|
||||||
* Full irrevocable rights and permissions granted to Esoteric Software
|
* Full irrevocable rights and permissions granted to Esoteric Software
|
||||||
*****************************************************************************/
|
*****************************************************************************/
|
||||||
|
using UnityEngine;
|
||||||
using UnityEditor;
|
using UnityEditor;
|
||||||
|
using Spine.Unity.Modules;
|
||||||
|
|
||||||
namespace Spine.Unity.Editor {
|
namespace Spine.Unity.Editor {
|
||||||
[CustomEditor(typeof(SkeletonRendererCustomMaterials))]
|
[CustomEditor(typeof(SkeletonRendererCustomMaterials))]
|
||||||
public class SkeletonRendererCustomMaterialsInspector : UnityEditor.Editor {
|
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<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() {
|
||||||
|
var component = (SkeletonRendererCustomMaterials)target;
|
||||||
|
var skeletonRenderer = component.skeletonRenderer;
|
||||||
|
|
||||||
|
// Draw the default inspector and reapply overrides on any change
|
||||||
EditorGUI.BeginChangeCheck();
|
EditorGUI.BeginChangeCheck();
|
||||||
{
|
{
|
||||||
DrawDefaultInspector();
|
DrawDefaultInspector();
|
||||||
}
|
}
|
||||||
if (EditorGUI.EndChangeCheck()) {
|
if (EditorGUI.EndChangeCheck()) {
|
||||||
obj.RemoveCustomMaterialOverrides();
|
component.ReapplyOverrides();
|
||||||
obj.RemoveCustomSlotMaterials();
|
if (skeletonRenderer != null)
|
||||||
obj.SetCustomMaterialOverrides();
|
skeletonRenderer.LateUpdate();
|
||||||
obj.SetCustomSlotMaterials();
|
}
|
||||||
|
|
||||||
|
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();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -7,9 +7,11 @@ using System;
|
|||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using UnityEngine;
|
using UnityEngine;
|
||||||
|
|
||||||
namespace Spine.Unity {
|
namespace Spine.Unity.Modules {
|
||||||
[ExecuteInEditMode]
|
[ExecuteInEditMode]
|
||||||
public class SkeletonRendererCustomMaterials : MonoBehaviour {
|
public class SkeletonRendererCustomMaterials : MonoBehaviour {
|
||||||
|
|
||||||
|
#region Inspector
|
||||||
public SkeletonRenderer skeletonRenderer;
|
public SkeletonRenderer skeletonRenderer;
|
||||||
|
|
||||||
[SerializeField]
|
[SerializeField]
|
||||||
@ -18,20 +20,47 @@ namespace Spine.Unity {
|
|||||||
[SerializeField]
|
[SerializeField]
|
||||||
private List<AtlasMaterialOverride> customMaterialOverrides = new List<AtlasMaterialOverride>();
|
private List<AtlasMaterialOverride> customMaterialOverrides = new List<AtlasMaterialOverride>();
|
||||||
|
|
||||||
public List<SlotMaterialOverride> CustomSlotMaterials {
|
#if UNITY_EDITOR
|
||||||
get { return customSlotMaterials; }
|
void Reset () {
|
||||||
}
|
skeletonRenderer = GetComponent<SkeletonRenderer>();
|
||||||
|
|
||||||
public List<AtlasMaterialOverride> CustomMaterialOverrides {
|
// Populate atlas list
|
||||||
get { return customMaterialOverrides; }
|
if (skeletonRenderer != null && skeletonRenderer.skeletonDataAsset != null) {
|
||||||
}
|
AtlasAsset[] atlasAssets = skeletonRenderer.skeletonDataAsset.atlasAssets;
|
||||||
|
|
||||||
public void SetCustomSlotMaterials() {
|
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 List<SlotMaterialOverride> CustomSlotMaterials { get { return customSlotMaterials; } }
|
||||||
|
public List<AtlasMaterialOverride> CustomMaterialOverrides { get { return customMaterialOverrides; } }
|
||||||
|
|
||||||
|
public void ReapplyOverrides () {
|
||||||
if (skeletonRenderer == null) {
|
if (skeletonRenderer == null) {
|
||||||
Debug.LogError("skeletonRenderer == null");
|
Debug.LogError("skeletonRenderer == null");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
RemoveCustomMaterialOverrides();
|
||||||
|
RemoveCustomSlotMaterials();
|
||||||
|
SetCustomMaterialOverrides();
|
||||||
|
SetCustomSlotMaterials();
|
||||||
|
}
|
||||||
|
|
||||||
|
void SetCustomSlotMaterials () {
|
||||||
for (int i = 0; i < customSlotMaterials.Count; i++) {
|
for (int i = 0; i < customSlotMaterials.Count; i++) {
|
||||||
SlotMaterialOverride slotMaterialOverride = customSlotMaterials[i];
|
SlotMaterialOverride slotMaterialOverride = customSlotMaterials[i];
|
||||||
if (slotMaterialOverride.overrideDisabled || string.IsNullOrEmpty(slotMaterialOverride.slotName))
|
if (slotMaterialOverride.overrideDisabled || string.IsNullOrEmpty(slotMaterialOverride.slotName))
|
||||||
@ -42,12 +71,7 @@ namespace Spine.Unity {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void RemoveCustomSlotMaterials() {
|
void RemoveCustomSlotMaterials () {
|
||||||
if (skeletonRenderer == null) {
|
|
||||||
Debug.LogError("skeletonRenderer == null");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (int i = 0; i < customSlotMaterials.Count; i++) {
|
for (int i = 0; i < customSlotMaterials.Count; i++) {
|
||||||
SlotMaterialOverride slotMaterialOverride = customSlotMaterials[i];
|
SlotMaterialOverride slotMaterialOverride = customSlotMaterials[i];
|
||||||
if (string.IsNullOrEmpty(slotMaterialOverride.slotName))
|
if (string.IsNullOrEmpty(slotMaterialOverride.slotName))
|
||||||
@ -67,12 +91,7 @@ namespace Spine.Unity {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void SetCustomMaterialOverrides() {
|
void SetCustomMaterialOverrides () {
|
||||||
if (skeletonRenderer == null) {
|
|
||||||
Debug.LogError("skeletonRenderer == null");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (int i = 0; i < customMaterialOverrides.Count; i++) {
|
for (int i = 0; i < customMaterialOverrides.Count; i++) {
|
||||||
AtlasMaterialOverride atlasMaterialOverride = customMaterialOverrides[i];
|
AtlasMaterialOverride atlasMaterialOverride = customMaterialOverrides[i];
|
||||||
if (atlasMaterialOverride.overrideDisabled)
|
if (atlasMaterialOverride.overrideDisabled)
|
||||||
@ -82,12 +101,7 @@ namespace Spine.Unity {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void RemoveCustomMaterialOverrides() {
|
void RemoveCustomMaterialOverrides () {
|
||||||
if (skeletonRenderer == null) {
|
|
||||||
Debug.LogError("skeletonRenderer == null");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (int i = 0; i < customMaterialOverrides.Count; i++) {
|
for (int i = 0; i < customMaterialOverrides.Count; i++) {
|
||||||
AtlasMaterialOverride atlasMaterialOverride = customMaterialOverrides[i];
|
AtlasMaterialOverride atlasMaterialOverride = customMaterialOverrides[i];
|
||||||
Material currentMaterial;
|
Material currentMaterial;
|
||||||
@ -102,9 +116,14 @@ namespace Spine.Unity {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void OnEnable() {
|
// OnEnable applies the overrides at runtime and when the editor loads.
|
||||||
if (skeletonRenderer == null) {
|
void OnEnable () {
|
||||||
|
if (skeletonRenderer == null)
|
||||||
skeletonRenderer = GetComponent<SkeletonRenderer>();
|
skeletonRenderer = GetComponent<SkeletonRenderer>();
|
||||||
|
|
||||||
|
if (skeletonRenderer == null) {
|
||||||
|
Debug.LogError("skeletonRenderer == null");
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
skeletonRenderer.Initialize(false);
|
skeletonRenderer.Initialize(false);
|
||||||
@ -112,33 +131,18 @@ namespace Spine.Unity {
|
|||||||
SetCustomSlotMaterials();
|
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();
|
RemoveCustomMaterialOverrides();
|
||||||
RemoveCustomSlotMaterials();
|
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;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
[Serializable]
|
[Serializable]
|
||||||
public class MaterialOverride {
|
public class MaterialOverride {
|
||||||
public bool overrideDisabled;
|
public bool overrideDisabled;
|
||||||
@ -148,7 +152,6 @@ namespace Spine.Unity {
|
|||||||
public class SlotMaterialOverride : MaterialOverride {
|
public class SlotMaterialOverride : MaterialOverride {
|
||||||
[SpineSlot]
|
[SpineSlot]
|
||||||
public string slotName;
|
public string slotName;
|
||||||
|
|
||||||
public Material material;
|
public Material material;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -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.
|
||||||
@ -0,0 +1,8 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 3d4db6c367e463c4cb5566afc490163c
|
||||||
|
timeCreated: 1460572571
|
||||||
|
licenseType: Free
|
||||||
|
TextScriptImporter:
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
Loading…
x
Reference in New Issue
Block a user