内托体头 发表于 2020-12-29 10:16

Unity多功能调试工具——UnityDebugViewer

简介


什么是UnityDebugViewer

UnityDebugViewer是一个基于Unity Editor开发的,用于查看和分析使用Unity引擎开发的游戏产生的Log的Unity插件。
目前,UnityDebugViewer已在github上开源,更多关于UnityDebugViewer的介绍,可以参见Repository主页。

项目地址:https://github.com/AsanCai/UnityDebugViewer

为什么要开发UnityDebugViewer

目前Unity开发者使用较多的的Log查看插件是(https://assetstore.unity.com/packages/tools/utilities/editor-console-pro-11889?aid=1101l4bPZ&utm_source=aff).虽然对比Unity原生控制台编辑器,Editor Console Pro提供了诸如搜索、筛选Log,查看Log堆栈的源码信息等强大的功能,但因为它是闭源的商业插件,且没有详尽的开发文档支持开发者在其基础上进行二次开发,所以开发者很难根据自己项目的实际需求对其进行拓展。
再加上使用Editor Console Pro的时候,它偶尔会出现内部错误输出大量的Error Log,覆盖真正有用的Log信息,影响开发效率。因此,我决心利用春节假期和业余时间,开发一个足以取代Editor Console Pro的Log查看插件。
功能与亮点

功能
一开始在设计的时候,我就以`简单易用`、`可拓展`和`性能快`作为功能开发的首要目标。虽然个人技术和能力有限,目前仍未能完美地达到这三个目标,但在我的不懈努力下,依旧取得了不小的成果。总的来说,UnityDebugViewer实现Editor Console Pro的大部分功能,并在此基础上加了许多额外的拓展功能。

基本功能
UnityDebugViewer提供了使用`正则表达式`搜索Log的功能,并支持显示Log产生的时间,从而允许开发者针对时间进行筛选,获取某个时间段内产生的所有Log,提高定位问题的效率。

为了方便开发者清晰地查看产生Log的堆栈信息,UnityDebugViewer还提供了解析Log的堆栈信息的功能。如果Log的堆栈信息包含了源码路径及方法所在的行数,UnityDebugViewer还会展示其对应的源码内容,并支持点击打开对应的源代码文件。

最后,虽然添加尽可能多的Log信息,有助于更快地定位、分析问题产生的原因,但如果Log过多,其产生的大量的GC很可能对游戏的性能造成不小的负面影响。因此,UnityDebugViewer还提供了Log统计的功能,帮助开发者在开发过程中发现输出过多冗余Log的调用链,并及时将其删除。

拓展功能
对于游戏开发者来说,定位并分析游戏在手机上运行时产生的问题往往是一件十分困难的事,一来是因为开发者难以实时获取游戏在执行某些关键步骤时产生的Log,只能在游戏跑完某个流程之后获取保存在手机上的Log文件进行离线分析;二来则是因为分析Log文件不如分析编辑器里产生的Log那么方便,效率低下。
因此,UnityDebugViewer为开发者提供了实时查看游戏在安卓手机上运行时产生的Log的功能。无需额外下载、配置SDK或者安装Android Studio,只需要将开启了开发者模式的手机使用USB线连接至电脑,并在手机上运行游戏,即可在UnityDebugViewer上看到游戏产生的Log,并利用UnityDebugViewer提供的搜索、统计功能对Log进行分析。

除此之外,开发者在开发过程中,常常会遇到测试同学提了一个偶现的Bug,自己难以复现只能对测试同学的Log进行分析来定位问题的情况。为此,UnityDebugViewer还提供了解析Log文件的功能,只需要Log文件保存Log的格式满足一定的条件,就能利用UnityDebugViewer提供的搜索、统计功能对Log进行分析。

最后,除了Log,开发者可能还会想要传输一些额外的数据。为此,UnityDebugViewer对ADB Forward功能和Tcp socket进行封装,提供了一些简单易用的接口,并允许开发者根据自身需求来拓展编辑器,以决定如何来处理、显示这些数据。关于如何使用这些接口以及如何拓展编辑器,可参见(https://github.com/AsanCai/UnityDebugViewer)。
下面展示了UnityDebugViewer使用ADB Forward和Tcp socket输出真机运行时产生的Log的界面。

技术简介


UnityDebugViewer基于Unity EditorWindow开发而成,其基本架构并不复杂,如下图所示。


其中,`UnityDebugViewerWindow`包含了绘制整个窗口的逻辑,而`UnityDebugViewerEditor`则提供了包括Log数据和统计数据在内的所有数据以及操作这些数据的方法。
`UnityDebugViewerWindow`可以同时绑定多个`UnityDebugViewerEditor`,并通过`UnityDebugViewerEditorManager`来管理其绑定的所有`UnityDebugViewerEditor`实例。
此外,为了提高拓展性,这里还引入了`UnityDebugViewerIntermediaEditor`,它是`UnityDebugViewerWindow`和`UnityDebugViewerEditor`中介,通过创建一个`UnityDebugViewerIntermediaEditor`实例并绑定到对应的`UnityDebugViewerEditor`上,即可实现对`UnityDebugViewerEditor`的拓展。
最后,UnityDebugViewer还提供了大量`Utility`工具类,他们包含了许多封装好的接口,如创建Tcp Socket、开启ADB进程等等。


展望


UnityDebugViewer作为我的第一个开源项目,为了把它打造成一个真的能用的工具,在开发它的过程中,我遇到并尝试解决了许多问题。这些问题虽然细微,却对工具的可用性有很大的影响。为了解决这些问题,我常常要去了解一些零碎且深入的知识点,如正则表达式的工作原理以及如何提高正则表达式的性能,如Unity序列化数据的规则以及如何绕开Unity对无法序列化递归数据结果的限制来持久化保存一颗树等,颇有一些收获,也取得了一定的成功。

然而,由于个人能力有限,且是利用不怎么充裕的业余时间进行开发,我深知UnityDebugViewer目前仍不够完美,依旧存在着不少的问题,如:
1. 为什么有些从Logcat中捕获的中文会出现乱码?
2. 能否实现高效地捕获苹果手机上的log?
3. 接口设计是否合理好用?
4. 拓展性是否足够强?
5. 能否加入更多更实用的功能来满足开发者调试的需求等

因此,我诚挚邀请对UnityDebugViewer感兴趣、抑或有问题以及建议的朋友和我一起沟通交流,也欢迎各位想一起完善UnityDebugViewer,实现更多更强大、更实用的功能的朋友一起协作,共同学习,共同进步。
页: [1]
查看完整版本: Unity多功能调试工具——UnityDebugViewer