7.4 KiB
7.4 KiB
MeowMent Debug Tool(通用调试工具)
一个面向运行时的 Unity 调试工具,内置多标签页调试面板、可拖拽悬浮按钮、设备/系统信息查看,以及通过特性自动生成的“自定义调试按钮”。
核心脚本:
Runtime/UniversalDebugTool.csRuntime/DraggableFloatingButton.csEditor/DebugToolPrefabGenerator.csEditor/CreateTabButtonPrefab.cs
功能概览
- 多标签页调试面板(默认分辨率 1080x2340):
- 参数:设备信息、系统信息,一键复制到剪贴板。
- 自定义按钮:通过特性自动收集项目中的调试方法并生成按钮。
- 工具栏:简单的“时间调整”示例入口,可按项目需要扩展。
- 设置:运行时修改调试窗口尺寸、重置为默认分辨率。
- 悬浮调试按钮:
- 关闭主窗口后,会显示一个可拖拽、自动吸附边缘的浮动按钮。
- 点击可再次打开调试主窗口,拖动不会误触打开(内部做了拖拽判定)。
- 运行时公共 API:
UniversalDebugTool.Show() / Hide() / Toggle()控制显示。UniversalDebugTool.ShowInputDialog(...)弹出输入对话框。UniversalDebugTool.Instance.ReloadCustomButtons()重新扫描并生成自定义按钮。
安装
方式一:本地拷贝(推荐在开发环境使用)
- 将
com.bywaystudios.meowmentdebugtool@0.1.4整个文件夹放到你项目的Packages/目录下。 - 打开 Unity,等待重新导入即可在菜单中看到调试工具相关项。
方式二:通过自建 Git / 私有仓库
如果你已经把此包发布到自己的 Git 仓库或私有 Package Registry,可参考 Unity 官方文档,通过修改 Packages/manifest.json 的 dependencies / scopedRegistries 来添加:
"dependencies": {
"com.bywaystudios.meowmentdebugtool": "0.1.4"
}
具体部署方式视团队实际环境而定,这里不展开。
快速开始
1. 在场景中生成调试工具预制体
在 Unity 菜单中执行:
Tools → Debug Tool → 生成调试工具预制件
在弹窗中选择保存路径(默认:Assets/UniversalDebugTool.prefab),点击“生成预制件”。
生成后的预制体包含:
- 一个独立的
Canvas(UI 根节点,排序顺序很高,保证在最上层渲染)。 UniversalDebugTool主组件和其所需的 UI 层级。- 主调试窗口(含标签页、参数页、自定义按钮页、工具栏页、设置页)。
- 可拖拽的调试悬浮按钮。
2. 把预制体放入场景
- 在 Project 窗口中找到生成的
UniversalDebugTool预制体。 - 将其拖入需要调试的场景(建议放到常驻/启动场景里)。
- 进入 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)。
写好方法后:
- 进入 Play 模式。
- 打开调试工具 → 切换到“自定义按钮”标签页。
- 即可看到刚才添加的调试按钮,点击执行对应逻辑。
如果你在运行时新增/修改了带有 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 新 UI(
UnityEngine.UI)。 - TextMesh Pro(
TMPro)。
- Unity 新 UI(
- 默认 UI 参考分辨率为 1080×2340,建议以手机竖屏调试为主。可在“设置”页中修改窗口大小以适配不同设备。
- 工具栏中的“时间调整”逻辑仅是示例,需要你在
AdjustGameTime中实现自己项目的时间修改逻辑。 - 悬浮按钮依赖
DraggableFloatingButton组件,请不要从生成的预制体中移除此组件,否则会失去拖拽/吸附功能。
如需进一步定制(增删标签页、调整布局、修改颜色风格等),推荐直接在生成的 UniversalDebugTool 预制体上修改 UI 结构和 UniversalDebugTool 组件的序列化字段。