[unity] Fixed blend mode materials not being generated when sequence uses multiple atlas pages. Closes #2201.

This commit is contained in:
Harald Csaszar 2022-11-24 18:22:05 +01:00
parent 8fb3876396
commit 8c3533835a

View File

@ -203,40 +203,58 @@ namespace Spine.Unity.Editor {
var renderableAttachment = entry.Attachment as IHasTextureRegion; var renderableAttachment = entry.Attachment as IHasTextureRegion;
if (renderableAttachment != null) { if (renderableAttachment != null) {
var originalRegion = (AtlasRegion)renderableAttachment.Region; var originalRegion = (AtlasRegion)renderableAttachment.Region;
Sequence sequence = null; if (originalRegion != null) {
if (originalRegion == null && (sequence = renderableAttachment.Sequence) != null) { anyCreationFailed |= CreateForRegion(
if (sequence.Regions != null && sequence.Regions.Length > 0) ref replacementMaterials, ref anyReplacementMaterialsChanged,
originalRegion = (AtlasRegion)sequence.Regions[0]; originalRegion, materialTemplate, materialSuffix, skeletonDataAsset);
} } else {
bool replacementExists = replacementMaterials.Exists( Sequence sequence = renderableAttachment.Sequence;
replacement => replacement.pageName == originalRegion.page.name); if (sequence != null && sequence.Regions != null) {
if (!replacementExists) { for (int i = 0, count = sequence.Regions.Length; i < count; ++i) {
bool createdNewMaterial; originalRegion = (AtlasRegion)sequence.Regions[i];
var replacement = CreateOrLoadReplacementMaterial(originalRegion, materialTemplate, materialSuffix, out createdNewMaterial); anyCreationFailed |= CreateForRegion(
if (replacement != null) { ref replacementMaterials, ref anyReplacementMaterialsChanged,
replacementMaterials.Add(replacement); originalRegion, materialTemplate, materialSuffix, skeletonDataAsset);
anyReplacementMaterialsChanged = true;
if (createdNewMaterial) {
Debug.Log(string.Format("Created blend mode Material '{0}' for SkeletonData asset '{1}'.",
replacement.material.name, skeletonDataAsset), replacement.material);
} }
} else {
Debug.LogError(string.Format("Failed creating blend mode Material for SkeletonData asset '{0}'," +
" atlas page '{1}', template '{2}'.",
skeletonDataAsset.name, originalRegion.page.name, materialTemplate.name),
skeletonDataAsset);
anyCreationFailed = true;
} }
} }
} }
} }
} }
skeletonDataAsset.isUpgradingBlendModeMaterials = false; skeletonDataAsset.isUpgradingBlendModeMaterials = false;
EditorUtility.SetDirty(skeletonDataAsset); EditorUtility.SetDirty(skeletonDataAsset);
return !anyCreationFailed; return !anyCreationFailed;
} }
protected static bool CreateForRegion (ref List<BlendModeMaterials.ReplacementMaterial> replacementMaterials,
ref bool anyReplacementMaterialsChanged,
AtlasRegion originalRegion, Material materialTemplate, string materialSuffix,
SkeletonDataAsset skeletonDataAsset) {
bool anyCreationFailed = false;
bool replacementExists = replacementMaterials.Exists(
replacement => replacement.pageName == originalRegion.page.name);
if (!replacementExists) {
bool createdNewMaterial;
var replacement = CreateOrLoadReplacementMaterial(originalRegion, materialTemplate, materialSuffix, out createdNewMaterial);
if (replacement != null) {
replacementMaterials.Add(replacement);
anyReplacementMaterialsChanged = true;
if (createdNewMaterial) {
Debug.Log(string.Format("Created blend mode Material '{0}' for SkeletonData asset '{1}'.",
replacement.material.name, skeletonDataAsset), replacement.material);
}
} else {
Debug.LogError(string.Format("Failed creating blend mode Material for SkeletonData asset '{0}'," +
" atlas page '{1}', template '{2}'.",
skeletonDataAsset.name, originalRegion.page.name, materialTemplate.name),
skeletonDataAsset);
anyCreationFailed = true;
}
}
return anyCreationFailed;
}
protected static string GetBlendModeMaterialPath (AtlasPage originalPage, string materialSuffix) { protected static string GetBlendModeMaterialPath (AtlasPage originalPage, string materialSuffix) {
var originalMaterial = originalPage.rendererObject as Material; var originalMaterial = originalPage.rendererObject as Material;
var originalPath = AssetDatabase.GetAssetPath(originalMaterial); var originalPath = AssetDatabase.GetAssetPath(originalMaterial);