MeowmentDebugTool/Packages/com.bywaystudios.meowmentdebugtool@0.1.4/README.md
张宏博 14f9f3f3f2 init
2025-12-18 10:17:46 +08:00

7.4 KiB
Raw Blame History

MeowMent Debug Tool通用调试工具

一个面向运行时的 Unity 调试工具,内置多标签页调试面板、可拖拽悬浮按钮、设备/系统信息查看,以及通过特性自动生成的“自定义调试按钮”。

核心脚本:

  • Runtime/UniversalDebugTool.cs
  • Runtime/DraggableFloatingButton.cs
  • Editor/DebugToolPrefabGenerator.cs
  • Editor/CreateTabButtonPrefab.cs

功能概览

  • 多标签页调试面板(默认分辨率 1080x2340
    • 参数:设备信息、系统信息,一键复制到剪贴板。
    • 自定义按钮:通过特性自动收集项目中的调试方法并生成按钮。
    • 工具栏:简单的“时间调整”示例入口,可按项目需要扩展。
    • 设置:运行时修改调试窗口尺寸、重置为默认分辨率。
  • 悬浮调试按钮:
    • 关闭主窗口后,会显示一个可拖拽、自动吸附边缘的浮动按钮。
    • 点击可再次打开调试主窗口,拖动不会误触打开(内部做了拖拽判定)。
  • 运行时公共 API
    • UniversalDebugTool.Show() / Hide() / Toggle() 控制显示。
    • UniversalDebugTool.ShowInputDialog(...) 弹出输入对话框。
    • UniversalDebugTool.Instance.ReloadCustomButtons() 重新扫描并生成自定义按钮。

安装

方式一:本地拷贝(推荐在开发环境使用)

  1. com.bywaystudios.meowmentdebugtool@0.1.4 整个文件夹放到你项目的 Packages/ 目录下。
  2. 打开 Unity等待重新导入即可在菜单中看到调试工具相关项。

方式二:通过自建 Git / 私有仓库

如果你已经把此包发布到自己的 Git 仓库或私有 Package Registry可参考 Unity 官方文档,通过修改 Packages/manifest.jsondependencies / scopedRegistries 来添加:

"dependencies": {
  "com.bywaystudios.meowmentdebugtool": "0.1.4"
}

具体部署方式视团队实际环境而定,这里不展开。


快速开始

1. 在场景中生成调试工具预制体

在 Unity 菜单中执行:

Tools → Debug Tool → 生成调试工具预制件

在弹窗中选择保存路径(默认:Assets/UniversalDebugTool.prefab),点击“生成预制件”。

生成后的预制体包含:

  • 一个独立的 CanvasUI 根节点,排序顺序很高,保证在最上层渲染)。
  • UniversalDebugTool 主组件和其所需的 UI 层级。
  • 主调试窗口(含标签页、参数页、自定义按钮页、工具栏页、设置页)。
  • 可拖拽的调试悬浮按钮。

2. 把预制体放入场景

  1. 在 Project 窗口中找到生成的 UniversalDebugTool 预制体。
  2. 将其拖入需要调试的场景(建议放到常驻/启动场景里)。
  3. 进入 Play 模式即可看到调试窗口。

默认行为:

  • 进入游戏即显示主调试窗口,并隐藏悬浮按钮。
  • 点击顶部左侧关闭按钮,会隐藏主窗口并显示悬浮按钮。
  • 拖动悬浮按钮改变位置;点击一次可重新打开主窗口。

自定义调试按钮

调试工具会在运行时通过反射扫描所有程序集,查找带有 DebugButtonAttribute 特性的方法,并在“自定义按钮”标签页中为其自动生成一个按钮。

编写一个自定义调试方法

要求:

  • 方法必须是 static
  • 当前实现假定为无参数方法。如果需要参数,可结合 ShowInputDialog 自行封装。

示例:

using UnityEngine;

public static class DemoDebugActions
{
    // 在“自定义按钮”页中会生成一个名为“打印金币数量”的按钮
    [DebugButton("打印金币数量", 0.3f, 0.6f, 1f)]
    private static void PrintCoinCount()
    {
        Debug.Log($"Coins: {PlayerData.Coin}");
    }

    // 不传 displayName 时,按钮文字默认使用方法名
    [DebugButton]
    private static void KillAllEnemies()
    {
        EnemyManager.KillAll();
    }
}

DebugButtonAttribute 构造函数签名:

public DebugButtonAttribute(string displayName = "", float r = 0.8f, float g = 0.8f, float b = 0.8f);
  • displayName:按钮显示文字(可为空,为空则使用方法名)。
  • r g b:按钮背景色的 RGB 分量0~1

写好方法后:

  1. 进入 Play 模式。
  2. 打开调试工具 → 切换到“自定义按钮”标签页。
  3. 即可看到刚才添加的调试按钮,点击执行对应逻辑。

如果你在运行时新增/修改了带有 DebugButtonAttribute 的方法(如通过热更等方式),可以调用:

UniversalDebugTool.Instance.ReloadCustomButtons();

来重新扫描并刷新按钮列表。


输入对话框(可选)

调试工具内置了一个简单的输入对话框,可与自定义按钮组合使用:

using TMPro;

public static class DemoInputDebug
{
    [DebugButton("设置玩家等级")]
    private static void SetPlayerLevel()
    {
        UniversalDebugTool.ShowInputDialog(
            "输入玩家等级",
            onConfirmAction: text =>
            {
                if (int.TryParse(text, out var level))
                {
                    PlayerData.Level = level;
                    Debug.Log($"设置玩家等级为: {level}");
                }
                else
                {
                    Debug.LogWarning($"无效等级: {text}");
                }
            },
            initialValue: "1",
            contentType: TMP_InputField.ContentType.IntegerNumber
        );
    }
}

调用后会弹出一个输入框,用户点击确认时会把输入字符串传回回调函数中。


公共 API 一览

以下方法均定义在 UniversalDebugTool 中:

  • static bool InstanceExists:当前场景中是否存在实例。
  • static UniversalDebugTool Instance:单例实例(通过 FindObjectOfType 查找)。
  • static void Show():显示调试工具 GameObject。
  • static void Hide():隐藏调试工具 GameObject。
  • static void Toggle():在“窗口显示”和“窗口关闭 + 显示悬浮按钮”之间切换。
  • void ReloadCustomButtons():重新扫描并生成自定义按钮。
  • static void ShowInputDialog(string title, Action<string> onConfirmAction, string initialValue = "", TMP_InputField.ContentType contentType = TMP_InputField.ContentType.Standard):显示输入对话框。
  • static void CloseInputDialog():关闭输入对话框并清理回调。
  • void CopyDeviceInfoToClipboard() / void CopySystemInfoToClipboard():复制对应信息到系统剪贴板。

你也可以在自己项目的 UI / 快捷键逻辑中调用这些方法,例如:

// 示例:按 F1 切换调试面板
void Update()
{
    if (Input.GetKeyDown(KeyCode.F1))
    {
        UniversalDebugTool.Toggle();
    }
}

注意事项

  • 依赖:
    • Unity 新 UIUnityEngine.UI)。
    • TextMesh ProTMPro)。
  • 默认 UI 参考分辨率为 1080×2340建议以手机竖屏调试为主。可在“设置”页中修改窗口大小以适配不同设备。
  • 工具栏中的“时间调整”逻辑仅是示例,需要你在 AdjustGameTime 中实现自己项目的时间修改逻辑。
  • 悬浮按钮依赖 DraggableFloatingButton 组件,请不要从生成的预制体中移除此组件,否则会失去拖拽/吸附功能。

如需进一步定制(增删标签页、调整布局、修改颜色风格等),推荐直接在生成的 UniversalDebugTool 预制体上修改 UI 结构和 UniversalDebugTool 组件的序列化字段。