| using System.Collections; | 
| using System.Collections.Generic; | 
| using UnityEngine; | 
| using UnityEditor; | 
| using System.Text.RegularExpressions; | 
| using System.IO; | 
| using UnityEngine.UI; | 
| using Snxxz.UI; | 
| public class ReplaceImgTool : EditorWindow { | 
|   | 
|     [MenuItem("策划工具/批量替换预制体图片", false)] | 
|     public static void CreateWindow() | 
|     { | 
|         ReplaceImgTool window = (ReplaceImgTool)EditorWindow.GetWindow(typeof(ReplaceImgTool), true, "批量替换预制体图片", true); | 
|         window.Show(); | 
|     } | 
|   | 
|     private static Sprite replaceSprite; | 
|     private static int redpointImgSize = 23; | 
|     private static string topFilePath=string.Empty; | 
|     private static string replaceName = string.Empty; | 
|     private static GameObject replacePrefab = null; | 
|   | 
|     static ReplaceType replaceType = ReplaceType.RedPoint; | 
|   | 
|     enum ReplaceType | 
|     { | 
|         RedPoint, | 
|     } | 
|   | 
|     private void OnGUI() | 
|     { | 
|         EditorGUILayout.BeginHorizontal(); | 
|         replaceSprite = EditorGUILayout.ObjectField("Replace Sprite", replaceSprite, typeof(Sprite), false,GUILayout.Width(300)) as Sprite; | 
|         EditorGUILayout.EndHorizontal(); | 
|   | 
|         EditorGUILayout.BeginHorizontal(); | 
|         redpointImgSize = EditorGUILayout.IntField("Img Size", redpointImgSize); | 
|         EditorGUILayout.EndHorizontal(); | 
|   | 
|         EditorGUILayout.BeginHorizontal(); | 
|         replaceType=(ReplaceType)EditorGUILayout.EnumPopup("ReplaceType:", replaceType); | 
|         EditorGUILayout.EndHorizontal(); | 
|   | 
|         switch (replaceType) { | 
|             case ReplaceType.RedPoint: { | 
|                     UnityEngine.Object[] arr = Selection.GetFiltered(typeof(UnityEngine.Object), SelectionMode.Assets); | 
|                     topFilePath = (arr == null || arr.Length == 0) ? topFilePath : Application.dataPath.Substring(0, Application.dataPath.LastIndexOf('/')) + "/" + AssetDatabase.GetAssetPath(arr[0]); | 
|                     EditorGUILayout.BeginHorizontal(); | 
|                     topFilePath = EditorGUILayout.TextField("Top File Path:", topFilePath); | 
|                     EditorGUILayout.EndHorizontal(); | 
|                 } | 
|                 break; | 
|         } | 
|         EditorGUILayout.BeginHorizontal(); | 
|         if (GUILayout.Button("开始替换",GUILayout.Width(100))) { | 
|             Replace(); | 
|         } | 
|         EditorGUILayout.EndHorizontal(); | 
|     } | 
|   | 
|   | 
|     private static void Replace() | 
|     { | 
|         if (replaceSprite == null)  | 
|         { | 
|             Debug.LogError("图片不能为空"); | 
|             return; | 
|         } | 
|         if (replaceType ==ReplaceType.RedPoint&&Regex.IsMatch(topFilePath, @".*\..*")) { | 
|             Debug.LogError("必须为文件夹路径"); | 
|             return; | 
|         } | 
|         switch (replaceType) { | 
|             case ReplaceType.RedPoint: { | 
|                     string[] filepaths = Directory.GetFiles(topFilePath, "*.prefab", SearchOption.AllDirectories); | 
|                     int startIndex = 0; | 
|                     EditorApplication.update = delegate () { | 
|                         string file = filepaths[startIndex]; | 
|                         file = file.Substring(file.IndexOf("Assets")); | 
|                         bool isCancel = EditorUtility.DisplayCancelableProgressBar("替换图片资源", file, (float)startIndex / (float)filepaths.Length); | 
|                         GameObject _prefab = AssetDatabase.LoadAssetAtPath<GameObject>(file); | 
|                         ReplaceRedPoint(_prefab); | 
|                         startIndex++; | 
|                         if (isCancel || startIndex >= filepaths.Length) { | 
|                             EditorUtility.ClearProgressBar(); | 
|                             EditorApplication.update = null; | 
|                             startIndex = 0; | 
|                             AssetDatabase.SaveAssets(); | 
|                             AssetDatabase.Refresh(); | 
|                         } | 
|                     }; | 
|                 } | 
|                 break; | 
|         } | 
|     } | 
|   | 
|     private static void ReplaceRedPoint(GameObject source) | 
|     { | 
|         if (RecursionFind(source.transform)) { | 
|             EditorUtility.SetDirty(source); | 
|         } | 
|     } | 
|   | 
|     private static bool RecursionFind(Transform parent) | 
|     { | 
|         RedpointBehaviour redpointBehaviour = parent.GetComponent<RedpointBehaviour>(); | 
|         bool chanaged = false; | 
|         if (redpointBehaviour != null) { | 
|             if (redpointBehaviour.simpleRedpoint != null) { | 
|                 Image img = redpointBehaviour.simpleRedpoint.GetComponent<Image>(); | 
|                 if (img != null) { | 
|                     img.sprite = replaceSprite; | 
|                     img.color = Color.white; | 
|                     img.rectTransform.anchorMax = new Vector2(0.5f, 0.5f); | 
|                     img.rectTransform.anchorMin = new Vector2(0.5f, 0.5f); | 
|                     img.rectTransform.sizeDelta = new Vector2(redpointImgSize, redpointImgSize); | 
|                 } | 
|             } | 
|             if (redpointBehaviour.quantityRedpoint != null) { | 
|                 Image img = redpointBehaviour.quantityRedpoint.GetComponent<Image>(); | 
|                 if (img != null) { | 
|                     img.sprite = replaceSprite; | 
|                     img.color = Color.white; | 
|                     img.rectTransform.anchorMax = new Vector2(0.5f, 0.5f); | 
|                     img.rectTransform.anchorMin = new Vector2(0.5f, 0.5f); | 
|                     img.rectTransform.sizeDelta = new Vector2(redpointImgSize, redpointImgSize); | 
|                 } | 
|             } | 
|             if (redpointBehaviour.quantityText != null) { | 
|                 redpointBehaviour.quantityText.color = new Color32(247, 247, 247, 255); | 
|                 redpointBehaviour.quantityText.fontSize = 22; | 
|                 redpointBehaviour.quantityText.rectTransform.sizeDelta = new Vector2(25, 25); | 
|                 redpointBehaviour.quantityText.rectTransform.localPosition = Vector3.zero; | 
|             } | 
|             chanaged = true; | 
|         } | 
|         foreach (Transform child in parent) { | 
|             if (RecursionFind(child)) { | 
|                 chanaged = true; | 
|             } | 
|         } | 
|         return chanaged; | 
|     } | 
| } |