using UnityEngine; using UnityEditor; using System.Collections.Generic; public class UIAdjustEditor : EditorWindow { private string uiName = ""; private bool destroyOnClose = false; private Vector2 scrollPos; [MenuItem("Tools/UI 调试工具")] public static void ShowWindow() { GetWindow("UI 调试工具"); } void OnGUI() { EditorGUILayout.LabelField("UI 调试工具", EditorStyles.boldLabel); EditorGUILayout.Space(); uiName = EditorGUILayout.TextField("界面名字", uiName); destroyOnClose = EditorGUILayout.Toggle("关闭时销毁", destroyOnClose); EditorGUILayout.BeginHorizontal(); if (GUILayout.Button("打开 UI")) { if (Application.isPlaying && !string.IsNullOrEmpty(uiName)) { UIManager.Instance.OpenWindow(uiName); } else { Debug.LogWarning("请在运行时操作,并输入界面名字。"); } } if (GUILayout.Button("关闭 UI")) { if (Application.isPlaying && !string.IsNullOrEmpty(uiName)) { UIManager.Instance.CloseWindow(uiName, destroyOnClose); } else { Debug.LogWarning("请在运行时操作,并输入界面名字。"); } } EditorGUILayout.EndHorizontal(); EditorGUILayout.Space(); EditorGUILayout.LabelField("当前已打开的界面:", EditorStyles.boldLabel); if (Application.isPlaying) { scrollPos = EditorGUILayout.BeginScrollView(scrollPos, GUILayout.Height(200)); var dict = GetOpenUIDict(); if (dict.Count == 0) { EditorGUILayout.LabelField("无已打开的界面"); } else { foreach (var kv in dict) { EditorGUILayout.BeginHorizontal(); // 名字做成按钮 if (GUILayout.Button($"{kv.Key} (数量: {kv.Value})", GUILayout.Width(200))) { // 通过反射获取UI GameObject var mgr = UIManager.Instance; var field = typeof(UIManager).GetField("uiDict", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance); if (field != null) { var uiDict = field.GetValue(mgr) as Dictionary>; if (uiDict != null && uiDict.TryGetValue(kv.Key, out var list) && list != null && list.Count > 0) { var ui = list[0]; if (ui != null && ui.gameObject != null) { Selection.activeObject = ui.gameObject; EditorGUIUtility.PingObject(ui.gameObject); } } } } EditorGUILayout.EndHorizontal(); } } EditorGUILayout.EndScrollView(); } else { EditorGUILayout.HelpBox("请在运行时查看已打开的界面。", MessageType.Info); } } /// /// 获取当前已打开的UI名称及数量 /// private Dictionary GetOpenUIDict() { var result = new Dictionary(); var mgr = UIManager.Instance; var field = typeof(UIManager).GetField("uiDict", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance); if (field != null) { var dict = field.GetValue(mgr) as Dictionary>; if (dict != null) { foreach (var kv in dict) { if (kv.Value != null && kv.Value.Count > 0) result[kv.Key] = kv.Value.Count; } } } return result; } }