mirror of
https://github.com/EsotericSoftware/spine-runtimes.git
synced 2026-02-06 07:14:55 +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
|
||||
* 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<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();
|
||||
{
|
||||
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();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -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;
|
||||
|
||||
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) {
|
||||
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<SkeletonRenderer>();
|
||||
|
||||
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<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]
|
||||
public class MaterialOverride {
|
||||
public bool overrideDisabled;
|
||||
@ -148,7 +152,6 @@ namespace Spine.Unity {
|
||||
public class SlotMaterialOverride : MaterialOverride {
|
||||
[SpineSlot]
|
||||
public string slotName;
|
||||
|
||||
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