unity中Debug输出控制
1 需求:
(1)选择在界面、console中输出,并且能够设置保存到文档
(2)控制debug是否输出,可以在debug模式下输出,release模式下不输出
2 参考:
谢谢雨松同学的博客:http://www.xuanyusong.com/archives/2782 , 雨松飞天般的想法实在太奇妙了,虽然我现在还没有理解里面的原理。雨松把debug类常用函数封装在debuger类中,然后通过封装DLL的方式解决Log输出后的定位的问题。
3 方案:
3.1 Dll生成
Debug输出控制类Debuger,通过EnableLog 控制书否输出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);
}
}
}
雨松提供下载的Dll,使用MonoDevelop编译器生成,在VS下可以用,但是会提示Debuger错误。在VS模式下,
(1)可以建议一个C# dll工程,.Net版本设置为3.5(4.0也会提示不兼容,如果MonoDevelop生成,则提示的.Net版本更低)

(2)引入unityEngine.dll库,不然你编译不过,OK ,然后编译一下就好了。

3.2 Unity中的使用
为了实现是否输出、输出位置、输出参数控制以及在界面中不同输出类型的效果、重复代码的检测等等,我顶层有重新进行封装了一下,不过文件的save,没仔细实现,直接代码吧:
using UnityEngine;
using System.Collections;
using System.Collections.Generic;
using System.IO;
using System.Text; public class strLog
{
public string log;
public LogType type;
public uint num; public strLog(string _str, LogType _type, uint _num)
{
log = _str;
type = _type;
num = _num;
} public void AddNum(uint _num)
{
Debug.Log(num);
num += _num;
}
} public class DebuggerManager : MonoBehaviour
{
//打开Debug信息输出
public bool m_isEnableDebugOut = true; //打开界面调试信息输出
public bool m_isEnableShowLogInGui = true; //打开调试堆栈信息输出
public bool m_isEnableShowTraceInfoInGui = false ; //打开调试信息文件记录
public bool m_isEnableSaveInText = false; void Start()
{
if (false == m_isEnableDebugOut)
{
Debuger.EnableLog = false;
return;
} Debuger.EnableLog = true;
Application.RegisterLogCallback(HandleLog); if (false == m_isEnableSaveInText)
return; m_DebugTextPath = Application.persistentDataPath + "/outLog.txt";
if (System.IO.File.Exists(m_DebugTextPath))
{
File.Delete(m_DebugTextPath);
}
} void Update()
{
WriteLogToFile();
} void HandleLog(string logString, string stackTrace, LogType type)
{
if (m_isEnableShowLogInGui)
{
AddToShowList(type,logString);
} if (m_isEnableShowTraceInfoInGui)
{
AddToShowList(type,stackTrace);
} if (m_isEnableSaveInText)
{
AddToSaveList(logString);
}
} void OnGUI()
{
if (!m_isEnableShowLogInGui && !m_isEnableShowTraceInfoInGui)
return; foreach(strLog log in m_GuiTextLines)
{
Color showClr = new Color(0.0f, 0.0f, 0.0f, 1.0f);
if (log.type == LogType.Error)
{
showClr.r = 1.0f;
}
else if (log.type == LogType.Warning)
{
showClr.r = 1.0f;
showClr.g = 1.0f;
}
else if (log.type == LogType.Log)
{
showClr.g = 1.0f;
} GUI.skin.label.normal.textColor = showClr;
GUI.skin.label.fontSize = ;
GUI.skin.label.alignment = TextAnchor.UpperLeft;
GUILayout.Label("【" + log.num.ToString() + "】 -->" + log.log);
}
} public static void AddToShowList(LogType type , params object[] objs)
{
if (!Application.isPlaying)
{
return;
} string strShowInGui = " "; for (int i = ; i < objs.Length; ++i)
{
if (i == )
{
strShowInGui += objs[i].ToString();
}
else
{
strShowInGui += ", " + objs[i].ToString();
}
} for (int i = ; i < m_GuiTextLines.Count; ++i)
{
if (m_GuiTextLines[i].log == strShowInGui)
{
m_GuiTextLines[i].AddNum();
return;
}
} if (m_GuiTextLines.Count > constMaxNum_ShowInGui)
{
m_GuiTextLines.RemoveAt();
} m_GuiTextLines.Add(new strLog(strShowInGui,type,));
} void WriteLogToFile()
{
if (false == m_isEnableDebugOut)
{
return;
} if (m_TxtSavetoFile.Count > )
{
string[] temp = m_TxtSavetoFile.ToArray();
foreach (string t in temp)
{
using (StreamWriter writer = new StreamWriter(m_DebugTextPath, true, Encoding.UTF8))
{
writer.WriteLine(t);
}
m_TxtSavetoFile.Remove(t);
}
}
} public static void AddToSaveList(string strLog)
{
m_TxtSavetoFile.Add(strLog);
} static List<strLog> m_GuiTextLines = new List<strLog>();
static List<string> m_TxtSavetoFile = new List<string>();
private string m_DebugTextPath;
private const int constMaxNum_ShowInGui = ;
}
4 效果

Demo下载:http://pan.baidu.com/s/1jGBUK3G
转载请注明:细雨淅淅
unity中Debug输出控制的更多相关文章
- Unity中使用摇杆控制
Unity中使用摇杆控制 本文章由cartzhang编写,转载请注明出处. 所有权利保留. 文章链接:http://blog.csdn.net/cartzhang/article/details/50 ...
- unity中camera摄像头控制详解
目录 1. 缘起 2. 开发 2.1. 建立项目 2.2. 旋转 2.2.1. 四元数 2.3. 移动 2.3.1. 向量操作 2.4. 镜头拉伸 2.5. 复位 2.6. 优化 1 缘起 我们的产品 ...
- unity中添加音量控制的一些步骤
1.先确认要控制的音源(Audio Source)所使用的输出(Output),例如我这里BGM使用的是MainMixer: 2.暴露音量(Volume)参数,让脚本可以控制.这里如果不暴露出来,脚本 ...
- unity中键盘WASD控制。(WS控制物体前后移动,AD控制左右旋转。)
private float rotateSpeed = 30f; private float movespeed = 5; void FixedUpdate() { //第一种控制移动 float h ...
- ios中判断控制台Log输出控制,是否是iphone5,自动调整尺寸
// 控制台Log输出控制,此确保在release版本下无Log输出 #ifdef DEBUG #define CMBLOG NSLog #else #define CMBLOG ...
- unity, 对于Debug.Log输出的log,可以双击定位到代码
unity, 对于Debug.Log输出的log,可以双击定位到代码
- PHP中的输出缓冲控制
在 PHP 中,我们直接进行 echo . 或者 print_r 的时候,输出的内容就会直接打印出来.但是,在某些情况下,我们并不想直接打印,这个时候就可以使用输出缓冲控制来进行输出打印的控制.当然, ...
- 在intelllij中debug的时候使用log4j输出
一般在本地调试的时候,在控制台打印输出都会使用system.out.print,但是在线上运行的时候一般都是使用log4j进行日志输出. 那么在编写代码的时候,又不想写两份,直接写LOG是常规动作. ...
- (Unity)Unity自定义Debug日志文件,利用VS生成Dll文件并使用Dotfuscated进展混淆,避免被反编译
Unity自定义Debug日志文件,利用VS生成Dll文件并使用Dotfuscated进行混淆,避免被反编译. 1.打开VS,博主所用版本是Visual Studio 2013. 2.新建一个VC项目 ...
随机推荐
- SQL with as
姓名 课程 分数 张三 语文 张三 数学 张三 物理 李四 语文 李四 数学 李四 物理 先看下面一个嵌套的查询语句 ) 上面的查询语句使用了一个子查询.虽然这条SQL语句并不复杂,但如果嵌套的层次过 ...
- MySQL错误:Every derived table must have its own alias
Every derived table must have its own alias 派生表都必须有自己的别名 一般在多表查询时,会出现此错误. 因为,进行嵌套查询的时候子查询出来的的结果是作为一个 ...
- Linux内核NAPI机制分析
转自:http://blog.chinaunix.net/uid-17150-id-2824051.html 简介:NAPI 是 Linux 上采用的一种提高网络处理效率的技术,它的核心概念就是不采用 ...
- Linux下的原子操作
linux支持的哪些操作是具有原子特性的?知道这些东西是理解和设计无锁化编程算法的基础. __sync_fetch_and_add系列的命令,发现这个系列命令讲的最好的一篇文章,英文好的同学可以直接去 ...
- Java Hour 41 Maven ( 3 )
有句名言,叫做10000小时成为某一个领域的专家.姑且不辩论这句话是否正确,让我们到达10000小时的时候再回头来看吧. 41.1 m2eclipse 简介 m2eclipse 是一款开源工具,为ec ...
- hdu 4185 二分图匹配
题意用1*2的木板覆盖矩阵中的‘#’,(木板要覆盖的只能是‘#’),问最多能用几个木板覆盖 将#抽象为二分图的点,一个木板就是一个匹配,注意最后结果要除以2 Sample Input 1 6 .... ...
- Java Serializable(序列化)
1.序列化是干什么的? 简单说就是为了保存在内存中的各种对象的状态(也就是实例变量,不是方法),并且可以把保存的对象状态再读出来.虽然你可以用你自己的各种各样的方法来保存object states,但 ...
- 在CentOS 6上搭建私有的Docker Registry
在CentOS 6上搭建私有的Docker Registry v2Registry概念 :Registry是一个无状态的, 高可扩展的服务器端应用程序, 用于存储和分发Docker Image. 依赖 ...
- php数据库操作封装类
<?php /** * Desc: php操作mysql的封装类 * Author zhifeng * Date: 2015/04/15 * 连接模式:PDO */ class MMysql { ...
- Java正则表达式, 提取双引号中间的部分
String str="this is \"Tom\" and \"Eric\", this is \"Bruce lee\", ...