写在前面的话, unity5.3支持了运行时关闭产生的debug.log
Debug.logger.logEnabled = false;
在开发Unity的时候,在输出log的时候大家都会采用Debug.log()的方式来输出Log,但是游戏发布的时候这样的Log是不能关闭的,在用户手机运行产生一堆LOG也不是啥好事,一定要关闭才行、主要是unity官方也没有提供直接关闭的方法。
Debug.Log("雨松MOMO");
既然官方没提供方法,那么我们就得自己想办法。于是我写了一个类把Debug.log包了一层。
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()了,我使用我新写的这个类。
void Start ()
{
Debuger.EnableLog = true;
Debuger.Log("雨松MOMO");
}
但是这样问题又来了,因为我如果直接这样写的话,如下图所示,当我输出Log以后,我在Console窗口中双击Log 这时候代码会定位在Debuger这个类的Log方法,这太麻烦了我需要定位在调用Debuger.log()的方法上。
为了解决这个问题,我们可以把Debuger类做成一个dll,在终端里面输入如下代码 。。
mcs -r:/Applications/Unity/Unity.app/Contents/Frameworks/Managed/UnityEngine.dll -target:library ClassesForDLL.cs
如果你要把多个.cs文件做成一个dll的话,那么在终端里用空格把你的.cs文件分开即可,于是我在终端里面输入,参数 就是我的cs的完整路径。
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就可以。
Debuger.EnableLog = true;
开始我想的是在Debuger类里面直接用 #if define这样的标签来做,后来我发现很多问题出现在正式版本里,一旦使用预定义标签编译那么除非重新打包不然是觉对看不到LOG。所以干脆就直接用一个静态变量来标记是否打开Log方便。这样可以让服务端做一个密令一类的东西, 正式版也能让客户端把LOG打开。。
如果你确定你的项目不会出问题,不需要运行时产生log.那么最好使用Conditional, 参数就是条件编译的预定义标签,下面的DEBUG 就是在unity projectsetting 里面 声明 预定义标签, 当然你也可以自己去定义这些标签。这样在调用方法的时候就不会去执行 方法体的内容。。
需要引入头文件
using System.Diagnostics;
using System;
[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程序研究院 发表



其实定位问题有个更简单的办法,你只有在编辑器中,才需要双击进行定位的问题,且这个时候基本不存在禁用Log的功能,所以可以这样搞定,片段代码如下:public class Debuger { #if UNITY_EDITOR public static Action Log= Debug.Log;#else static public void Log(object message) { Log(message,null); }#endif功能上有点像C++的宏替换。
感觉你就是一个人开发者吧,试用了你的方法,首先你没分 warning和 errr已经是有点玄了,感觉都不是搞开发的你,还有就是Action和Dubg.log怎么匹配?雨凇的方法还是不错的
群众的智慧是无穷的,一个是宏,一个是生成dll,都可以学学,但是现在我用的5.33,“写在前面的话, unity5.3支持了运行时关闭产生的debug.log”
#if UNITY_EDITOR public static Action Log = Debug.Log;#else static public void Log(string log) { if (IsDebug) { Debug.Log(log); } }#endif这样搞就可以了,同样的,你也给warning和error加上宏定义就可以了
这么生成的dll确定能应用在移动端么
可以 我们游戏就这么干的。。
为什么官方文档说可以选择性发布编译Debug?
using UnityEngine 你是如何解决的,求dos 完整命令
怎么配置msc命令的环境? 我的提示没有这个命令?
打错是mcs
http://docs.unity3d.com/Manual/UsingDLL.html。看了半天也不知道怎样在windows下封装dll,对c#不了解,是要用Visual Studio么?monodevelop不行么?
不是好像,是肯定消耗性能.上个手机项目写过计时来测试过频繁debug的耗时,结果是明显的.我们也有这样封装debug,只是没想到dll定位.谢谢分享,么么哒!
哈哈。。
http://docs.unity3d.com/Manual/UsingDLL.html。看了半天也不知道怎样在windows下封装dll,对c#不了解,是要用Visual Studio么?monodevelop不行么?
Debug.isDebugBuild不行吗?
momo,你是怎么知道使用dll解决定位问题的?谢谢了,嘿嘿。。。
怎么会想到使用dll解决定位问题?嘿嘿。。。
momoda,什么时候讲一下shader啊,我最近做了一个shader发布到移动端的时候就编程纯黑色,貌似移动端不支持。void surf (Input IN, inout SurfaceOutput o) {o.Albedo=10;} 我就弄了个基本的表皮着色。pc发布时候正常,发布到手机就不行。找不到原因哎
momoda,什么时候讲一下shader啊,我最近做了一个shader发布到移动端的时候就编程纯黑色,貌似移动端不支持。void surf (Input IN, inout SurfaceOutput o) { o.Albedo=10; } 我就弄了个基本的表皮着色。pc发布时候正常,发布到手机就不行。找不到原因哎
mom,我还是没有看懂呗
if (Debug.isDebugBuild) { Debug.Log (“This is a debug build!”);} 这样其实也可以,只是比较麻烦…
楼主,在NGUI里碰到个问题,新版有个UIPlayAnimation,应该是用来在UI里播放动画的。研究了下找不到怎么使用。有空帮看下哈!
Debuger类做成一个dll,在终端里面输入如下代码.这个不是很懂啊。终端是指什么?如何做成dll啊?
额,,楼主原来是苹果机。。。。。
没想到可以利用dll解决定位问题,谢谢分享
大神,能不能讲些unity读取数据库中图片的知识啊。。。
用dll的方法解决了双击定位的问题,太牛了。我是用Console Pro的,但还是没有大牛的方法好。