首页 > Unity3D频道 > 【Unity3D研究院之游戏开发】 > Unity3D研究院之在发布版本屏蔽Debug.log输出的Log(七十)
2014
06-18

Unity3D研究院之在发布版本屏蔽Debug.log输出的Log(七十)

写在前面的话, unity5.3支持了运行时关闭产生的debug.log

 

在开发Unity的时候,在输出log的时候大家都会采用Debug.log()的方式来输出Log,但是游戏发布的时候这样的Log是不能关闭的,在用户手机运行产生一堆LOG也不是啥好事,一定要关闭才行、主要是unity官方也没有提供直接关闭的方法。

既然官方没提供方法,那么我们就得自己想办法。于是我写了一个类把Debug.log包了一层。

 这样我程序在输出Log的时候,我就不调用Debug.Log()了,我使用我新写的这个类。

 

 但是这样问题又来了,因为我如果直接这样写的话,如下图所示,当我输出Log以后,我在Console窗口中双击Log 这时候代码会定位在Debuger这个类的Log方法,这太麻烦了我需要定位在调用Debuger.log()的方法上。

Unity3D研究院之在发布版本屏蔽Debug.log输出的Log(七十) - 雨松MOMO程序研究院 - 1

为了解决这个问题,我们可以把Debuger类做成一个dll,在终端里面输入如下代码 。。

 如果你要把多个.cs文件做成一个dll的话,那么在终端里用空格把你的.cs文件分开即可,于是我在终端里面输入,参数 就是我的cs的完整路径。

执行完毕后,会自动的在你脚本的平级路径下生成一个同名的dll文件。 在把Debuger.cs文件删除,保留Debuger.dll就可以了。

 

Unity3D研究院之在发布版本屏蔽Debug.log输出的Log(七十) - 雨松MOMO程序研究院 - 2

如果你的版本正式发布, 你只需找一个合适的地方调用enableLog = true就可以。

开始我想的是在Debuger类里面直接用 #if define这样的标签来做,后来我发现很多问题出现在正式版本里,一旦使用预定义标签编译那么除非重新打包不然是觉对看不到LOG。所以干脆就直接用一个静态变量来标记是否打开Log方便。这样可以让服务端做一个密令一类的东西, 正式版也能让客户端把LOG打开。。

如果你确定你的项目不会出问题,不需要运行时产生log.那么最好使用Conditional, 参数就是条件编译的预定义标签,下面的DEBUG 就是在unity projectsetting 里面 声明 预定义标签, 当然你也可以自己去定义这些标签。这样在调用方法的时候就不会去执行 方法体的内容。。 

需要引入头文件

using System.Diagnostics;
using System;

 

 

最后我把这个简单的DLL上传一下,大家下载下来就可以直接用了。。或者你也可以按照本文的方法自己来封装。

下载地址: http://pan.baidu.com/s/1ntyoEF3

 

 

最后编辑:
作者:雨松MOMO
专注移动互联网,Unity3D游戏开发
捐 赠写博客不易,如果您想请我喝一杯星巴克的话?就进来看吧!

Unity3D研究院之在发布版本屏蔽Debug.log输出的Log(七十)》有 61 条评论

  1. 沉默的诗意 说:

    Debug定位都是定到源代码哪个文件第几行哪个函数等,编译过后函数名行号都灰飞烟灭了(至少学C语言时好像是这么说的),所以它应该会跨过这层定不了的位。不过我想不到这招,我也就是猜猜原因。。。

  2. 田野1822 说:

    请问用logcat看android版日志,会发现日志有不完整的情况,就是打印到一半就没了,感觉就像是多线程造成的错乱一样,请问这是什么问题?

  3. 硅藻泥 说:

    不错,很清晰清晰。

  4. 黃老吉 说:

    雨松大神 你好~~~”写在前面的话, unity5.3支持了运行时关闭产生的debug.log’您的意思是 UNITY 5.3 运行时会”自动”关闭产生的debug.log吗还是需要到那边关闭呢我是用UNITY5.3 加了PLAYMAKER与POOLMANAGER做了一个跑酷游戏跑起来都还满顺的 唯一的问题是….每跑到20~30秒的时间 游戏就会卡顿一下还有程序跑了几次后 卡顿的时间也会提早…..查看了profiler发现游戏在顿的时候 playakerfsm.update() 里面的logstringtoconsole 或Behaviour 会跑到98% 有时侯还会暴表这个问题困扰了我好久不知是不是 debug.log 造成的问题还是可能有其他可能呢希望能获得雨松大神的指导~~~~~~感激不尽

  5. 请问 dll解决定位问题的原理是什么?

  6. avi8111 说:

    不错,有理有据

  7. 哪亱de雨 说:

    怎么把脚本做成库工程

  8. Evol-M 说:

    请教一下产生的LOG文件在手机的哪个目录下

  9. 雪焰 说:

    请问楼主,你所说的终端是指什么?

  10. ching 说:

    請問那個做DLL的指令在哪打呢

  11. peakgao 说:

    其实定位问题有个更简单的办法,你只有在编辑器中,才需要双击进行定位的问题,且这个时候基本不存在禁用Log的功能,所以可以这样搞定,片段代码如下:public class Debuger { #if UNITY_EDITORpublic static Action<object> Log= Debug.Log;#elsestatic public void Log(object message){Log(message,null);}#endif功能上有点像C 的宏替换。

  12. peakgao 说:

    其实定位问题有个更简单的办法,你只有在编辑器中,才需要双击进行定位的问题,且这个时候基本不存在禁用Log的功能,所以可以这样搞定,片段代码如下:public class Debuger { #if UNITY_EDITORpublic static Action Log= Debug.Log;#elsestatic public void Log(object message){Log(message,null);}#endif功能上有点像C 的宏替换。

留下一个回复

你的email不会被公开。