using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEditor; using System.IO; using UnityEngine.UI; using Snxxz.UI; using System.Windows.Forms; using dnlib.DotNet; //导出已打开的(或者指定名)界面用到的图片 public class ExportPrefabsIMG : EditorWindow { private static string topFilePath= "Assets/ResourcesOut/UI/Window/"; private static string builtInFilePath = "Assets/ResourcesOut/BuiltIn/Prefabs/"; private static string priorityWindowFilePath = "Assets/ResourcesOut/UI/PriorityWindow/"; private static ExportPrefabsIMG window = null; private Vector2 scrollPosition; private static int exportType = 0; //0 运行时界面 1 builtin目录界面 2 window目录界面 3 priorityWindow目录界面 public class FileToggleInfo { public FileToggleInfo(string fileName, bool sel) { fileInfo = fileName; isSelect = sel; } public string fileInfo = null; public bool isSelect = false; } private static List _tableNameLst = new List(); //所有表名字列表 [UnityEditor.MenuItem("策划工具/导出指定界面的图片", false)] static void Init() { exportType = 0; window = GetWindow(typeof(ExportPrefabsIMG), true, "导出界面图片,运行时导出会更准确") as ExportPrefabsIMG; window.position = new Rect(UnityEngine.Screen.width / 2, UnityEngine.Screen.height / 2, 300, 700); window.Show(); } private void OnGUI() { GUILayout.BeginVertical(); scrollPosition = GUILayout.BeginScrollView(scrollPosition); ShowTableNames(); GUILayout.EndScrollView(); GUILayout.FlexibleSpace(); GUILayout.BeginHorizontal(); if (GUILayout.Button("刷新运行时界面")) { exportType = 0; GetDicFiles(); } GUILayout.EndHorizontal(); GUILayout.BeginHorizontal(); if (GUILayout.Button("刷新builtIn界面")) { exportType = 1; GetDicFiles(); } GUILayout.EndHorizontal(); GUILayout.BeginHorizontal(); if (GUILayout.Button("刷新Window界面")) { exportType = 2; GetDicFiles(); } GUILayout.EndHorizontal(); GUILayout.BeginHorizontal(); if (GUILayout.Button("刷新PriorityWindow界面")) { exportType = 3; GetDicFiles(); } GUILayout.EndHorizontal(); GUILayout.BeginHorizontal(); if (GUILayout.Button("全选")) { SelectAll(); } GUILayout.EndHorizontal(); GUILayout.BeginHorizontal(); if (GUILayout.Button("导出图片")) { Export(); MessageBox.Show("导出图片成功!(查看根目录的OpenWindowImages)"); AssetDatabase.Refresh(); } GUILayout.EndHorizontal(); GUIUtility.ExitGUI(); } private void ShowTableNames() { if (_tableNameLst == null) { return; } for (int i = 0; i < _tableNameLst.Count; i++) { string tableName = _tableNameLst[i].fileInfo; _tableNameLst[i].isSelect = GUILayout.Toggle(_tableNameLst[i].isSelect, tableName); } } // 0 运行时界面 1 builtin目录界面 2 window目录界面 private void GetDicFiles() { _tableNameLst.Clear(); if (exportType == 0) { if (!EditorApplication.isPlaying || WindowCenter.Instance.openWinNames.IsNullOrEmpty()) { MessageBox.Show("请在游戏运行时打开界面"); return; } foreach (var item in WindowCenter.Instance.openWinNames) { _tableNameLst.Add(new FileToggleInfo(item.Key, false)); } } else if (exportType == 1) { DirectoryInfo folder = new DirectoryInfo(@builtInFilePath); if (folder != null) { FileInfo[] fileInfoArr = folder.GetFiles("*.prefab"); if (fileInfoArr == null || fileInfoArr.Length <= 0) { return; } for (int i = 0, length = fileInfoArr.Length; i < length; i++) { _tableNameLst.Add(new FileToggleInfo(fileInfoArr[i].Name.Split('.')[0], false)); } } } else if (exportType == 2) { DirectoryInfo folder = new DirectoryInfo(@topFilePath); if (folder != null) { FileInfo[] fileInfoArr = folder.GetFiles("*.prefab"); if (fileInfoArr == null || fileInfoArr.Length <= 0) { return; } for (int i = 0, length = fileInfoArr.Length; i < length; i++) { _tableNameLst.Add(new FileToggleInfo(fileInfoArr[i].Name.Split('.')[0], false)); } } } else if (exportType == 3) { DirectoryInfo folder = new DirectoryInfo(@priorityWindowFilePath); if (folder != null) { FileInfo[] fileInfoArr = folder.GetFiles("*.prefab"); if (fileInfoArr == null || fileInfoArr.Length <= 0) { return; } for (int i = 0, length = fileInfoArr.Length; i < length; i++) { _tableNameLst.Add(new FileToggleInfo(fileInfoArr[i].Name.Split('.')[0], false)); } } } } private void SelectAll() { if (_tableNameLst == null) { MessageBox.Show("请先刷新界面"); return; } for (int i = 0; i < _tableNameLst.Count; i++) { if (_tableNameLst[i] == null) { continue; } if (_tableNameLst[i].fileInfo == null) { continue; } _tableNameLst[i].isSelect = true; } } private void Export() { //导出指定界面 或者 选中已打开的界面 if (!Directory.Exists("OpenWindowImages")) Directory.CreateDirectory("OpenWindowImages"); if (_tableNameLst == null) { MessageBox.Show("先刷新界面"); return; } for (int i = 0; i < _tableNameLst.Count; i++) { if (!_tableNameLst[i].isSelect) { continue; } string fileName = _tableNameLst[i].fileInfo; string filePath; if (exportType == 0) { if (WindowCenter.Instance.openWinNames[fileName]) { filePath = builtInFilePath + _tableNameLst[i].fileInfo + ".prefab"; } else { filePath = topFilePath + _tableNameLst[i].fileInfo + ".prefab"; } if (!File.Exists(filePath)) { filePath = priorityWindowFilePath + _tableNameLst[i].fileInfo + ".prefab"; } } else if (exportType == 1) { filePath = builtInFilePath + _tableNameLst[i].fileInfo + ".prefab"; } else if (exportType == 2) { filePath = topFilePath + _tableNameLst[i].fileInfo + ".prefab"; } else { filePath = priorityWindowFilePath + _tableNameLst[i].fileInfo + ".prefab"; } GameObject _prefab = AssetDatabase.LoadAssetAtPath(filePath); if (_prefab == null) { Debug.LogFormat("无法取得文件 {0}", filePath); continue; } Image[] transArr14 = _prefab.GetComponentsInChildren(true); foreach (Image item in transArr14) { var path = AssetDatabase.GetAssetPath(item.sprite.GetInstanceID()); if (string.IsNullOrEmpty(path)) continue; if (!path.Contains("ResourcesOut")) continue; if (!Directory.Exists("OpenWindowImages/" + fileName)) Directory.CreateDirectory("OpenWindowImages/" + fileName); if (!File.Exists("OpenWindowImages/" + fileName + "/" + item.sprite.name + ".png")) File.Copy(path, "OpenWindowImages/" + fileName + "/" + item.sprite.name + ".png"); } } } }