[unity] Fixed SpineBuildProcessor potentially trying to modifying a readonly prefab asset. Closes #2223.

This commit is contained in:
Harald Csaszar 2023-01-11 21:26:01 +01:00
parent 07b54ee18e
commit 042a6dfd1d
2 changed files with 19 additions and 0 deletions

View File

@ -51,6 +51,10 @@
#define PROBLEMATIC_PACKAGE_ASSET_MODIFICATION #define PROBLEMATIC_PACKAGE_ASSET_MODIFICATION
#endif #endif
#if UNITY_2017_3_OR_NEWER
#define HAS_PACKAGE_INFO
#endif
using System.Collections.Generic; using System.Collections.Generic;
using System.IO; using System.IO;
using System.Linq; using System.Linq;
@ -114,6 +118,17 @@ namespace Spine.Unity.Editor {
} }
} }
public static bool AssetCanBeModified (string assetPath) {
#if HAS_PACKAGE_INFO
UnityEditor.PackageManager.PackageInfo packageInfo = UnityEditor.PackageManager.PackageInfo.FindForAssetPath(assetPath);
return (packageInfo == null ||
packageInfo.source == UnityEditor.PackageManager.PackageSource.Embedded ||
packageInfo.source == UnityEditor.PackageManager.PackageSource.Local);
#else
return assetPath.StartsWith("Assets");
#endif
}
#region Match SkeletonData with Atlases #region Match SkeletonData with Atlases
static readonly AttachmentType[] AtlasTypes = { AttachmentType.Region, AttachmentType.Linkedmesh, AttachmentType.Mesh }; static readonly AttachmentType[] AtlasTypes = { AttachmentType.Region, AttachmentType.Linkedmesh, AttachmentType.Mesh };

View File

@ -91,6 +91,8 @@ namespace Spine.Unity.Editor {
string[] prefabAssets = AssetDatabase.FindAssets("t:Prefab"); string[] prefabAssets = AssetDatabase.FindAssets("t:Prefab");
foreach (string asset in prefabAssets) { foreach (string asset in prefabAssets) {
string assetPath = AssetDatabase.GUIDToAssetPath(asset); string assetPath = AssetDatabase.GUIDToAssetPath(asset);
if (!AssetUtility.AssetCanBeModified(assetPath)) continue;
GameObject prefabGameObject = AssetDatabase.LoadAssetAtPath<GameObject>(assetPath); GameObject prefabGameObject = AssetDatabase.LoadAssetAtPath<GameObject>(assetPath);
if (SpineEditorUtilities.CleanupSpinePrefabMesh(prefabGameObject)) { if (SpineEditorUtilities.CleanupSpinePrefabMesh(prefabGameObject)) {
#if HAS_SAVE_ASSET_IF_DIRTY #if HAS_SAVE_ASSET_IF_DIRTY
@ -139,6 +141,8 @@ namespace Spine.Unity.Editor {
string[] spriteAtlasAssets = AssetDatabase.FindAssets("t:SpineSpriteAtlasAsset"); string[] spriteAtlasAssets = AssetDatabase.FindAssets("t:SpineSpriteAtlasAsset");
foreach (string asset in spriteAtlasAssets) { foreach (string asset in spriteAtlasAssets) {
string assetPath = AssetDatabase.GUIDToAssetPath(asset); string assetPath = AssetDatabase.GUIDToAssetPath(asset);
if (!AssetUtility.AssetCanBeModified(assetPath)) continue;
SpineSpriteAtlasAsset atlasAsset = AssetDatabase.LoadAssetAtPath<SpineSpriteAtlasAsset>(assetPath); SpineSpriteAtlasAsset atlasAsset = AssetDatabase.LoadAssetAtPath<SpineSpriteAtlasAsset>(assetPath);
if (atlasAsset && atlasAsset.materials.Length > 0) { if (atlasAsset && atlasAsset.materials.Length > 0) {
spriteAtlasTexturesToRestore[assetPath] = AssetDatabase.GetAssetPath(atlasAsset.materials[0].mainTexture); spriteAtlasTexturesToRestore[assetPath] = AssetDatabase.GetAssetPath(atlasAsset.materials[0].mainTexture);