This commit is contained in:
zhang hongbo 2026-04-06 10:03:28 +08:00
parent 2b360dff76
commit cf352f2a22
12 changed files with 1274 additions and 279 deletions

View File

@ -35,6 +35,10 @@ public class CreateTabButtonPrefab : EditorWindow
TextMeshProUGUI text = textObj.AddComponent<TextMeshProUGUI>();
text.text = "Tab";
text.fontSize = 32;
text.fontStyle = FontStyles.Bold;
text.enableAutoSizing = true;
text.fontSizeMin = 12;
text.fontSizeMax = 72;
text.alignment = TextAlignmentOptions.Center;
text.color = Color.white;
@ -80,6 +84,10 @@ public class CreateTabButtonPrefab : EditorWindow
TextMeshProUGUI text = textObj.AddComponent<TextMeshProUGUI>();
text.text = "Button";
text.fontSize = 24;
text.fontStyle = FontStyles.Bold;
text.enableAutoSizing = true;
text.fontSizeMin = 12;
text.fontSizeMax = 72;
text.alignment = TextAlignmentOptions.Center;
text.color = Color.white;
text.enableWordWrapping = true;

View File

@ -214,6 +214,10 @@ namespace MeowmentDebugTool.Editor
TextMeshProUGUI text = textObj.AddComponent<TextMeshProUGUI>();
text.text = "✕";
text.fontSize = 48;
text.fontStyle = FontStyles.Bold;
text.enableAutoSizing = true;
text.fontSizeMin = 12;
text.fontSizeMax = 72;
text.alignment = TextAlignmentOptions.Center;
text.color = Color.white;
@ -260,6 +264,9 @@ namespace MeowmentDebugTool.Editor
text.alignment = TextAlignmentOptions.Center;
text.color = Color.white;
text.fontStyle = FontStyles.Bold;
text.enableAutoSizing = true;
text.fontSizeMin = 12;
text.fontSizeMax = 72;
// 默认隐藏
floatBtn.SetActive(false);
@ -690,6 +697,10 @@ namespace MeowmentDebugTool.Editor
TextMeshProUGUI text = textObj.AddComponent<TextMeshProUGUI>();
text.text = "Tab";
text.fontSize = 32;
text.fontStyle = FontStyles.Bold;
text.enableAutoSizing = true;
text.fontSizeMin = 12;
text.fontSizeMax = 72;
text.alignment = TextAlignmentOptions.Center;
text.color = Color.white;
@ -722,6 +733,10 @@ namespace MeowmentDebugTool.Editor
TextMeshProUGUI text = textObj.AddComponent<TextMeshProUGUI>();
text.text = "Button";
text.fontSize = 24;
text.fontStyle = FontStyles.Bold;
text.enableAutoSizing = true;
text.fontSizeMin = 12;
text.fontSizeMax = 72;
text.alignment = TextAlignmentOptions.Center;
text.color = Color.white;
text.enableWordWrapping = true;
@ -813,6 +828,10 @@ namespace MeowmentDebugTool.Editor
TextMeshProUGUI text = obj.AddComponent<TextMeshProUGUI>();
text.fontSize = 28;
text.fontStyle = FontStyles.Bold;
text.enableAutoSizing = true;
text.fontSizeMin = 12;
text.fontSizeMax = 72;
text.color = Color.white;
text.enableWordWrapping = true;
@ -844,6 +863,10 @@ namespace MeowmentDebugTool.Editor
TextMeshProUGUI text = textObj.AddComponent<TextMeshProUGUI>();
text.text = label;
text.fontSize = 32;
text.fontStyle = FontStyles.Bold;
text.enableAutoSizing = true;
text.fontSizeMin = 12;
text.fontSizeMax = 72;
text.alignment = TextAlignmentOptions.Center;
text.color = Color.white;
@ -900,6 +923,7 @@ namespace MeowmentDebugTool.Editor
TextMeshProUGUI text = textObj.AddComponent<TextMeshProUGUI>();
text.text = "";
text.fontSize = 28;
text.fontStyle = FontStyles.Bold;
text.color = Color.white;
inputField.textViewport = textAreaRt;

View File

@ -31,6 +31,10 @@ namespace MeowmentDebugTool
// 文字筛选
private TMP_InputField textFilterInputField;
private string textFilter = "";
private TMP_Text infoFilterLabel;
private TMP_Text warningFilterLabel;
private TMP_Text errorFilterLabel;
private TMP_Text fatalFilterLabel;
// 日志项预制件
private GameObject logItemPrefab;
@ -77,6 +81,10 @@ namespace MeowmentDebugTool
private int lastRefreshFrame = -1;
private bool hasRegisteredLogCallback = false;
private bool uiInitialized = false;
private int lastDisplayedInfoCount = -1;
private int lastDisplayedWarningCount = -1;
private int lastDisplayedErrorCount = -1;
private int lastDisplayedFatalCount = -1;
#endregion
#region
@ -185,6 +193,7 @@ namespace MeowmentDebugTool
infoFilterToggle.onValueChanged.RemoveListener(OnInfoFilterChanged);
infoFilterToggle.isOn = infoFilter;
infoFilterToggle.onValueChanged.AddListener(OnInfoFilterChanged);
infoFilterLabel = infoFilterToggle.GetComponentInChildren<TMP_Text>(true);
}
if (warningFilterToggle != null)
@ -192,6 +201,7 @@ namespace MeowmentDebugTool
warningFilterToggle.onValueChanged.RemoveListener(OnWarningFilterChanged);
warningFilterToggle.isOn = warningFilter;
warningFilterToggle.onValueChanged.AddListener(OnWarningFilterChanged);
warningFilterLabel = warningFilterToggle.GetComponentInChildren<TMP_Text>(true);
}
if (errorFilterToggle != null)
@ -199,6 +209,7 @@ namespace MeowmentDebugTool
errorFilterToggle.onValueChanged.RemoveListener(OnErrorFilterChanged);
errorFilterToggle.isOn = errorFilter;
errorFilterToggle.onValueChanged.AddListener(OnErrorFilterChanged);
errorFilterLabel = errorFilterToggle.GetComponentInChildren<TMP_Text>(true);
}
if (fatalFilterToggle != null)
@ -206,6 +217,7 @@ namespace MeowmentDebugTool
fatalFilterToggle.onValueChanged.RemoveListener(OnFatalFilterChanged);
fatalFilterToggle.isOn = fatalFilter;
fatalFilterToggle.onValueChanged.AddListener(OnFatalFilterChanged);
fatalFilterLabel = fatalFilterToggle.GetComponentInChildren<TMP_Text>(true);
}
if (textFilterInputField != null)
@ -288,9 +300,6 @@ namespace MeowmentDebugTool
{
logScrollRect.verticalNormalizedPosition = 0f;
}
// 更新Toggle文本显示
UpdateFilterToggleText();
}
/// <summary>
@ -453,6 +462,8 @@ namespace MeowmentDebugTool
index++;
displayCount++;
}
UpdateFilterToggleText();
}
private bool ShouldShowLog(LogNode logNode)
@ -636,34 +647,27 @@ namespace MeowmentDebugTool
}
RefreshCount();
if (infoFilterToggle != null)
UpdateFilterLabel(infoFilterLabel, "Info", infoCount, ref lastDisplayedInfoCount);
UpdateFilterLabel(warningFilterLabel, "Warning", warningCount, ref lastDisplayedWarningCount);
UpdateFilterLabel(errorFilterLabel, "Error", errorCount, ref lastDisplayedErrorCount);
UpdateFilterLabel(fatalFilterLabel, "Fatal", fatalCount, ref lastDisplayedFatalCount);
}
private void UpdateFilterLabel(TMP_Text label, string prefix, int count, ref int lastDisplayedCount)
{
if (label == null)
{
var label = infoFilterToggle.GetComponentInChildren<TMP_Text>();
if (label != null)
label.text = $"Info ({infoCount})";
return;
}
if (warningFilterToggle != null)
if (lastDisplayedCount == count)
{
var label = warningFilterToggle.GetComponentInChildren<TMP_Text>();
if (label != null)
label.text = $"Warning ({warningCount})";
}
if (errorFilterToggle != null)
{
var label = errorFilterToggle.GetComponentInChildren<TMP_Text>();
if (label != null)
label.text = $"Error ({errorCount})";
}
if (fatalFilterToggle != null)
{
var label = fatalFilterToggle.GetComponentInChildren<TMP_Text>();
if (label != null)
label.text = $"Fatal ({fatalCount})";
return;
}
label.text = $"{prefix} ({count})";
lastDisplayedCount = count;
}
private void ClearAllLogs()
@ -673,6 +677,10 @@ namespace MeowmentDebugTool
errorLogNodes.Clear();
fatalLogNodes.Clear();
selectedNode = null;
lastDisplayedInfoCount = -1;
lastDisplayedWarningCount = -1;
lastDisplayedErrorCount = -1;
lastDisplayedFatalCount = -1;
if (detailText != null)
detailText.text = "点击日志查看详细信息...";

View File

@ -15,14 +15,14 @@ namespace MeowmentDebugTool
public class CustomButtonsModule : IDebugModule
{
#region
private const float SubTabCellWidth = 170f;
private const float SubTabCellHeight = 56f;
private const float SubTabCellWidth = 200f;
private const float SubTabCellHeight = 70f;
private const float SubTabSpacingX = 8f;
private const float SubTabSpacingY = 8f;
private const int SubTabPaddingHorizontal = 20;
private const int SubTabPaddingVertical = 20;
private const float ButtonMinWidth = 260f;
private const float ButtonMaxWidth = 10000f;
private const float ButtonMaxWidth = 800f;
private const float ButtonHeight = 90f;
private const float ButtonSpacing = 10f;
private const int ButtonsPerFrame = 12;
@ -625,6 +625,10 @@ namespace MeowmentDebugTool
TMP_Text text = emptyText.AddComponent<TextMeshProUGUI>();
text.text = "未找到任何 DebugButton";
text.fontSize = 28;
text.fontStyle = FontStyles.Bold;
text.enableAutoSizing = true;
text.fontSizeMin = 12;
text.fontSizeMax = 72;
text.alignment = TextAlignmentOptions.Center;
text.color = new Color(1f, 1f, 1f, 0.8f);
@ -948,6 +952,10 @@ namespace MeowmentDebugTool
TMP_Text text = textObj.AddComponent<TextMeshProUGUI>();
text.text = tabName;
text.fontSize = 26;
text.fontStyle = FontStyles.Bold;
text.enableAutoSizing = true;
text.fontSizeMin = 12;
text.fontSizeMax = 72;
text.alignment = TextAlignmentOptions.Center;
text.color = Color.white;
@ -1265,8 +1273,8 @@ namespace MeowmentDebugTool
if (buttonText != null)
{
buttonText.text = buttonInfo.DisplayName;
buttonText.enableWordWrapping = false;
buttonText.overflowMode = TextOverflowModes.Overflow;
buttonText.enableWordWrapping = true;
buttonText.overflowMode = TextOverflowModes.Truncate;
// 应用保存的字体
if (savedFontAsset != null)
@ -1437,9 +1445,9 @@ namespace MeowmentDebugTool
horizontalLayout.spacing = ButtonSpacing;
horizontalLayout.padding = new RectOffset(0, 0, 0, 0);
horizontalLayout.childAlignment = TextAnchor.UpperLeft;
horizontalLayout.childControlWidth = false;
horizontalLayout.childControlWidth = true;
horizontalLayout.childControlHeight = true;
horizontalLayout.childForceExpandWidth = false;
horizontalLayout.childForceExpandWidth = true;
horizontalLayout.childForceExpandHeight = false;
ContentSizeFitter sizeFitter = rowObj.AddComponent<ContentSizeFitter>();

View File

@ -14,8 +14,8 @@ namespace MeowmentDebugTool
public class CustomCheckBoxesModule : IDebugModule
{
#region
private const float SubTabCellWidth = 170f;
private const float SubTabCellHeight = 56f;
private const float SubTabCellWidth = 200f;
private const float SubTabCellHeight = 70f;
private const float SubTabSpacingX = 8f;
private const float SubTabSpacingY = 8f;
private const int SubTabPaddingHorizontal = 20;
@ -270,6 +270,10 @@ namespace MeowmentDebugTool
TMP_Text text = emptyText.AddComponent<TextMeshProUGUI>();
text.text = "未找到任何 DebugCheckBox";
text.fontSize = 28;
text.fontStyle = FontStyles.Bold;
text.enableAutoSizing = true;
text.fontSizeMin = 12;
text.fontSizeMax = 72;
text.alignment = TextAlignmentOptions.Center;
text.color = new Color(1f, 1f, 1f, 0.8f);
@ -445,6 +449,10 @@ namespace MeowmentDebugTool
TMP_Text text = textObj.AddComponent<TextMeshProUGUI>();
text.text = tabName;
text.fontSize = 26;
text.fontStyle = FontStyles.Bold;
text.enableAutoSizing = true;
text.fontSizeMin = 12;
text.fontSizeMax = 72;
text.alignment = TextAlignmentOptions.Center;
text.color = Color.white;

View File

@ -14,8 +14,8 @@ namespace MeowmentDebugTool
public class CustomValuesModule : IDebugModule
{
#region
private const float SubTabCellWidth = 170f;
private const float SubTabCellHeight = 56f;
private const float SubTabCellWidth = 200f;
private const float SubTabCellHeight = 70f;
private const float SubTabSpacingX = 8f;
private const float SubTabSpacingY = 8f;
private const int SubTabPaddingHorizontal = 20;
@ -423,6 +423,10 @@ namespace MeowmentDebugTool
TMP_Text text = emptyText.AddComponent<TextMeshProUGUI>();
text.text = "未找到任何 DebugValue";
text.fontSize = 28;
text.fontStyle = FontStyles.Bold;
text.enableAutoSizing = true;
text.fontSizeMin = 12;
text.fontSizeMax = 72;
text.alignment = TextAlignmentOptions.Center;
text.color = new Color(1f, 1f, 1f, 0.8f);
@ -599,6 +603,10 @@ namespace MeowmentDebugTool
TMP_Text text = textObj.AddComponent<TextMeshProUGUI>();
text.text = tabName;
text.fontSize = 26;
text.fontStyle = FontStyles.Bold;
text.enableAutoSizing = true;
text.fontSizeMin = 12;
text.fontSizeMax = 72;
text.alignment = TextAlignmentOptions.Center;
text.color = Color.white;

View File

@ -1,6 +1,7 @@
using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.UI;
using TMPro;
namespace MeowmentDebugTool
{
@ -38,6 +39,13 @@ namespace MeowmentDebugTool
private bool hasDragged = false; // 标记本次操作是否进行了拖动
private Vector2 dragStartPosition; // 拖动起始位置
private const float dragThreshold = 5f; // 拖动阈值,移动超过这个距离才算拖动
private const float FpsRefreshInterval = 0.25f;
private TMP_Text titleText;
private TMP_Text fpsText;
private TMP_Text fallbackText;
private float smoothedUnscaledDeltaTime = 1f / 60f;
private float nextFpsRefreshTime = 0f;
private void Awake()
{
@ -50,6 +58,12 @@ namespace MeowmentDebugTool
}
targetPosition = rectTransform.anchoredPosition;
titleText = transform.Find("ContentCanvas/TitleText")?.GetComponent<TMP_Text>()
?? transform.Find("TitleText")?.GetComponent<TMP_Text>();
fpsText = transform.Find("ContentCanvas/FpsText")?.GetComponent<TMP_Text>()
?? transform.Find("FpsText")?.GetComponent<TMP_Text>();
fallbackText = transform.Find("Text")?.GetComponent<TMP_Text>();
UpdateFpsDisplay(true);
}
private void Update()
@ -69,6 +83,39 @@ namespace MeowmentDebugTool
isSnapping = false;
}
}
smoothedUnscaledDeltaTime = Mathf.Lerp(smoothedUnscaledDeltaTime, Time.unscaledDeltaTime, 0.12f);
if (Time.unscaledTime >= nextFpsRefreshTime)
{
nextFpsRefreshTime = Time.unscaledTime + FpsRefreshInterval;
UpdateFpsDisplay(false);
}
}
private void UpdateFpsDisplay(bool force)
{
if (!force && !gameObject.activeInHierarchy)
{
return;
}
int fps = Mathf.Clamp(Mathf.RoundToInt(1f / Mathf.Max(0.0001f, smoothedUnscaledDeltaTime)), 0, 999);
if (titleText != null)
{
titleText.text = "调试";
}
if (fpsText != null)
{
fpsText.text = $"{fps} FPS";
return;
}
if (fallbackText != null)
{
fallbackText.text = $"调试\n{fps} FPS";
}
}
/// <summary>
@ -77,7 +124,6 @@ namespace MeowmentDebugTool
public void OnPointerDown(PointerEventData eventData)
{
hasDragged = false; // 重置拖动标记
Debug.Log("[DraggableFloatingButton] OnPointerDown - 重置拖动标记");
}
public void OnBeginDrag(PointerEventData eventData)
@ -165,17 +211,13 @@ namespace MeowmentDebugTool
/// </summary>
public void OnPointerClick(PointerEventData eventData)
{
Debug.Log($"[DraggableFloatingButton] OnPointerClick 被触发hasDragged={hasDragged}");
// 如果进行了拖动,不执行点击操作
if (hasDragged)
{
Debug.Log("[!] 检测到拖动,不打开窗口");
return;
}
// 纯点击操作,打开调试窗口
Debug.Log("[OK] 点击浮窗,打开调试窗口");
UniversalDebugTool debugTool = FindObjectOfType<UniversalDebugTool>();
if (debugTool != null)
{

View File

@ -49,7 +49,7 @@ namespace MeowmentDebugTool
GameObject tabContainer = mainWindow.transform.Find("TabButtonContainer").gameObject;
GameObject contentContainer = mainWindow.transform.Find("ContentContainer").gameObject;
GameObject parametersPage = null;
GameObject parametersPage = CreateParametersPage(contentContainer.transform);
GameObject customButtonsPage = CreateCustomButtonsPage(contentContainer.transform);
GameObject customCheckBoxesPage = CreateCustomCheckBoxesPage(contentContainer.transform);
GameObject customValuesPage = CreateCustomValuesPage(contentContainer.transform);
@ -133,29 +133,78 @@ namespace MeowmentDebugTool
rect.anchorMin = new Vector2(0, 1);
rect.anchorMax = new Vector2(0, 1);
rect.pivot = new Vector2(0, 1);
rect.sizeDelta = new Vector2(90, 90);
rect.sizeDelta = new Vector2(132, 96);
// 距离左上角边缘10像素
rect.anchoredPosition = new Vector2(10, -10);
rect.anchoredPosition = new Vector2(16, -16);
Image img = floatBtn.AddComponent<Image>();
img.color = new Color(0.2f, 0.6f, 1f, 0.8f);
img.color = new Color(0.2f, 0.22f, 0.25f, 0.94f);
img.raycastTarget = true; // 确保可以接收点击事件
Outline outline = floatBtn.AddComponent<Outline>();
outline.effectColor = new Color(1f, 1f, 1f, 0.08f);
outline.effectDistance = new Vector2(1f, -1f);
// 不再添加Button组件点击事件由DraggableFloatingButton的OnPointerClick处理
// 添加文本
GameObject textObj = new GameObject("Text");
textObj.transform.SetParent(floatBtn.transform, false);
RectTransform textRect = textObj.AddComponent<RectTransform>();
textRect.anchorMin = Vector2.zero;
textRect.anchorMax = Vector2.one;
textRect.sizeDelta = Vector2.zero;
TextMeshProUGUI text = textObj.AddComponent<TextMeshProUGUI>();
text.text = "调试";
text.fontSize = 28;
text.alignment = TextAlignmentOptions.Center;
text.color = Color.white;
TMP_FontAsset defaultFont = GetDefaultFont();
GameObject contentCanvasObj = new GameObject("ContentCanvas");
contentCanvasObj.transform.SetParent(floatBtn.transform, false);
RectTransform contentCanvasRect = contentCanvasObj.AddComponent<RectTransform>();
contentCanvasRect.anchorMin = Vector2.zero;
contentCanvasRect.anchorMax = Vector2.one;
contentCanvasRect.offsetMin = Vector2.zero;
contentCanvasRect.offsetMax = Vector2.zero;
Canvas contentCanvas = contentCanvasObj.AddComponent<Canvas>();
contentCanvas.overrideSorting = false;
GameObject titleObj = new GameObject("TitleText");
titleObj.transform.SetParent(contentCanvasObj.transform, false);
RectTransform titleRect = titleObj.AddComponent<RectTransform>();
titleRect.anchorMin = new Vector2(0f, 0.52f);
titleRect.anchorMax = new Vector2(1f, 1f);
titleRect.offsetMin = new Vector2(10f, -4f);
titleRect.offsetMax = new Vector2(-10f, -6f);
TextMeshProUGUI titleText = titleObj.AddComponent<TextMeshProUGUI>();
titleText.text = "调试";
titleText.fontSize = 22;
titleText.fontStyle = FontStyles.Bold;
titleText.enableAutoSizing = true;
titleText.fontSizeMin = 12;
titleText.fontSizeMax = 36;
titleText.alignment = TextAlignmentOptions.Center;
titleText.color = new Color(1f, 1f, 1f, 0.92f);
titleText.raycastTarget = false;
if (defaultFont != null)
{
titleText.font = defaultFont;
}
GameObject fpsObj = new GameObject("FpsText");
fpsObj.transform.SetParent(contentCanvasObj.transform, false);
RectTransform fpsRect = fpsObj.AddComponent<RectTransform>();
fpsRect.anchorMin = new Vector2(0f, 0f);
fpsRect.anchorMax = new Vector2(1f, 0.58f);
fpsRect.offsetMin = new Vector2(8f, 8f);
fpsRect.offsetMax = new Vector2(-8f, -2f);
TextMeshProUGUI fpsText = fpsObj.AddComponent<TextMeshProUGUI>();
fpsText.text = "-- FPS";
fpsText.fontSize = 26;
fpsText.fontStyle = FontStyles.Bold;
fpsText.enableAutoSizing = true;
fpsText.fontSizeMin = 12;
fpsText.fontSizeMax = 40;
fpsText.alignment = TextAlignmentOptions.Center;
fpsText.color = new Color(0.92f, 0.94f, 0.96f, 0.96f);
fpsText.raycastTarget = false;
if (defaultFont != null)
{
fpsText.font = defaultFont;
}
// 添加拖拽组件(包含点击处理)
DraggableFloatingButton draggable = floatBtn.AddComponent<DraggableFloatingButton>();
@ -167,53 +216,15 @@ namespace MeowmentDebugTool
private static GameObject CreateParametersPage(Transform parent)
{
// ParametersModule 现在内部自行构建所有子标签页UI
// 这里只创建一个空的根容器
GameObject page = new GameObject("ParametersPage");
page.transform.SetParent(parent, false);
RectTransform rect = page.AddComponent<RectTransform>();
rect.anchorMin = Vector2.zero;
rect.anchorMax = Vector2.one;
rect.sizeDelta = Vector2.zero;
ScrollRect scroll = page.AddComponent<ScrollRect>();
scroll.horizontal = false;
scroll.vertical = true;
GameObject viewport = new GameObject("Viewport");
viewport.transform.SetParent(page.transform, false);
RectTransform vpRect = viewport.AddComponent<RectTransform>();
vpRect.anchorMin = Vector2.zero;
vpRect.anchorMax = Vector2.one;
vpRect.sizeDelta = Vector2.zero;
viewport.AddComponent<Image>().color = new Color(0, 0, 0, 0.1f);
viewport.AddComponent<Mask>().showMaskGraphic = false;
GameObject content = new GameObject("Content");
content.transform.SetParent(viewport.transform, false);
RectTransform contentRect = content.AddComponent<RectTransform>();
contentRect.anchorMin = new Vector2(0, 1);
contentRect.anchorMax = new Vector2(1, 1);
contentRect.pivot = new Vector2(0.5f, 1);
contentRect.sizeDelta = new Vector2(0, 2000);
VerticalLayoutGroup layout = content.AddComponent<VerticalLayoutGroup>();
layout.childControlWidth = true;
layout.childControlHeight = true;
layout.childForceExpandWidth = true;
layout.childForceExpandHeight = false;
layout.spacing = 20;
layout.padding = new RectOffset(20, 20, 20, 20);
ContentSizeFitter fitter = content.AddComponent<ContentSizeFitter>();
fitter.verticalFit = ContentSizeFitter.FitMode.PreferredSize;
scroll.viewport = vpRect;
scroll.content = contentRect;
// 设备信息文本
GameObject deviceInfo = CreateTextObject("DeviceInfo", content.transform, "设备信息");
// 系统信息文本
GameObject systemInfo = CreateTextObject("SystemInfo", content.transform, "系统信息");
return page;
}
@ -437,7 +448,7 @@ namespace MeowmentDebugTool
rect.anchorMax = Vector2.one;
rect.sizeDelta = Vector2.zero;
// Console Log缓存池设置面板
// 日志缓存设置面板
GameObject bufferPanel = new GameObject("BufferPanel");
bufferPanel.transform.SetParent(page.transform, false);
RectTransform bufferPanelRect = bufferPanel.AddComponent<RectTransform>();
@ -454,7 +465,7 @@ namespace MeowmentDebugTool
bufferVLayout.childForceExpandWidth = true;
// 标题
GameObject bufferTitle = CreateTextObject("BufferTitle", bufferPanel.transform, "Console Log缓存池设置");
GameObject bufferTitle = CreateTextObject("BufferTitle", bufferPanel.transform, "日志缓存设置");
bufferTitle.GetComponent<TextMeshProUGUI>().fontSize = 36;
bufferTitle.GetComponent<TextMeshProUGUI>().alignment = TextAlignmentOptions.Center;
bufferTitle.GetComponent<RectTransform>().sizeDelta = new Vector2(0, 60);
@ -552,8 +563,8 @@ namespace MeowmentDebugTool
bufferBtnLayout.childForceExpandWidth = true;
bufferBtnLayout.childForceExpandHeight = true;
GameObject applyBufferBtn = CreateButton("ApplyBufferButton", bufferBtnContainer.transform, "应用");
GameObject resetBufferBtn = CreateButton("ResetBufferButton", bufferBtnContainer.transform, "重置");
GameObject applyBufferBtn = CreateButton("ApplyBufferButton", bufferBtnContainer.transform, "应用缓存");
GameObject resetBufferBtn = CreateButton("ResetBufferButton", bufferBtnContainer.transform, "恢复默认");
return page;
}
@ -781,7 +792,8 @@ namespace MeowmentDebugTool
// 详情文本
GameObject detailText = CreateTextObject("ConsoleDetailText", detailContent.transform, "点击日志查看详细信息...");
TextMeshProUGUI detailTMP = detailText.GetComponent<TextMeshProUGUI>();
detailTMP.fontSize = 24;
detailTMP.fontSize = 28;
detailTMP.enableAutoSizing = false;
detailTMP.alignment = TextAlignmentOptions.TopLeft;
detailTMP.enableWordWrapping = true;
detailTMP.overflowMode = TextOverflowModes.Overflow;
@ -971,8 +983,11 @@ namespace MeowmentDebugTool
TextMeshProUGUI tmp = textObj.AddComponent<TextMeshProUGUI>();
tmp.text = text;
tmp.fontSize = 32;
tmp.enableAutoSizing = false;
tmp.enableWordWrapping = false;
tmp.fontStyle = FontStyles.Bold;
tmp.enableAutoSizing = true;
tmp.fontSizeMin = 12;
tmp.fontSizeMax = 72;
tmp.enableWordWrapping = true;
tmp.alignment = TextAlignmentOptions.Center;
tmp.color = Color.white;
@ -996,6 +1011,10 @@ namespace MeowmentDebugTool
TextMeshProUGUI tmp = textObj.AddComponent<TextMeshProUGUI>();
tmp.text = text;
tmp.fontSize = 28;
tmp.fontStyle = FontStyles.Bold;
tmp.enableAutoSizing = true;
tmp.fontSizeMin = 12;
tmp.fontSizeMax = 72;
tmp.alignment = TextAlignmentOptions.TopLeft;
tmp.color = Color.white;
@ -1008,6 +1027,57 @@ namespace MeowmentDebugTool
return textObj;
}
private static GameObject CreateInfoCard(Transform parent, string cardName, string title, string bodyName, string initialText)
{
GameObject card = new GameObject(cardName);
card.transform.SetParent(parent, false);
RectTransform cardRect = card.AddComponent<RectTransform>();
cardRect.sizeDelta = new Vector2(0f, 0f);
Image cardBg = card.AddComponent<Image>();
cardBg.color = new Color(0.12f, 0.14f, 0.17f, 0.9f);
VerticalLayoutGroup cardLayout = card.AddComponent<VerticalLayoutGroup>();
cardLayout.spacing = 16;
cardLayout.padding = new RectOffset(24, 24, 24, 24);
cardLayout.childControlWidth = true;
cardLayout.childControlHeight = true;
cardLayout.childForceExpandWidth = true;
cardLayout.childForceExpandHeight = false;
ContentSizeFitter cardFitter = card.AddComponent<ContentSizeFitter>();
cardFitter.verticalFit = ContentSizeFitter.FitMode.PreferredSize;
LayoutElement cardElement = card.AddComponent<LayoutElement>();
cardElement.flexibleWidth = 1f;
GameObject titleObj = CreateTextObject("Title", card.transform, title);
TextMeshProUGUI titleText = titleObj.GetComponent<TextMeshProUGUI>();
titleText.fontSize = 34;
titleText.fontStyle = FontStyles.Bold;
titleText.color = new Color(0.95f, 0.97f, 0.99f, 0.96f);
titleText.alignment = TextAlignmentOptions.Left;
LayoutElement titleElement = titleObj.AddComponent<LayoutElement>();
titleElement.preferredHeight = 48f;
GameObject bodyObj = CreateTextObject(bodyName, card.transform, initialText);
TextMeshProUGUI bodyText = bodyObj.GetComponent<TextMeshProUGUI>();
bodyText.fontSize = 28;
bodyText.enableAutoSizing = false;
bodyText.color = new Color(0.88f, 0.9f, 0.92f, 0.96f);
bodyText.enableWordWrapping = true;
bodyText.alignment = TextAlignmentOptions.TopLeft;
ContentSizeFitter bodyFitter = bodyObj.AddComponent<ContentSizeFitter>();
bodyFitter.verticalFit = ContentSizeFitter.FitMode.PreferredSize;
LayoutElement bodyElement = bodyObj.AddComponent<LayoutElement>();
bodyElement.flexibleWidth = 1f;
return card;
}
private static GameObject CreateToggle(string name, Transform parent, string labelText)
{
@ -1063,6 +1133,10 @@ namespace MeowmentDebugTool
TextMeshProUGUI labelTmp = label.AddComponent<TextMeshProUGUI>();
labelTmp.text = labelText;
labelTmp.fontSize = 24;
labelTmp.fontStyle = FontStyles.Bold;
labelTmp.enableAutoSizing = true;
labelTmp.fontSizeMin = 12;
labelTmp.fontSizeMax = 72;
labelTmp.alignment = TextAlignmentOptions.MidlineLeft;
labelTmp.color = Color.white;
@ -1122,11 +1196,15 @@ namespace MeowmentDebugTool
TextMeshProUGUI labelTmp = label.AddComponent<TextMeshProUGUI>();
labelTmp.fontSize = 28;
labelTmp.fontStyle = FontStyles.Bold;
labelTmp.enableAutoSizing = true;
labelTmp.fontSizeMin = 12;
labelTmp.fontSizeMax = 72;
labelTmp.alignment = TextAlignmentOptions.MidlineLeft;
labelTmp.color = Color.white;
labelTmp.overflowMode = TextOverflowModes.Truncate;
labelTmp.richText = true;
labelTmp.enableWordWrapping = false;
labelTmp.enableWordWrapping = true;
// 设置默认字体
TMP_FontAsset defaultFont = GetDefaultFont();
@ -1184,6 +1262,7 @@ namespace MeowmentDebugTool
TextMeshProUGUI text = textObj.AddComponent<TextMeshProUGUI>();
text.fontSize = 32;
text.fontStyle = FontStyles.Bold;
text.color = Color.white;
// 设置默认字体
@ -1371,6 +1450,10 @@ namespace MeowmentDebugTool
TextMeshProUGUI labelText = label.AddComponent<TextMeshProUGUI>();
labelText.text = "复选框";
labelText.fontSize = 32;
labelText.fontStyle = FontStyles.Bold;
labelText.enableAutoSizing = true;
labelText.fontSizeMin = 12;
labelText.fontSizeMax = 72;
labelText.alignment = TextAlignmentOptions.Left;
labelText.color = Color.white;
@ -1423,6 +1506,10 @@ namespace MeowmentDebugTool
TextMeshProUGUI labelText = label.AddComponent<TextMeshProUGUI>();
labelText.text = "数值名称";
labelText.fontSize = 28;
labelText.fontStyle = FontStyles.Bold;
labelText.enableAutoSizing = true;
labelText.fontSizeMin = 12;
labelText.fontSizeMax = 72;
labelText.alignment = TextAlignmentOptions.Left;
labelText.color = Color.white;
@ -1514,6 +1601,7 @@ namespace MeowmentDebugTool
TextMeshProUGUI inputTextComponent = inputTextObj.AddComponent<TextMeshProUGUI>();
inputTextComponent.fontSize = 28;
inputTextComponent.fontStyle = FontStyles.Bold;
inputTextComponent.alignment = TextAlignmentOptions.Center;
inputTextComponent.color = Color.white;
@ -1546,6 +1634,10 @@ namespace MeowmentDebugTool
TextMeshProUGUI confirmText = confirmBtnText.AddComponent<TextMeshProUGUI>();
confirmText.text = "确认";
confirmText.fontSize = 28;
confirmText.fontStyle = FontStyles.Bold;
confirmText.enableAutoSizing = true;
confirmText.fontSizeMin = 12;
confirmText.fontSizeMax = 72;
confirmText.alignment = TextAlignmentOptions.Center;
confirmText.color = Color.white;
@ -1591,14 +1683,8 @@ namespace MeowmentDebugTool
type.GetField("floatingButton", flags)?.SetValue(tool, floatingButton);
type.GetField("draggableComponent", flags)?.SetValue(tool, floatingButton.GetComponent<DraggableFloatingButton>());
// 参数查看页面已移除UI仅保留字段兼容
// 参数查看页面 - ParametersModule 内部自行构建子标签页UI
type.GetField("parametersPage", flags)?.SetValue(tool, parametersPage);
if (parametersPage != null)
{
type.GetField("deviceInfoText", flags)?.SetValue(tool, parametersPage.transform.Find("Viewport/Content/DeviceInfo").GetComponent<TextMeshProUGUI>());
type.GetField("systemInfoText", flags)?.SetValue(tool, parametersPage.transform.Find("Viewport/Content/SystemInfo").GetComponent<TextMeshProUGUI>());
type.GetField("parametersScrollRect", flags)?.SetValue(tool, parametersPage.GetComponent<ScrollRect>());
}
// 自定义按钮页面
type.GetField("customButtonsPage", flags)?.SetValue(tool, customButtonsPage);

View File

@ -5,12 +5,10 @@ using TMPro;
namespace MeowmentDebugTool
{
/// <summary>
/// 设置模块 - 提供自动窗口尺寸适配与缓存池设置功能
/// 设置模块 - 提供窗口全屏布局与缓存池设置功能
/// </summary>
public class SettingsModule : IDebugModule
{
private static readonly Vector2 DefaultReferenceResolution = new Vector2(1080f, 2340f);
#region
private GameObject settingsPage;
private TMP_InputField widthInputField;
@ -30,9 +28,7 @@ namespace MeowmentDebugTool
// 主窗口引用
private RectTransform mainWindow;
private Canvas canvas;
private Vector2 currentCustomResolution;
private Vector2 detectedScreenResolution;
// 默认缓存池大小
@ -45,7 +41,7 @@ namespace MeowmentDebugTool
TMP_InputField infoBufferInput, TMP_InputField warningBufferInput,
TMP_InputField errorBufferInput, TMP_InputField fatalBufferInput,
Button applyBufferBtn, Button resetBufferBtn,
RectTransform mainWin, Canvas canvasRef)
RectTransform mainWin)
{
settingsPage = page;
widthInputField = widthInput;
@ -62,9 +58,6 @@ namespace MeowmentDebugTool
resetBufferButton = resetBufferBtn;
mainWindow = mainWin;
canvas = canvasRef;
currentCustomResolution = Vector2.zero;
}
#endregion
@ -73,8 +66,14 @@ namespace MeowmentDebugTool
{
Debug.Log("[SettingsModule] 初始化设置模块...");
if (widthInputField != null)
widthInputField.readOnly = true;
if (heightInputField != null)
heightInputField.readOnly = true;
if (applyResolutionButton != null)
applyResolutionButton.onClick.AddListener(ApplyCustomResolutionFromInput);
applyResolutionButton.interactable = false;
if (resetResolutionButton != null)
resetResolutionButton.onClick.AddListener(RefreshAutoResolution);
@ -85,7 +84,7 @@ namespace MeowmentDebugTool
if (resetBufferButton != null)
resetBufferButton.onClick.AddListener(ResetBufferSize);
// 自动识别并应用当前屏幕分辨率
// 自动识别并应用当前屏幕全屏布局
RefreshAutoResolution();
// 设置默认缓存池大小
@ -108,11 +107,10 @@ namespace MeowmentDebugTool
public void RefreshAutoResolution()
{
detectedScreenResolution = new Vector2(Screen.width, Screen.height);
currentCustomResolution = DefaultReferenceResolution;
UpdateResolutionInputs(currentCustomResolution);
ApplyResolution(currentCustomResolution);
UpdateResolutionInputs(detectedScreenResolution);
ApplyResolution();
Debug.Log($"[SettingsModule] 已自动识别当前屏幕分辨率: {detectedScreenResolution.x} x {detectedScreenResolution.y}UI基准分辨率: {currentCustomResolution.x} x {currentCustomResolution.y}");
Debug.Log($"[SettingsModule] 已刷新设备分辨率: {detectedScreenResolution.x} x {detectedScreenResolution.y}调试窗口使用全屏拉伸布局不处理SafeArea");
}
/// <summary>
@ -139,58 +137,19 @@ namespace MeowmentDebugTool
#endregion
#region
private void ApplyResolution(Vector2 resolution)
private void ApplyResolution()
{
CanvasScaler scaler = canvas != null ? canvas.GetComponent<CanvasScaler>() : null;
if (scaler != null)
{
scaler.uiScaleMode = CanvasScaler.ScaleMode.ScaleWithScreenSize;
scaler.screenMatchMode = CanvasScaler.ScreenMatchMode.MatchWidthOrHeight;
scaler.referenceResolution = resolution;
scaler.matchWidthOrHeight = 0.5f;
}
FitMainWindowToSafeArea();
FitMainWindowToFullScreen();
if (currentResolutionText != null)
{
currentResolutionText.text = $"设备: {detectedScreenResolution.x:0} x {detectedScreenResolution.y:0} / UI: {resolution.x:0} x {resolution.y:0}";
currentResolutionText.text = $"设备: {detectedScreenResolution.x:0} x {detectedScreenResolution.y:0} / 调试窗口: 全屏拉伸";
}
// 不需要强制刷新Canvas会导致rebuild loop
// Canvas会自动在下一帧更新
}
private void ApplyCustomResolutionFromInput()
{
if (!TryGetResolutionFromInput(out Vector2 resolution))
{
Debug.LogWarning("[SettingsModule] 分辨率输入无效,应用失败");
return;
}
currentCustomResolution = resolution;
ApplyResolution(resolution);
Debug.Log($"[SettingsModule] 已应用自定义适配分辨率: {resolution.x} x {resolution.y}");
}
private bool TryGetResolutionFromInput(out Vector2 resolution)
{
resolution = Vector2.zero;
if (widthInputField == null || heightInputField == null)
return false;
if (!float.TryParse(widthInputField.text, out float width) || width <= 0f)
return false;
if (!float.TryParse(heightInputField.text, out float height) || height <= 0f)
return false;
resolution = new Vector2(width, height);
return true;
}
private void UpdateResolutionInputs(Vector2 resolution)
{
if (widthInputField != null)
@ -200,7 +159,7 @@ namespace MeowmentDebugTool
heightInputField.text = Mathf.RoundToInt(resolution.y).ToString();
}
private void FitMainWindowToSafeArea()
private void FitMainWindowToFullScreen()
{
if (mainWindow == null)
return;
@ -210,24 +169,8 @@ namespace MeowmentDebugTool
mainWindow.pivot = new Vector2(0.5f, 0.5f);
mainWindow.anchoredPosition = Vector2.zero;
mainWindow.sizeDelta = Vector2.zero;
Rect safeArea = Screen.safeArea;
RectTransform canvasRect = canvas != null ? canvas.transform as RectTransform : null;
if (canvasRect == null || canvasRect.rect.width <= 0f || canvasRect.rect.height <= 0f || Screen.width <= 0 || Screen.height <= 0)
{
mainWindow.offsetMin = Vector2.zero;
mainWindow.offsetMax = Vector2.zero;
return;
}
float scaleX = canvasRect.rect.width / Screen.width;
float scaleY = canvasRect.rect.height / Screen.height;
mainWindow.offsetMin = new Vector2(safeArea.xMin * scaleX, safeArea.yMin * scaleY);
mainWindow.offsetMax = new Vector2(
-(Screen.width - safeArea.xMax) * scaleX,
-(Screen.height - safeArea.yMax) * scaleY);
mainWindow.offsetMin = Vector2.zero;
mainWindow.offsetMax = Vector2.zero;
}
private void ApplyBufferSize()

View File

@ -217,11 +217,17 @@ namespace MeowmentDebugTool
// DetectFourFingerTap();
// }
// 更新控制台模块
if (consoleModule != null)
// 仅在控制台页实际显示时更新控制台UI
if (consoleModule != null && currentPageKey == "控制台" && mainWindow != null && mainWindow.gameObject.activeInHierarchy)
{
consoleModule.Update();
}
// 参数页 Profiler 实时刷新
if (parametersModule != null && currentPageKey == "参数" && mainWindow != null && mainWindow.gameObject.activeInHierarchy)
{
parametersModule.Update();
}
}
private void OnDestroy()
@ -378,8 +384,13 @@ namespace MeowmentDebugTool
{
Debug.Log("[MeowmentDebugTool] 初始化UniversalDebugTool...");
// 参数页不在启动阶段初始化,按需延迟创建
// 参数页按需初始化,避免影响启动速度
parametersModule = null;
if (parametersPage != null)
{
RegisterPage("参数", parametersPage);
}
customButtonsModule = new CustomButtonsModule(
customButtonsPage, buttonContainer, buttonPrefab, buttonsScrollRect, CloseDebugWindow);
@ -396,7 +407,7 @@ namespace MeowmentDebugTool
infoBufferInputField, warningBufferInputField,
errorBufferInputField, fatalBufferInputField,
applyBufferButton, resetBufferButton,
mainWindow, canvas);
mainWindow);
consoleModule = new ConsoleModule(
consolePage, consoleLogScrollRect, consoleLogContent,
@ -539,7 +550,11 @@ namespace MeowmentDebugTool
pages[pageName].SetActive(true);
currentPageKey = pageName;
if (pageName == "按钮" && customButtonsModule != null)
if (pageName == "参数")
{
EnsureParametersModule()?.RefreshAllInfo();
}
else if (pageName == "按钮" && customButtonsModule != null)
{
customButtonsModule.EnsurePageViewInitialized();
}
@ -581,19 +596,18 @@ namespace MeowmentDebugTool
return parametersModule;
}
if (parametersPage == null || deviceInfoText == null || systemInfoText == null)
if (parametersPage == null)
{
return null;
}
parametersModule = new ParametersModule(
parametersPage, deviceInfoText, systemInfoText, parametersScrollRect);
parametersModule = new ParametersModule(parametersPage);
parametersModule.Initialize();
return parametersModule;
}
/// <summary>
/// 复制设备信息到剪贴板
/// 复制所有参数信息到剪贴板
/// </summary>
public void CopyDeviceInfoToClipboard()
{
@ -603,11 +617,11 @@ namespace MeowmentDebugTool
return;
}
EnsureParametersModule()?.CopyDeviceInfoToClipboard();
EnsureParametersModule()?.CopyAllInfoToClipboard();
}
/// <summary>
/// 复制系统信息到剪贴板
/// 复制所有参数信息到剪贴板
/// </summary>
public void CopySystemInfoToClipboard()
{
@ -617,7 +631,7 @@ namespace MeowmentDebugTool
return;
}
EnsureParametersModule()?.CopySystemInfoToClipboard();
EnsureParametersModule()?.CopyAllInfoToClipboard();
}
/// <summary>

View File

@ -1,7 +1,7 @@
{
"name": "com.bywaystudios.meowmentdebugtool",
"displayName": "MeowmentDebugTool",
"version": "0.4.2",
"version": "0.5.2",
"description": "\u8c03\u8bd5\u5de5\u5177\uff0c\u96c6\u6210\u4e86\u5ba2\u6237\u7aef\u6d4b\u8bd5\u65f6\u7684\u5e38\u7528\u529f\u80fd\uff0c\u652f\u6301\u6269\u5c55\u81ea\u5b9a\u4e49\u6309\u94ae\uff0c\u65b9\u4fbf\u5f00\u53d1\u8005\u8c03\u8bd5\u548c\u6d4b\u8bd5\u3002",
"samples": [
{