写在前面的话, unity5.3支持了运行时关闭产生的debug.log
1 2 3 |
Debug.logger.logEnabled = false; |
在开发Unity的时候,在输出log的时候大家都会采用Debug.log()的方式来输出Log,但是游戏发布的时候这样的Log是不能关闭的,在用户手机运行产生一堆LOG也不是啥好事,一定要关闭才行、主要是unity官方也没有提供直接关闭的方法。
1 2 3 |
Debug.Log("雨松MOMO"); |
既然官方没提供方法,那么我们就得自己想办法。于是我写了一个类把Debug.log包了一层。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 |
using UnityEngine; using System.Collections; public class Debuger { static public bool EnableLog = false; static public void Log(object message) { Log(message,null); } static public void Log(object message, Object context) { if(EnableLog) { Debug.Log(message,context); } } static public void LogError(object message) { LogError(message,null); } static public void LogError(object message, Object context) { if(EnableLog) { Debug.LogError(message,context); } } static public void LogWarning(object message) { LogWarning(message,null); } static public void LogWarning(object message, Object context) { if(EnableLog) { Debug.LogWarning(message,context); } } } |
这样我程序在输出Log的时候,我就不调用Debug.Log()了,我使用我新写的这个类。
1 2 3 4 5 6 7 |
void Start () { Debuger.EnableLog = true; Debuger.Log("雨松MOMO"); } |
但是这样问题又来了,因为我如果直接这样写的话,如下图所示,当我输出Log以后,我在Console窗口中双击Log 这时候代码会定位在Debuger这个类的Log方法,这太麻烦了我需要定位在调用Debuger.log()的方法上。
为了解决这个问题,我们可以把Debuger类做成一个dll,在终端里面输入如下代码 。。
1 2 3 |
mcs -r:/Applications/Unity/Unity.app/Contents/Frameworks/Managed/UnityEngine.dll -target:library ClassesForDLL.cs |
如果你要把多个.cs文件做成一个dll的话,那么在终端里用空格把你的.cs文件分开即可,于是我在终端里面输入,参数 就是我的cs的完整路径。
1 2 3 |
mcs -r:/Applications/Unity/Unity.app/Contents/Frameworks/Managed/UnityEngine.dll -target:library /Users/MOMO/test13/Assets/Debuger.cs |
执行完毕后,会自动的在你脚本的平级路径下生成一个同名的dll文件。 在把Debuger.cs文件删除,保留Debuger.dll就可以了。
如果你的版本正式发布, 你只需找一个合适的地方调用enableLog = true就可以。
1 2 3 |
Debuger.EnableLog = true; |
开始我想的是在Debuger类里面直接用 #if define这样的标签来做,后来我发现很多问题出现在正式版本里,一旦使用预定义标签编译那么除非重新打包不然是觉对看不到LOG。所以干脆就直接用一个静态变量来标记是否打开Log方便。这样可以让服务端做一个密令一类的东西, 正式版也能让客户端把LOG打开。。
如果你确定你的项目不会出问题,不需要运行时产生log.那么最好使用Conditional, 参数就是条件编译的预定义标签,下面的DEBUG 就是在unity projectsetting 里面 声明 预定义标签, 当然你也可以自己去定义这些标签。这样在调用方法的时候就不会去执行 方法体的内容。。
需要引入头文件
using System.Diagnostics;
using System;
1 2 3 4 5 6 7 |
[Conditional ("DEBUG")] static public void Log(object message, Object context) { Debug.Log(message,context); } |
最后我把这个简单的DLL上传一下,大家下载下来就可以直接用了。。或者你也可以按照本文的方法自己来封装。
下载地址: http://pan.baidu.com/s/1ntyoEF3
- 本文固定链接: https://www.xuanyusong.com/archives/2782
- 转载请注明: 雨松MOMO 于 雨松MOMO程序研究院 发表
Debug定位都是定到源代码哪个文件第几行哪个函数等,编译过后函数名行号都灰飞烟灭了(至少学C语言时好像是这么说的),所以它应该会跨过这层定不了的位。不过我想不到这招,我也就是猜猜原因。。。
请问用logcat看android版日志,会发现日志有不完整的情况,就是打印到一半就没了,感觉就像是多线程造成的错乱一样,请问这是什么问题?
没遇到过这个问题。。
android studio 有个log最长字符的判断,貌似2*1024; 需要使用c#,自己读取string长度,分段打印log;
不错,很清晰清晰。
雨松大神 你好~~~”写在前面的话, unity5.3支持了运行时关闭产生的debug.log’您的意思是 UNITY 5.3 运行时会”自动”关闭产生的debug.log吗还是需要到那边关闭呢我是用UNITY5.3 加了PLAYMAKER与POOLMANAGER做了一个跑酷游戏跑起来都还满顺的 唯一的问题是….每跑到20~30秒的时间 游戏就会卡顿一下还有程序跑了几次后 卡顿的时间也会提早…..查看了profiler发现游戏在顿的时候 playakerfsm.update() 里面的logstringtoconsole 或Behaviour 会跑到98% 有时侯还会暴表这个问题困扰了我好久不知是不是 debug.log 造成的问题还是可能有其他可能呢希望能获得雨松大神的指导~~~~~~感激不尽
1.Debug.logger.logEnabled = false; 这一行就可以关闭。。 写在代码初始化的地方就行。2.可能是某一帧里干的事太多了 。。
太感谢您的热心指导了!!!!!!!!!马上来试试 !!!!对了 我用微信扫描本网页那个QRCODE 但跳出来的是一排网点 点进去是支付宝 我没有支付宝 文里有提到微信也可以支付 要如何用微信支付呢我想请大神喝星巴克 哈哈
哈哈 原来在支付宝qrcode下面 就是微信付 可以请大神喝咖啡啦!!!!!!!
感谢, 已经收到
请问 dll解决定位问题的原理是什么?
不错,有理有据
怎么把脚本做成库工程
现在大可不必这么做了,“写在前面的话, unity5.3支持了运行时关闭产生的debug.log”
请教一下产生的LOG文件在手机的哪个目录下
手机上不会把LOG保存在本地。。。
手机上存log到本地有什么方法?
可以写文件 我之前博客写过
请问楼主,你所说的终端是指什么?
mac 上叫终端 就是windows的 cmd
請問那個做DLL的指令在哪打呢
其实定位问题有个更简单的办法,你只有在编辑器中,才需要双击进行定位的问题,且这个时候基本不存在禁用Log的功能,所以可以这样搞定,片段代码如下:public class Debuger { #if UNITY_EDITORpublic static Action<object> Log= Debug.Log;#elsestatic public void Log(object message){Log(message,null);}#endif功能上有点像C 的宏替换。
其实定位问题有个更简单的办法,你只有在编辑器中,才需要双击进行定位的问题,且这个时候基本不存在禁用Log的功能,所以可以这样搞定,片段代码如下:public class Debuger { #if UNITY_EDITORpublic static Action Log= Debug.Log;#elsestatic public void Log(object message){Log(message,null);}#endif功能上有点像C 的宏替换。