{"id":14960545,"url":"https://github.com/asancai/unitydebugviewer","last_synced_at":"2026-02-27T01:32:12.717Z","repository":{"id":170156785,"uuid":"231919328","full_name":"AsanCai/UnityDebugViewer","owner":"AsanCai","description":"A powerful Unity debug tool integrated with ADB plugin","archived":false,"fork":false,"pushed_at":"2020-04-23T11:12:13.000Z","size":2758,"stargazers_count":116,"open_issues_count":3,"forks_count":20,"subscribers_count":4,"default_branch":"master","last_synced_at":"2025-04-07T02:03:39.233Z","etag":null,"topics":["adb","console","debugging-tool","unity","unity-editor","unity3d","unity3d-plugin"],"latest_commit_sha":null,"homepage":"","language":"C#","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/AsanCai.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2020-01-05T13:11:51.000Z","updated_at":"2025-03-13T08:17:20.000Z","dependencies_parsed_at":null,"dependency_job_id":"b6fd6e37-356e-496b-9090-ad40cd5ba222","html_url":"https://github.com/AsanCai/UnityDebugViewer","commit_stats":{"total_commits":56,"total_committers":2,"mean_commits":28.0,"dds":0.125,"last_synced_commit":"dc345976661520e4641b8897d6b86799ce80162b"},"previous_names":["asancai/unitydebugviewer"],"tags_count":1,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/AsanCai%2FUnityDebugViewer","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/AsanCai%2FUnityDebugViewer/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/AsanCai%2FUnityDebugViewer/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/AsanCai%2FUnityDebugViewer/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/AsanCai","download_url":"https://codeload.github.com/AsanCai/UnityDebugViewer/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":252038165,"owners_count":21684634,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["adb","console","debugging-tool","unity","unity-editor","unity3d","unity3d-plugin"],"created_at":"2024-09-24T13:22:29.680Z","updated_at":"2026-02-27T01:32:12.683Z","avatar_url":"https://github.com/AsanCai.png","language":"C#","funding_links":[],"categories":[],"sub_categories":[],"readme":"- [UnityDebugViewer](#unitydebugviewer)\n  * [支持版本](#支持版本)\n  * [如何使用](#如何使用)\n  * [基本功能](#基本功能)\n  * [拓展功能](#拓展功能)\n    + [Editor](#editor)\n    + [ADB Forward](#adb-forward)\n    + [ADB Logcat](#adb-logcat)\n    + [Log File](#log-file)\n  * [添加自定义模式](#添加自定义模式)\n\nUnityDebugViewer\n========================\n\n`UnityDebugViewer`是一个功能强大的Unity Log查看工具，它集成了`Unity Console Window`的所有功能，并在此基础上加入了`搜索`、`查看堆栈源码`和`Log统计`等功能。\n通过使用`UnityDebugViewer`，无需安装`Android Studio`或者下载`SDK`就可以很方便地查看Unity在手机上输出的Log并获取相应的堆栈信息。此外，`UnityDebugViewer`还提供了解析Unity保存在手机上的Log文件的功能，帮助开发者使用`UnityDebugViewer`快速分析、定义游戏在手机上运行时遇到的问题。\n\n支持版本\n---------------------\n\n`UnityDebugViewer`使用Unity 5.6.6f2开发完成，能支持Unity 4.x以上版本\n\n\n如何使用\n---------------------\n方法一：\n 1. 将本仓库克隆至本地\n 1. 将`UnityDebugViewer`文件夹移植至项目中`Assets`目录下的任意文件夹\n 1. 选择`Window-\u003eDebug Viewer`打开窗口\n\n方法二：\n 1. 下载最新版本的[Package](https://github.com/AsanCai/UnityDebugViewer/releases)\n 1. 将下载好的Package导入至项目中\n 1. 选择`Window-\u003eDebug Viewer`打开窗口\n\n\u003e注意：如果想要使用`UnityDebugViewer`提供的接口，需要避免将`UnityDebugViewer`存放至名称为`Editor`文件夹之下（包括子文件夹）\n\n\n基本功能\n---------------------\n\n1. 工具栏功能：\n    1. 清理log（Clear）、折叠log（Collapse）、运行时清理log（Clear On Player）、遇到error时暂停（Error Pause）和过滤log类型等`Console Window`具备的功能；\n    1. 滚动至最新log：勾选`Auto Scroll`按钮，当有新的log输出至窗口时，滚动条会自动滚动至底部；\n    1. 统计Log：勾选`Show Analysis`按钮，窗口下方会展示出当前所有log的统计信息（可以通过切换`Sort Type`来改变当前用于筛选log的类型，也可以在右边的搜索框输入`关键词`或者`正则表达式`进行搜索）；\n    ![Show Analysis](./Screenshots/log_analysis.png)\n    1. 筛选`log`的功能\n        1. 启用正则表达式搜索：选中工具栏搜索框右侧的`Regex`按钮，就可以输入正则表达式对log进行筛选；\n        1. 显示log的时间：勾选工具栏搜索框右侧的`Time`按钮，将显示产生log的时间，此时可以对时间进行筛选，从而获取某个时间段内产生的所有log；\n\n        ![Show Source Content](./Screenshots/log_show_time.png)\n1. 堆栈相关功能：\n    1. `显示堆栈源码`的功能：选中某一条log，可以展示该log的所有堆栈信息。如果堆栈包含源代码信息，且对应的文件存在，可以直接展示源码的内容；\n    1. `打开堆栈源码`的功能：如果log的堆栈包含源代码信息，直接用鼠标右键双击log或者堆栈，可以直接打开对应的源代码文件，并直接跳转对应的行数；\n    ![Show Source Content](./Screenshots/log_stack.png)\n1. 其他功能：\n    1. 在log或者堆栈上点击`鼠标右键`并选择`Copy`，可以复制log的内容或者堆栈的完整信息；\n    1. 按方向键`↑`和`↓`可以当前选中的对象；\n    1. 选中log时，点击`鼠标中键`可以快速跳转到当前选中的log；\n    1. `DebugViewer`窗口标签页处点击鼠标右键，可以呼出窗口菜单:\n        1. 选择`Log Entry`可以修改log框的大小；\n        1. 选择`Save Log`可以将窗口中的log保存至指定文件；\n        1. 选择`About UnityDebugViewer`可以打开在线文档；\n\n        ![Show Menu](./Screenshots/debug_viewer_menu.png)\n\n\n拓展功能\n---------------------\n\n`UnityDebugViewer`默认提供了`Editor`、`ADB Forward`、`ADB Logcat`和`Log File`四种模式，它们分别拥有不同的拓展功能。\n\n### Editor\n`UnityDebugViewer`的`Editor`模式等同于Unity自带的`Console Window`，它能获取使用`UnityEngine.Debug`输出的log以及项目编译、运行时产生的告警或者异常信息。\n![Editor Mode](./Screenshots/editor_mode.png)\n\n### ADB Forward\n`UnityDebugViewer`的`ADB Forward`模式集成了adb的forward指令，允许使用者通过Tcp将项目在手机上运行时产生的数据传输至`UnityDebugViewer`上并显示。\n![ADB Forward Mode](./Screenshots/adb_forward_mode.png)\n\u003e使用方式：\n\u003e1. 将`UnityDebugViewer/Test/TestTcp.cs`附加到项目初始场景的某一空物体中\n\u003e1. 在将项目构建成apk时勾选`Development`，然后将构建好的apk安装至安卓设备并运行\n\u003e1. 使用usb连接线将安卓设备连接至电脑，并开启`开发者调试`选项\n\u003e1. 根据需要修改`PC Port`(PC端用于数据转发的端口)和`Phone Port`(手机端用于数据转发的端口)\n\u003e1. 点击`Start`开始收集并输出log，点击`Stop`停止收集log\n\n\n通过使用`UnityDebugViewer`提供的工具类，使用者可以很方便地定义并传输自定义的数据，其基本步骤如下：\n1. 定义用于Tcp传输的数据结构\n```c#\n[Serializable]\n[StructLayoutAttribute(LayoutKind.Sequential, Pack=1)]\nstruct TestStruct\n{\n    public int c;\n    /// 字符串，SizeConst为字符串的最大长度\n    [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 256)]\n    public string str;\n    /// int数组，SizeConst表示数组的个数\n    /// 初始化的数组长度必须和SizeConst一致，例test = new int[6];\n    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 6)]\n    public int[] test;\n}\n```\n1. 在手机端上创建Tcp Server并发送数据\n    * 创建一个UnityDebugViewerTransfer实例，并调用CreateServerSocket方法创建一个Tcp Server Socket\n    * 使用`UnityDebugViewerTransferUtility.StructToBytes`将数据结构序列化成byte数组\n    * 调用UnityDebugViewerTransfer实例的SendData方法向已建立连接的Client发送数据\n``` C#\n/// 创建一个tcp传输实例\nvar transfer = new UnityDebugViewerTransfer();\n/// 创建一个tcp server socket并侦听50000端口\ntransfer.CreateServerSocket(50000);\n\nvar testData = new TestStruct();\nbyte[] sendData = UnityDebugViewerTransferUtility.StructToBytes(testData);\ntransfer.SendData(sendData);\n```\n1. 检查adb以及设备连接状态，然后使用`adb forward`指令开启`ADB Forward`进程，并建立转发端口\n```C#\nprivate void StartADBForward()\n{\n    if (UnityDebugViewerWindowUtility.CheckADBStatus() == false)\n    {\n        return;\n    }\n\n    string adbPath = UnityDebugViewerWindowUtility.GetAdbPath();\n    startForwardProcess = UnityDebugViewerADBUtility.StartForwardProcess(pcPort, phonePort, adbPath);\n    /// 成功创建adb forward进程\n    if (startForwardProcess)\n    {\n        ...\n    }\n}\n```\n1. 在Editor下创建Tcp Client并接收数据\n    1. 创建一个UnityDebugViewerTransfer实例，并绑定receiveDaraFromServerEvent回调事件\n    1. 调用UnityDebugViewerTransfer实例的ConnectToServer方法，创建一个Tcp Client并连接到指定的Server\n    1. 在receiveDaraFromServerEvent回调事件中处理从服务器收到的数据\n    1. 使用UnityDebugViewerTransferUtility.BytesToStruct将byte数组反序列化为数据结构\n``` C#\nprivate void ReceiveDataFromServerHandler(byte[] data)\n{\n    TestStruct logData = UnityDebugViewerTransferUtility.BytesToStruct\u003cTestStruct\u003e(data);\n    ...\n}\n\nprivate void StartADBForward()\n{\n    if (UnityDebugViewerWindowUtility.CheckADBStatus() == false)\n    {\n        return;\n    }\n\n    string adbPath = UnityDebugViewerWindowUtility.GetAdbPath();\n    startForwardProcess = UnityDebugViewerADBUtility.StartForwardProcess(pcPort, phonePort, adbPath);\n    /// 成功创建adb forward进程\n    if (startForwardProcess)\n    {\n        UnityDebugViewerTransferUtility.receiveDaraFromServerEvent += ReceiveDataFromServerHandler;\n        UnityDebugViewerTransferUtility.ConnectToServer(\"127.0.0.1\", port);\n    }\n}\n```\n1. 停止ADB Forward进程，并调用UnityDebugViewerTransfer的Clear方法清理Tcp socket和侦听进程\n```C#\n private void StopADBForward()\n{\n    string adbPath = UnityDebugViewerWindowUtility.GetAdbPath();\n\n    UnityDebugViewerADBUtility.StopForwardProcess(adbPath);\n    startForwardProcess = false;\n\n    /// will abort process, should excute at last\n    UnityDebugViewerTransferUtility.Clear();\n}\n```\n\n\u003e 说明：\n\u003e* UnityDebugViewerTransferUtility是一个在UnityDebugViewerTransfer基础上封装而成的工具类，它管理一个静态UnityDebugViewerTransfer实例，并提供了许多在使用UnityDebugViewerTransfer时会用到的公共接口\n\u003e* UnityDebugViewerTransferUtility封装了UnityDebugViewerTransfer的所有公有属性和方法，在大部分情况下，可以直接将UnityDebugViewerTransferUtility当成UnityDebugViewerTransfer实例使用\n\u003e* 但如果需要同时使用多个UnityDebugViewerTransfer实例，则需要自己创建UnityDebugViewerTransfer实例并进行管理\n\n`Assets/Test/TestTcp.cs`提供了如何获取、转发log数据的例子，关于如何添加一个自定义模式用于展示自定义数据，详见[添加自定义的模式](#添加自定义模式)。\n``` cs\nusing UnityEngine;\n\nnamespace UnityDebugViewer\n{\n    public class TestTcp : MonoBehaviour\n    {\n        private UnityDebugViewerTransfer transfer;\n        private void Awake()\n        {\n            /// 创建一个tcp传输实例\n            transfer = new UnityDebugViewerTransfer();\n            /// 创建一个tcp server socket并侦听50000端口\n            transfer.CreateServerSocket(50000);\n\n            /// 开始收集log信息\n            Application.logMessageReceivedThreaded += CaptureLogThread;\n\n            DontDestroyOnLoad(this.gameObject);\n        }\n\n        private void OnDestroy()\n        {\n            Application.logMessageReceivedThreaded -= CaptureLogThread;\n            transfer.Clear();\n        }\n\n        private void CaptureLogThread(string info, string stacktrace, UnityEngine.LogType type)\n        {\n            if (transfer == null)\n            {\n                return;\n            }\n            lock (transfer)\n            {\n                /// 将收集到的log数据序列化成byte[]\n                /// 并转发至连接到指定端口的tcp client socket\n                var logData = new TransferLogData(info, stacktrace, type);\n                byte[] sendData = UnityDebugViewerTransferUtility.StructToBytes(logData);\n                transfer.SendData(sendData);\n            }\n        }\n    }\n}\n```\n\n\n### ADB Logcat\n`UnityDebugViewer`的`ADB Logcat`模式集成了adb的logcat命令，无需安装Android Studio或者配置SDK环境，只需要使用usb线将手机连接至电脑，就可以直接看到项目在手机上运行时输出的所有log以及产生log的堆栈信息。\n![ADB Logcat Mode](./Screenshots/adb_logcat_mode.png)\n\u003e使用方式：\n\u003e1. 在已开启`开发者调试`选项的安卓设备上运行项目\n\u003e1. 使用usb连接线将安卓设备连接至电脑\n\u003e1. 修改`Tag Filter`以指定使用logcat命令获取哪些log信息\n\u003e    *  `Tag Filter`为`Unity`表示只捕获Unity生成的log\n\u003e    *  `Tag Filter`为空表示捕获安卓系统产生的所有log\n\u003e1. 点击`Start`开始从手机上捕获log并输出至窗口，点击`Stop`停止捕获log；\n\n\n### Log File\n`UnityDebugViewer`的`Log File`模式提供了解析log文件的功能，其能解析的log格式与UnityDebugViewer将log保存至文件时使用的格式一致，如下所示：\n```\n[log类型] 时间 log内容\n堆栈信息\n```\n\u003e* log类型可以是`Log`、`Warning`或者`Error`，不区分大小写\n\u003e* log内容可以输入任何符号\n\u003e* 堆栈信息可以为空\n![Log File Mode](./Screenshots/log_file_mode.png)\n\n\n添加自定义模式\n---------------------\n\n除了使用`UnityDebugViewer`提供的四种默认模式，`UnityDebugViewer`还允许使用者根据实际的需求添加自定义的模式。添加自定义模式的步骤并不复杂，如下所示：\n1. 在任一`Editor`文件夹下创建一个继承自`UnityDebugViewer.UnityDebugViewerIntermediaryEditor`的类\n1. 使用`[InitializeOnLoadMethod]`标记一个`静态方法`作为初始化入口\n1. 在初始化入口中使用`UnityDebugViewerEditorManager.RegisterMode`方法注册自定义模式\n    \u003e ```UnityDebugViewerEditorManager.RegisterMode\u003cT\u003e(string mode, int order)```    \n    \u003e T: UnityDebugViewerIntermediaryEditor或者其子类\n    \u003e\u003e 参数：\n    \u003e\u003e\n    \u003e\u003e mode: 自定义模式的名称\n    \u003e\u003e \n    \u003e\u003e order: 自定义模式的权重，用于决定其在下拉列表中的显示顺序。如果权重相同，则会根据注册的顺序来显示\n1. 覆写`UnityDebugViewer.UnityDebugViewerIntermediaryEditor`提供的方法：\n    1. `Clear`：点击工具栏的`Clear`按钮时被调用\n    1. `OnGUI`：在绘制工具栏时被调用，可用于在工具栏上绘制自定义的UI\n    1. `StartCompiling`：项目开始编译时被调用，可用于清理线程等数据\n1. 使用`UnityDebugViewerLogger.Log`、`UnityDebugViewerLogger.LogWarning`或者`UnityDebugViewerLogger.LogError`方法将log输出至自定义模式对应的UnityDebugViewerEditor上\n\n为了方便使用者快速掌握如何添加自定义的模式，`UnityDebugViewer`提供了`UnityDebugViewer/Test/Editor/TestCustomMode.cs`作为添加自定义模式的例子。以下是`TestCustomMode.cs`的内容和详细注释，它包括了添加自定义模式的所有步骤。\n![Custom Mode](./Screenshots/custom_mode.png)\n``` cs\nusing UnityEngine;\nusing UnityEditor;\n\nnamespace UnityDebugViewer\n{\n    public class TestCustomMode : UnityDebugViewerIntermediaryEditor\n    {\n        /// \u003csummary\u003e\n        /// 模式的名称\n        /// \u003c/summary\u003e\n        private const string MODE_NAME = \"TestCustomMode\";\n\n        /// \u003csummary\u003e\n        /// 标记初始化的入口\n        /// \u003c/summary\u003e\n        [InitializeOnLoadMethod]\n        private static void InitializeTestCustomMode()\n        {\n            /// 自定义模式的权重，用于决定其在下拉列表中的显示顺序\n            int order = 10;\n\n            /// 添加自定义的模式\n            UnityDebugViewerEditorManager.RegisterMode\u003cTestCustomMode\u003e(MODE_NAME, order);\n        }\n\n        /// \u003csummary\u003e\n        /// 在点击Clear按钮时被调用\n        /// \u003c/summary\u003e\n        public override void Clear()\n        {\n            base.Clear();\n\n            UnityDebugViewerLogger.Log(\"Clear\", MODE_NAME);\n        }\n\n        /// \u003csummary\u003e\n        /// 在下拉列表中选择当前的模式时被调用\n        /// \u003c/summary\u003e\n        public override void OnGUI()\n        {\n            base.OnGUI();\n\n            if (GUILayout.Button(new GUIContent(\"Add Log\"), EditorStyles.toolbarButton))\n            {\n                UnityDebugViewerLogger.Log(\"Add Log\", MODE_NAME);\n            }\n        }\n\n        /// \u003csummary\u003e\n        /// 在脚本开始编译时被调用\n        /// \u003c/summary\u003e\n        public override void StartCompiling()\n        {\n            base.StartCompiling();\n\n            UnityDebugViewerLogger.Log(\"StartCompiling\", MODE_NAME);\n        }\n    }\n}\n```","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fasancai%2Funitydebugviewer","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fasancai%2Funitydebugviewer","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fasancai%2Funitydebugviewer/lists"}