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;
|
}
|
}
|