using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEditor; using System.IO; using System.Text.RegularExpressions; using UnityEngine.UI; public class ThirdLevelFrameProcessor { [MenuItem("程序/加载三级界面")] public static void CreateAllThirdLevelFrame() { var oldSprite1 = UILoader.LoadSprite("1LevelFrame", "TY_K_3J_2"); var oldSprite2 = UILoader.LoadSprite("1LevelFrame", "TY_K_3J_1"); var oldSprite3 = UILoader.LoadSprite("4Interactable", "Close_a"); var newSprite1 = UILoader.LoadSprite("1LevelFrame", "ThirdLevel_Frame"); var newSprite2 = UILoader.LoadSprite("1LevelFrame", "ThirdLevel_Bg"); var newSprite3 = UILoader.LoadSprite("1LevelFrame", "ThirdLevel_Close"); var path = AssetDatabase.GetAssetPath(newSprite1); var guid = AssetDatabase.AssetPathToGUID(path); var path1 = AssetDatabase.GetAssetPath(oldSprite1); var guid1 = AssetDatabase.AssetPathToGUID(path1); var path2 = AssetDatabase.GetAssetPath(oldSprite2); var guid2 = AssetDatabase.AssetPathToGUID(path2); var path3 = AssetDatabase.GetAssetPath(oldSprite3); var guid3 = AssetDatabase.AssetPathToGUID(path3); var allwindowGuids = AssetDatabase.FindAssets("t: prefab", new string[] { "Assets/ResourcesOut/UI/Window" }); var totalCount = allwindowGuids.Length; var count = 0; foreach (var windowGuid in allwindowGuids) { count++; var windowPath = AssetDatabase.GUIDToAssetPath(windowGuid); var content = File.ReadAllText(Application.dataPath + windowPath.Substring(6, windowPath.Length - 6)); GameObject instance = null; GameObject prefab = null; if (Regex.IsMatch(content, guid)) { prefab = AssetDatabase.LoadAssetAtPath(windowPath); instance = GameObject.Instantiate(prefab); instance.name = prefab.name; instance.SetActive(true); PrefabUtility.ConnectGameObjectToPrefab(instance, prefab); } continue; if (prefab == null) { continue; } Vector2 min = Vector2.zero; Vector2 max = Vector2.zero; var width = 0f; var images = prefab.GetComponentsInChildren(true); foreach (var image in images) { if (image.sprite == oldSprite1) { max = UIUtility.GetMaxWorldPosition(image.rectTransform); width = image.rectTransform.rect.width; } } foreach (var image in images) { if (image.sprite == oldSprite2 && min == Vector2.zero) { min = UIUtility.GetMinWorldPosition(image.rectTransform); } } Image image1 = null; Image image2 = null; Image image3 = null; foreach (var image in images) { if (image.sprite == oldSprite1) { image1 = image; var rectTransform = image.rectTransform; var oldHeight = rectTransform.rect.height; image.sprite = newSprite1; image.type = Image.Type.Sliced; image.transform.SetAsLastSibling(); rectTransform.pivot = rectTransform.anchorMax = rectTransform.anchorMin = Vector2.one * 0.5f; var x1 = max.y - oldHeight; var x2 = (max.y - min.y) * 0.5f - oldHeight; var y = x1 - x2; max = max.SetY(max.y - 3.5f); rectTransform.sizeDelta = new Vector2(width + 13, (max.y - min.y)); rectTransform.anchoredPosition = new Vector2((max.x + min.x) - 3.5f, y - 3.5f); } } foreach (var image in images) { if (image.sprite == oldSprite2) { if (image2 == null) { image2 = image; var rectTransform = image.rectTransform; image.sprite = newSprite2; image.type = Image.Type.Simple; rectTransform.pivot = Vector2.one * 0.5f; rectTransform.sizeDelta = image1.rectTransform.sizeDelta - new Vector2(55, 23); rectTransform.position = image1.transform.position - new Vector3(0, 8f, 0); var mirrorImage = image2.transform.GetComponent(); if (mirrorImage) { Object.DestroyImmediate(mirrorImage, true); } } else { GameObject.DestroyImmediate(image.gameObject, true); } } } foreach (var image in images) { if (image.sprite == oldSprite3 && image.gameObject.activeSelf) { image3 = image; var rectTransform = image.rectTransform; image.sprite = newSprite3; image.SetNativeSize(); image.transform.SetParent(image1.transform); image.transform.SetAsLastSibling(); rectTransform.position = image1.transform.position + new Vector3(image1.rectTransform.rect.width * 0.5f, image1.rectTransform.rect.height * 0.5f, 0f) - new Vector3(33f, 2.3f, 0f); } } EditorUtility.DisplayProgressBar("处理中三级界面", "处理中...", (float)count / totalCount); } EditorUtility.ClearProgressBar(); } }