| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243 | 
							- using UnityEngine;
 
- using UnityEditor;
 
- using UnityEngine.UI;
 
- using System.Collections.Generic;
 
- using System.IO;
 
- using System.Linq;
 
- public class FindSelectedPrefabImages : EditorWindow
 
- {
 
-     private string targetFolder = "D:/FB/XiuXianGame/美术/art_use_ui/all"; // 指定外部图片目录(可修改)
 
-     private Vector2 scrollPosition;
 
-     [MenuItem("Tools/查找选中预制件中的Sprite图片名称")]
 
-     public static void ShowWindow()
 
-     {
 
-         // 显示编辑器窗口
 
-         GetWindow<FindSelectedPrefabImages>("查找Sprite图片名称");
 
-     }
 
-     void OnGUI()
 
-     {
 
-         GUILayout.Label("查找选中预制件中的Sprite图片名称(包括隐藏和所有深层子节点)并删除不匹配的图片", EditorStyles.boldLabel);
 
-         // 输入外部目标文件夹路径
 
-         GUILayout.Label("外部图片文件夹路径(例如 D:/Images):");
 
-         targetFolder = EditorGUILayout.TextField(targetFolder);
 
-         if (GUILayout.Button("查找Sprite图片名称并删除不匹配图片"))
 
-         {
 
-             DeleteNonMatchingImages();
 
-         }
 
-     
 
-         
 
-         
 
-         if (GUILayout.Button("开始替换"))
 
-         {
 
-             ReplaceImagesInPrefabs(targetFolder);
 
-         }
 
-     }
 
-     private void ReplaceImagesInPrefabs(string path)
 
-     {
 
-         string[] guids = AssetDatabase.FindAssets("t:Prefab", new[] { path });
 
-         foreach (string guid in guids)
 
-         {
 
-             string assetPath = AssetDatabase.GUIDToAssetPath(guid);
 
-             GameObject prefab = AssetDatabase.LoadAssetAtPath<GameObject>(assetPath);
 
-             if (prefab == null) continue;
 
-             GameObject instance = (GameObject)PrefabUtility.InstantiatePrefab(prefab);
 
-             bool changed = false;
 
-             MyImage[] images = instance.GetComponentsInChildren<MyImage>(true);
 
-             foreach (var img in images)
 
-             {
 
-                 img.UseGradient = false;
 
-                 changed = true;
 
-             }
 
-             if (changed)
 
-             {
 
-                 PrefabUtility.SaveAsPrefabAsset(instance, assetPath);
 
-                 Debug.Log($"更新了预制件:{assetPath}");
 
-             }
 
-             DestroyImmediate(instance);
 
-         }
 
-         AssetDatabase.Refresh();
 
-         Debug.Log("替换完成!");
 
-     }
 
-     private void GetName(GameObject obj, HashSet<string> spriteFileNames)
 
-     {
 
-         // 查找该对象及其所有子对象(包括深层子节点)的Image组件,包括非活跃的
 
-         MyImage img = obj.GetComponent<MyImage>();
 
-         if (img != null)
 
-         {
 
-             // 获取Sprite的资源路径
 
-             // string spritePath = AssetDatabase.GetAssetPath(img.sprite);
 
-             if (!string.IsNullOrEmpty(img.icon_name) && img.icon_name != "")
 
-             {
 
-                 spriteFileNames.Add(img.icon_name);
 
-             }
 
-         }
 
-         List<Transform> images = obj.GetComponentsInChildren<Transform>(true)?.ToList();
 
-         if (images != null && images.Count > 0)
 
-         {
 
-             images.Remove(obj.transform);
 
-             foreach (var myImage in images)
 
-             {
 
-                 // if (myImage.sprite != null)
 
-                 {
 
-                     GetName(myImage.gameObject, spriteFileNames);
 
-                 }
 
-             }
 
-         }
 
-     }
 
-     private void DeleteNonMatchingImages()
 
-     {
 
-         // 获取当前选中的对象
 
-         GameObject[] selectedObjects = Selection.gameObjects;
 
-         if (selectedObjects.Length == 0)
 
-         {
 
-             Debug.LogWarning("没有选中任何对象!");
 
-             return;
 
-         }
 
-         // 存储Sprite图片的文件名(不含扩展名,忽略大小写)
 
-         HashSet<string> spriteFileNames = new HashSet<string>(System.StringComparer.OrdinalIgnoreCase);
 
-         // 查找所有引用的Sprite
 
-         foreach (GameObject obj in selectedObjects)
 
-         {
 
-             // 检查是否为预制件
 
-             if (PrefabUtility.IsPartOfAnyPrefab(obj))
 
-             {
 
-                 GetName(obj, spriteFileNames);
 
-                 // 查找该对象及其所有子对象(包括深层子节点)的Image组件,包括非活跃的
 
-                 // MyImage[] images = obj.GetComponentsInChildren<MyImage>(true);
 
-                 // foreach (MyImage img in images)
 
-                 // {
 
-                 //     if (img.sprite != null)
 
-                 //     {
 
-                 //         // 获取Sprite的资源路径
 
-                 //         string spritePath = AssetDatabase.GetAssetPath(img.sprite);
 
-                 //         if (!string.IsNullOrEmpty(spritePath))
 
-                 //         {
 
-                 //             // 提取文件名(不含扩展名)
 
-                 //             string fileNameWithoutExtension = Path.GetFileNameWithoutExtension(spritePath);
 
-                 //             spriteFileNames.Add(fileNameWithoutExtension);
 
-                 //             // 记录GameObject的层级路径、深度和活跃状态
 
-                 //             string hierarchyPath = GetGameObjectPath(img.gameObject);
 
-                 //             int depth = GetHierarchyDepth(img.gameObject);
 
-                 //             bool isActive = img.gameObject.activeInHierarchy;
 
-                 //             Debug.Log($"找到Sprite: {img.gameObject.name}, 文件名: {fileNameWithoutExtension}, 路径: {spritePath}, 层级: {hierarchyPath}, 层级深度: {depth}, 活跃状态: {(isActive ? "显示" : "隐藏")}");
 
-                 //         }
 
-                 //     }
 
-                 // }
 
-             }
 
-         }
 
-         if (spriteFileNames.Count == 0)
 
-         {
 
-             Debug.LogWarning("选中的预制件中没有找到任何Sprite图片。");
 
-             return;
 
-         }
 
-         // 输出所有找到的Sprite文件名
 
-         Debug.Log($"找到的Sprite图片文件名: {string.Join(", ", spriteFileNames)}");
 
-         // 检查外部目标文件夹是否存在
 
-         if (!Directory.Exists(targetFolder))
 
-         {
 
-             Debug.LogError($"外部目标文件夹 {targetFolder} 不存在!");
 
-             return;
 
-         }
 
-         // 获取目标文件夹中的所有图片文件
 
-         string[] imageExtensions = { "*.png", "*.jpg", "*.jpeg", "*.tga" };
 
-         List<string> allImageFiles = new List<string>();
 
-         foreach (string ext in imageExtensions)
 
-         {
 
-             allImageFiles.AddRange(Directory.GetFiles(targetFolder, ext, SearchOption.AllDirectories)
 
-                 .Select(path => path.Replace("\\", "/"))); // 统一路径分隔符
 
-         }
 
-         // 找出需要删除的图片(文件名不匹配Sprite文件名)
 
-         List<string> filesToDelete = allImageFiles
 
-             .Where(file =>
 
-             {
 
-                 string fileNameWithoutExtension = Path.GetFileNameWithoutExtension(file);
 
-                 return !spriteFileNames.Contains(fileNameWithoutExtension);
 
-             })
 
-             .ToList();
 
-         if (filesToDelete.Count == 0)
 
-         {
 
-             Debug.Log("外部目录中没有需要删除的图片文件(所有图片文件名均匹配Sprite文件名)。");
 
-             return;
 
-         }
 
-         // 确认删除
 
-         if (EditorUtility.DisplayDialog("确认删除",
 
-                 $"将要删除 {filesToDelete.Count} 个文件名不匹配Sprite图片的图片文件,是否继续?", "确定", "取消"))
 
-         {
 
-             int deletedCount = 0;
 
-             foreach (string file in filesToDelete)
 
-             {
 
-                 try
 
-                 {
 
-                     File.Delete(file);
 
-                     Debug.Log($"已删除图片: {file}");
 
-                     deletedCount++;
 
-                 }
 
-                 catch (System.Exception e)
 
-                 {
 
-                     Debug.LogError($"删除图片失败: {file}, 错误: {e.Message}");
 
-                 }
 
-             }
 
-             Debug.Log($"删除完成,共删除 {deletedCount} 个图片文件。");
 
-         }
 
-         else
 
-         {
 
-             Debug.Log("取消删除操作。");
 
-         }
 
-     }
 
-     // 获取GameObject的层级路径(用于显示递归层级)
 
-     private string GetGameObjectPath(GameObject obj)
 
-     {
 
-         string path = obj.name;
 
-         while (obj.transform.parent != null)
 
-         {
 
-             obj = obj.transform.parent.gameObject;
 
-             path = obj.name + "/" + path;
 
-         }
 
-         return path;
 
-     }
 
-     // 计算GameObject的层级深度(根节点为0)
 
-     private int GetHierarchyDepth(GameObject obj)
 
-     {
 
-         int depth = 0;
 
-         while (obj.transform.parent != null)
 
-         {
 
-             obj = obj.transform.parent.gameObject;
 
-             depth++;
 
-         }
 
-         return depth;
 
-     }
 
- }
 
 
  |