From 51497d37d2ea18aa4e439250119bb6f01224f519 Mon Sep 17 00:00:00 2001
From: hch <305670599@qq.com>
Date: 星期五, 25 九月 2026 13:29:41 +0800
Subject: [PATCH] 0312 修复图集死循环问题

---
 Assets/Editor/Tool/UpdateSpritePackingSetting.cs |   75 ++++++++++++++++++++++++++++++++++++-
 1 files changed, 72 insertions(+), 3 deletions(-)

diff --git a/Assets/Editor/Tool/UpdateSpritePackingSetting.cs b/Assets/Editor/Tool/UpdateSpritePackingSetting.cs
index ab7a208..bcb368c 100644
--- a/Assets/Editor/Tool/UpdateSpritePackingSetting.cs
+++ b/Assets/Editor/Tool/UpdateSpritePackingSetting.cs
@@ -13,8 +13,34 @@
     static string rootPath = Application.dataPath + "/ResourcesOut/Sprite";
     static string spriteRelativePath = "Assets/ResourcesOut/Sprite";
 
+    /// <summary>
+    /// 鍥鹃泦澶勭悊娴佺▼鐨勯噸鍏ヤ繚鎶わ細娴佺▼鍐呴儴浼氬ぇ閲� SaveAndReimport / ImportAsset锛�
+    /// 杩欎簺閮戒細瑙﹀彂 AssetPostprocessor锛岃嫢涓嶆尅浣忛噸鍏ュ氨浼氫笌鎵瑰鐞�/鑿滃崟瑙﹀彂褰㈡垚浜掔浉瀵煎叆銆�
+    /// </summary>
+    private static bool s_IsRunning;
+
     [MenuItem("绋嬪簭/Sprite/鏍囧噯鍖朣prite璁剧疆")]
     public static void UpdateAllSpritePackingSetting()
+    {
+        if (s_IsRunning)
+        {
+            Debug.LogWarning("[SpritePack] 涓婁竴娆″浘闆嗗鐞嗗皻鏈粨鏉燂紝宸茶烦杩囨湰娆¤皟鐢�");
+            return;
+        }
+
+        s_IsRunning = true;
+        try
+        {
+            UpdateAllSpritePackingSettingInternal();
+        }
+        finally
+        {
+            s_IsRunning = false;
+            EditorUtility.ClearProgressBar();
+        }
+    }
+
+    private static void UpdateAllSpritePackingSettingInternal()
     {
         var path = "Assets/Editor/SpritePacking/SpriteSettings.asset";
         var so = AssetDatabase.LoadAssetAtPath<SpriteSettingConfig>(path);
@@ -107,7 +133,7 @@
 
         EditorUtility.ClearProgressBar();
 
-        SpritePack();
+        SpritePackInternal();
     }
 
     [MenuItem("绋嬪簭/Sprite/鎵撳寘BuiltIn鍥鹃泦")]
@@ -151,6 +177,11 @@
                 }
             };
             spriteAtlas = CreateSpriteAtlas(spriteRelativePath_BuiltIn, setting);
+            if (spriteAtlas == null)
+            {
+                Debug.LogError($"[SpritePack] 鍒涘缓 BuiltIn 鍥鹃泦澶辫触: {builtInSpritePath}");
+                return;
+            }
         }
         List<string> excludePngs = new List<string>() { "Launch_1.png", "Launch_2.png", "Launch_3.png", "LoginBackGround.png", "TB_DL_Logo.png" };
 
@@ -166,6 +197,26 @@
 
     [MenuItem("绋嬪簭/Sprite/鎵撳寘鍥鹃泦")]
     public static void SpritePack()
+    {
+        if (s_IsRunning)
+        {
+            Debug.LogWarning("[SpritePack] 涓婁竴娆″浘闆嗗鐞嗗皻鏈粨鏉燂紝宸茶烦杩囨湰娆¤皟鐢�");
+            return;
+        }
+
+        s_IsRunning = true;
+        try
+        {
+            SpritePackInternal();
+        }
+        finally
+        {
+            s_IsRunning = false;
+            EditorUtility.ClearProgressBar();
+        }
+    }
+
+    private static void SpritePackInternal()
     {
         var path = "Assets/Editor/SpritePacking/SpriteSettings.asset";
         var so = AssetDatabase.LoadAssetAtPath<SpriteSettingConfig>(path);
@@ -195,6 +246,11 @@
             if (spriteAtlas == null)
             {
                 spriteAtlas = CreateSpriteAtlas(spriteRelativePath, setting);
+                if (spriteAtlas == null)
+                {
+                    Debug.LogError($"[SpritePack] 鍒涘缓鍥鹃泦澶辫触: {filePath}");
+                    continue;
+                }
             }
 
             string spriteFilePath = rootPath + "/" + spritefilePathName;
@@ -233,8 +289,12 @@
         string atlasPath = outPath + "/" + setting.folderName + ".spriteatlasv2";
         CreateEmptySpriteAtlas(atlasPath);
 
-        
         SpriteAtlasImporter atlasImporter = SpriteAtlasImporter.GetAtPath(atlasPath) as SpriteAtlasImporter;
+        if (atlasImporter == null)
+        {
+            Debug.LogError($"[SpritePack] 鑾峰彇 SpriteAtlasImporter 澶辫触: {atlasPath}");
+            return null;
+        }
 
         #region 鍥鹃泦鍩虹璁剧疆
 
@@ -288,7 +348,11 @@
     {
         SpriteAtlasAsset.Save(new SpriteAtlasAsset(), atlasPath);
         AssetDatabase.SaveAssets();
-        AssetDatabase.Refresh();
+
+        // 杩欓噷鍙兘鐢ㄧ簿纭鍏ワ紝涓嶈兘璋冪敤 AssetDatabase.Refresh()锛�
+        // 鍏ㄥ簱鍒锋柊浼氭妸鍒氬啓鍏ョ殑鍥鹃泦鍐嶆鎺ㄥ叆瀵煎叆娴佺▼锛岃繘鑰岃Е鍙� OnPostprocessAllAssets锛�
+        // 琚� Unity 鍒ゅ畾涓� "infinite import loop"锛圸ZBF.spriteatlasv2 鍙嶅 changed锛夈��
+        AssetDatabase.ImportAsset(atlasPath, ImportAssetOptions.ForceSynchronousImport);
     }
 
     
@@ -308,6 +372,11 @@
         FileName(spriteFilePath, excludePng);
 
         SpriteAtlas spriteAtlasTmp = AssetDatabase.LoadAssetAtPath(filePath, typeof(UnityEngine.Object)) as SpriteAtlas;
+        if (spriteAtlasTmp == null)
+        {
+            Debug.LogError($"[SpritePack] 鏃犳硶鍔犺浇鍥鹃泦锛岃烦杩囨洿鏂�: {filePath}");
+            return;
+        }
 
         // 鑾峰彇鍥鹃泦涓嬪浘鐗�
         List<UnityEngine.Object> packables = new List<UnityEngine.Object>(spriteAtlasTmp.GetPackables());

--
Gitblit v1.8.0