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(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(); bool chanaged = false; if (redpointBehaviour != null) { if (redpointBehaviour.simpleRedpoint != null) { Image img = redpointBehaviour.simpleRedpoint.GetComponent(); 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(); 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; } }