[Unity] Workflow cleanup for serialized custom materials module.

This commit is contained in:
pharan 2016-04-14 03:36:36 +08:00
parent 1fe73b0f53
commit bf35d4979e
4 changed files with 109 additions and 61 deletions

View File

@ -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();
}
}
}
}

View File

@ -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;
}

View File

@ -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.

View File

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