记一次 Unity 定位 bug

前言

最近公司在开发一个对战游戏:服务端使用 Java + Netty + Spring,编辑器使用 IDEA;客户端使用 C# + Unity,编辑器使用 Unity Editor 和 Rider;通信方式使用 Socket,消息编解码使用 Protobuf。由于你懂的原因,加入了机器人。机器人的昵称、头像等信息是通过配置文件读取的。机器人的配置格式类似 {"nickname": "xxx", "avatar": "yyy"}

阶段性开发后,打包进行测试。

出现问题

某天收到一个 bug 反馈,反馈的信息是一张游戏界面的截图:图上有玩家/机器人的头像和昵称,其中一个机器人(后面都简称为 R)的昵称是乱码。(简而言之,能看出来机器人 R 的头像,但是看不出来 R 的昵称是哪些字符。)很明显这是一道编 song 码 fen 题。

定位问题

由于手头只有代码和配置文件,没有机器人头像的图片资源。所以先用 Python 写了个脚本把机器人配置文件里的头像都抓了下来。通过对比,定位到 R 头像的图片 url,再从 url 找到 R 的具体配置,并定位到乱码的字符。嗯,的确是个特殊字符。

重现问题

把配置文件里机器人昵称都改成同样的昵称(那个不能正常显示的特殊字符),这样必定能看到字符在传输过程中的变化,也能看到是哪里出了问题。改好配置,运行游戏,可以看到画面上的字符的确不能正常显示。查看日志,在 (Mac 下的)Unity Editor 中,特殊字符显示为空白字符;在 Rider 中能正常显示。这就说明了服务端读取配置文件、Protobuf 编解码、Socket 数据传输的过程都没有问题。问题出现在 Unity 对特殊字符的处理上。

进一步确认问题:将特殊字符直接发到手机上,是可以正常显示的。但是在使用 Unity 写的游戏中,就显示为乱码了。

解决问题

TODO:还暂未找到解决问题的方式。目前来看,应该是哪里需要再设置、配置一下。这里待更新。

后记

说来惭愧,我定位问题到后的第一反应是甩锅:先丢出相关截图和说明,表明这不是自己的锅。作为一个开发,遇到问题的第一反应居然不是解决,而是想着怎么证明不是自己的锅。我大概是一个假的程序猿。

写下这篇博客只是为了水,以便完成两周一篇的目标。主要还是想让自己记住,保持对技术的热情和解决问题的兴奋。在遇到问题时,无论是不是自己的,都要敢于承担、善于探索解决。这样才能更快地成长,毕竟程序员就是在解决问题的过程中成长的。