New file |
| | |
| | | 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<UIAdjustEditor>("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<string, List<UIBase>>; |
| | | 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); |
| | | } |
| | | } |
| | | |
| | | /// <summary> |
| | | /// 获取当前已打开的UI名称及数量 |
| | | /// </summary> |
| | | private Dictionary<string, int> GetOpenUIDict() |
| | | { |
| | | var result = new Dictionary<string, int>(); |
| | | 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<string, List<UIBase>>; |
| | | if (dict != null) |
| | | { |
| | | foreach (var kv in dict) |
| | | { |
| | | if (kv.Value != null && kv.Value.Count > 0) |
| | | result[kv.Key] = kv.Value.Count; |
| | | } |
| | | } |
| | | } |
| | | return result; |
| | | } |
| | | } |