MeowmentDebugTool/Packages/com.bywaystudios.meowmentdebugtool/README.md
2025-12-22 15:29:55 +08:00

13 KiB
Raw Blame History

MeowMent Debug Tool喵刻调试工具

一个强大的 Unity 运行时调试工具,提供多标签页调试面板、控制台日志、可拖拽悬浮按钮、系统信息查看以及自定义调试按钮等功能。

版本: 0.3.0
适用平台: 全平台Windows、Android、iOS等
Unity版本 2021.3 及以上


📋 目录


🎯 功能特性

核心功能模块

  • 参数查看:实时查看设备信息、系统信息,支持一键复制
  • 自定义按钮:通过特性自动生成调试按钮,无需手动添加
  • 工具栏:时间调整工具、截图隐藏功能
  • 控制台实时捕获Unity日志支持过滤、搜索、查看堆栈
  • 设置:运行时修改分辨率

UI特性

  • 可拖拽悬浮按钮,自动吸附边缘
  • 多标签页设计,清晰分类
  • Canvas层级30000始终在最上层
  • 支持自定义TextMeshPro字体

👥 给策划使用 - 基础功能

1. 如何打开调试工具

游戏运行后,屏幕左侧会显示一个蓝色圆形浮窗按钮

  • 点击浮窗 → 打开调试主窗口
  • 拖动浮窗 → 改变位置(会自动吸附到屏幕边缘)
  • 点击左上角X → 关闭主窗口,回到浮窗状态

2. 功能页面说明

调试窗口包含5个标签页

📊 参数查看

  • 设备信息:设备型号、系统版本、处理器、内存等
  • 系统信息Unity版本、图形API、显卡信息等
  • 复制按钮点击可复制信息到剪贴板方便粘贴到bug报告

🎮 自定义按钮

  • 显示后端程序员添加的调试功能按钮
  • 点击按钮即可执行对应功能(如清理存档、添加道具等)
  • 不同按钮有不同颜色,方便区分

常见按钮示例:

  • "清空玩家数据" - 重置游戏进度
  • "添加金币" - 增加游戏货币
  • "解锁所有关卡" - 开启所有内容
  • "重置今日任务" - 刷新每日任务

🛠️ 工具栏

  • 时间调整:模拟时间流逝(用于测试时间相关功能)
  • 暂时隐藏(5秒)截图前点击此按钮调试工具会隐藏5秒方便截取干净的游戏画面

使用场景:

  1. 需要截图游戏画面时
  2. 点击"暂时隐藏(5秒)"
  3. 调试工具消失,快速截图
  4. 5秒后自动恢复继续调试

📝 控制台

实时显示游戏日志,帮助定位问题:

  • Info白色:普通信息日志
  • Warning黄色:警告信息
  • Error红色:错误信息
  • Fatal深红:严重错误/异常

功能按钮:

  • 清空:清除所有日志
  • 锁定滚动:勾选后自动滚动到最新日志
  • 过滤器点击Info/Warning/Error切换显示对应类型日志

查看详情:

  • 点击任意日志条目 → 下方显示完整堆栈信息
  • 方便向程序员反馈详细错误

⚙️ 设置

  • 分辨率调整:修改游戏窗口大小(仅编辑器/Windows有效
  • 当前分辨率显示:显示当前屏幕分辨率

3. 日常测试工作流

测试新功能:

  1. 打开调试工具
  2. 切换到"自定义按钮"页面
  3. 点击相关测试按钮(如"开启活动"
  4. 观察游戏效果
  5. 如有问题,切换到"控制台"查看错误

截图报bug

  1. 复现问题
  2. 点击"工具栏" → "暂时隐藏(5秒)"
  3. 截取游戏画面
  4. 切换回"控制台"截取错误日志
  5. 一起提交给程序

收集设备信息:

  1. 切换到"参数查看"
  2. 点击"复制设备信息"或"复制系统信息"
  3. 粘贴到bug报告中

💻 给客户端使用 - 初始化配置

1. 基础初始化

在游戏启动时(通常在启动场景的初始化脚本中)调用:

using UnityEngine;
using MeowmentDebugTool;
using TMPro;

public class GameInitializer : MonoBehaviour
{
    [SerializeField] private TMP_FontAsset customFont; // 拖入自定义字体
    
    void Start()
    {
        // 初始化调试工具
        UniversalDebugTool.Init();
        
        // 设置自定义字体(可选)
        if (customFont != null)
        {
            UniversalDebugTool.SetSDFFont(customFont);
        }
    }
}

2. API说明

UniversalDebugTool.Init()

初始化调试工具,自动创建:

  • Canvas排序顺序30000
  • 主调试窗口
  • 悬浮按钮
  • EventSystem如果没有

注意:

  • 只需调用一次
  • 工具会自动DontDestroyOnLoad场景切换不销毁
  • 未调用Init()前不显示任何UI

UniversalDebugTool.SetSDFFont(TMP_FontAsset fontAsset)

设置所有UI文本的字体

  • 包括已创建的UI和后续创建的按钮
  • 支持中文、特殊字符
  • 建议使用支持中文的SDF字体

字体推荐:

  • 思源黑体 SDF
  • 阿里巴巴普惠体 SDF
  • 或项目现有的中文字体

3. 条件编译(推荐)

为了确保打包时不包含调试代码:

void Start()
{
    #if MEOWMENT_DEBUG_TOOL
    UniversalDebugTool.Init();
    UniversalDebugTool.SetSDFFont(customFont);
    #endif
}

说明:

  • MEOWMENT_DEBUG_TOOL 宏在包安装时自动定义
  • 移除包时自动移除,不影响项目编译
  • 正式包不会包含调试工具代码

4. 完整示例

using UnityEngine;
using MeowmentDebugTool;
using TMPro;

public class Test : MonoBehaviour
{
    public TMP_FontAsset fontAsset;
    
    void Start()
    {
        #if MEOWMENT_DEBUG_TOOL
        // 初始化调试工具
        UniversalDebugTool.Init();
        
        // 设置字体
        if (fontAsset != null)
        {
            UniversalDebugTool.SetSDFFont(fontAsset);
        }
        #endif
    }
}

🔧 给后端使用 - 添加自定义按钮

1. 基础用法

使用 [DebugButton] 特性标记静态方法,调试工具会自动生成按钮:

using UnityEngine;

public static class PlayerDebugFunctions
{
    [DebugButton("清空玩家数据")]
    private static void ClearPlayerData()
    {
        PlayerPrefs.DeleteAll();
        Debug.Log("玩家数据已清空");
    }
    
    [DebugButton("添加1000金币")]
    private static void AddCoins()
    {
        PlayerData.Coins += 1000;
        Debug.Log($"当前金币:{PlayerData.Coins}");
    }
}

运行效果:

  • 在"自定义按钮"页面会出现两个按钮
  • 点击按钮执行对应方法

2. 特性参数详解

[DebugButton(string displayName = "", float r = 0.8f, float g = 0.8f, float b = 0.8f)]

参数说明:

  • displayName:按钮显示文字(不填则使用方法名)
  • r, g, b按钮背景颜色RGB值范围0-1

示例:不同颜色按钮

public static class GameDebugFunctions
{
    // 绿色按钮 - 安全操作
    [DebugButton("保存游戏", 0.2f, 0.6f, 0.2f)]
    private static void SaveGame()
    {
        GameManager.Save();
    }
    
    // 红色按钮 - 危险操作
    [DebugButton("删除存档", 0.9f, 0.2f, 0.2f)]
    private static void DeleteSave()
    {
        GameManager.DeleteSave();
    }
    
    // 蓝色按钮 - 功能测试
    [DebugButton("跳到第10关", 0.2f, 0.5f, 0.9f)]
    private static void JumpToLevel10()
    {
        LevelManager.LoadLevel(10);
    }
    
    // 默认颜色(灰色)
    [DebugButton("打印游戏状态")]
    private static void PrintGameState()
    {
        Debug.Log($"Level: {GameManager.CurrentLevel}");
    }
}

3. 使用输入对话框

需要用户输入参数时,使用 ShowInputDialog

using TMPro;

public static class AdvancedDebugFunctions
{
    [DebugButton("设置玩家等级")]
    private static void SetPlayerLevel()
    {
        UniversalDebugTool.ShowInputDialog(
            "输入等级",
            onConfirmAction: text =>
            {
                if (int.TryParse(text, out int level))
                {
                    PlayerData.Level = level;
                    Debug.Log($"等级已设置为:{level}");
                }
                else
                {
                    Debug.LogWarning("请输入有效数字");
                }
            },
            initialValue: "1",
            contentType: TMP_InputField.ContentType.IntegerNumber
        );
    }
    
    [DebugButton("设置玩家名称")]
    private static void SetPlayerName()
    {
        UniversalDebugTool.ShowInputDialog(
            "输入名称",
            onConfirmAction: name =>
            {
                PlayerData.Name = name;
                Debug.Log($"名称已设置为:{name}");
            },
            initialValue: PlayerData.Name,
            contentType: TMP_InputField.ContentType.Standard
        );
    }
}

4. 条件编译(推荐)

为了确保正式版不包含调试代码:

public static class ItemDebugFunctions
{
    #if MEOWMENT_DEBUG_TOOL
    [DebugButton("添加道具")]
    private static void AddItem()
    {
        ItemManager.AddItem(1001, 10);
    }
    #endif
}

5. 高级技巧

技巧1分类管理

按功能模块创建不同的类:

// 玩家相关
public static class PlayerDebug { ... }

// 关卡相关
public static class LevelDebug { ... }

// 道具相关  
public static class ItemDebug { ... }

技巧2快速测试流程

[DebugButton("快速进入战斗")]
private static void QuickEnterBattle()
{
    // 1. 设置测试数据
    PlayerData.Level = 10;
    PlayerData.Coins = 9999;
    
    // 2. 解锁功能
    FeatureManager.UnlockAll();
    
    // 3. 跳转场景
    SceneManager.LoadScene("Battle");
}

技巧3开发辅助

[DebugButton("开启所有调试选项")]
private static void EnableAllDebug()
{
    GameConfig.ShowFPS = true;
    GameConfig.GodMode = true;
    GameConfig.UnlimitedEnergy = true;
    Debug.Log("所有调试选项已开启");
}

6. 实战示例

using UnityEngine;
using UnityEngine.SceneManagement;
using TMPro;

public static class SampleDebugFunctions
{
    #region 玩家数据
    [DebugButton("重置游戏", 0.9f, 0.3f, 0.3f)]
    private static void ResetGame()
    {
        PlayerPrefs.DeleteAll();
        SceneManager.LoadScene(0);
        Debug.Log("游戏已重置");
    }
    
    [DebugButton("满级满资源", 0.2f, 0.8f, 0.2f)]
    private static void MaxEverything()
    {
        PlayerData.Level = 99;
        PlayerData.Coins = 999999;
        PlayerData.Gems = 99999;
        Debug.Log("已设置为满级满资源");
    }
    #endregion
    
    #region 关卡测试
    [DebugButton("跳关", 0.3f, 0.6f, 0.9f)]
    private static void JumpToLevel()
    {
        UniversalDebugTool.ShowInputDialog(
            "输入关卡号",
            text =>
            {
                if (int.TryParse(text, out int level))
                {
                    LevelManager.LoadLevel(level);
                }
            },
            "1",
            TMP_InputField.ContentType.IntegerNumber
        );
    }
    
    [DebugButton("解锁所有关卡", 0.2f, 0.8f, 0.8f)]
    private static void UnlockAllLevels()
    {
        for (int i = 0; i < 100; i++)
        {
            LevelManager.UnlockLevel(i);
        }
        Debug.Log("已解锁所有关卡");
    }
    #endregion
    
    #region 系统测试
    [DebugButton("清理未使用资源", 0.9f, 0.5f, 0.3f)]
    private static void UnloadUnusedAssets()
    {
        Resources.UnloadUnusedAssets();
        Debug.Log("已清理未使用的资源");
    }
    
    [DebugButton("触发GC")]
    private static void ForceGC()
    {
        System.GC.Collect();
        Debug.Log("已触发垃圾回收");
    }
    #endregion
}

常见问题

Q1: 字体显示方块/乱码怎么办?

A: 调用 UniversalDebugTool.SetSDFFont() 设置支持中文的SDF字体。

Q2: 自定义按钮不显示?

A: 检查:

  • 方法是否为 static
  • 是否添加了 [DebugButton] 特性
  • 是否在 #if MEOWMENT_DEBUG_TOOL

Q3: 第二次点击"暂时隐藏"无效?

A: 等待上一次隐藏结束,或查看控制台是否有"已经在隐藏状态中"的警告。

Q4: 如何在正式版移除调试工具?

A: 删除Packages目录下的工具包文件夹即可#if MEOWMENT_DEBUG_TOOL 包裹的代码会自动失效。

Q5: 控制台日志太多怎么办?

A:

  • 点击"清空"按钮清除日志
  • 使用过滤器只显示Error/Warning
  • 工具默认只保留最新100条日志

Q6: 可以在多个场景使用吗?

A: 可以工具使用DontDestroyOnLoad场景切换不会销毁。


📝 更新日志

[0.3.0] - 2025-12-22

  • 新增控制台模块实时显示Unity日志
  • 新增暂时隐藏功能,方便截图
  • 🔨 重构代码架构,模块化设计
  • 🐛 修复多个UI布局问题

[0.2.2] - 2025-12-19

  • 🔨 默认显示浮窗而非主窗口
  • 🐛 优化初始化逻辑

详见 CHANGELOG.md


📦 依赖

  • Unity 2021.3+
  • TextMesh Pro (com.unity.textmeshpro)
  • Unity UI (com.unity.ugui)

📧 联系方式

如有问题或建议,请联系开发团队。


祝调试顺利! 🐱