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输出控制的更多相关文章

  1. Unity中使用摇杆控制

    Unity中使用摇杆控制 本文章由cartzhang编写,转载请注明出处. 所有权利保留. 文章链接:http://blog.csdn.net/cartzhang/article/details/50 ...

  2. unity中camera摄像头控制详解

    目录 1. 缘起 2. 开发 2.1. 建立项目 2.2. 旋转 2.2.1. 四元数 2.3. 移动 2.3.1. 向量操作 2.4. 镜头拉伸 2.5. 复位 2.6. 优化 1 缘起 我们的产品 ...

  3. unity中添加音量控制的一些步骤

    1.先确认要控制的音源(Audio Source)所使用的输出(Output),例如我这里BGM使用的是MainMixer: 2.暴露音量(Volume)参数,让脚本可以控制.这里如果不暴露出来,脚本 ...

  4. unity中键盘WASD控制。(WS控制物体前后移动,AD控制左右旋转。)

    private float rotateSpeed = 30f; private float movespeed = 5; void FixedUpdate() { //第一种控制移动 float h ...

  5. ios中判断控制台Log输出控制,是否是iphone5,自动调整尺寸

    // 控制台Log输出控制,此确保在release版本下无Log输出 #ifdef DEBUG #define CMBLOG          NSLog #else #define CMBLOG  ...

  6. unity, 对于Debug.Log输出的log,可以双击定位到代码

    unity, 对于Debug.Log输出的log,可以双击定位到代码

  7. PHP中的输出缓冲控制

    在 PHP 中,我们直接进行 echo . 或者 print_r 的时候,输出的内容就会直接打印出来.但是,在某些情况下,我们并不想直接打印,这个时候就可以使用输出缓冲控制来进行输出打印的控制.当然, ...

  8. 在intelllij中debug的时候使用log4j输出

    一般在本地调试的时候,在控制台打印输出都会使用system.out.print,但是在线上运行的时候一般都是使用log4j进行日志输出. 那么在编写代码的时候,又不想写两份,直接写LOG是常规动作. ...

  9. (Unity)Unity自定义Debug日志文件,利用VS生成Dll文件并使用Dotfuscated进展混淆,避免被反编译

    Unity自定义Debug日志文件,利用VS生成Dll文件并使用Dotfuscated进行混淆,避免被反编译. 1.打开VS,博主所用版本是Visual Studio 2013. 2.新建一个VC项目 ...

随机推荐

  1. Java Hour 46 SLF4J

    SLF4J(Simple Logging Facade for Jave). 上个章节在配置启动项目后,会报一个奇怪的错误,一开始以为是Maven 依赖有冲突,其实是和slf4j 密切相关的. 本文原 ...

  2. Android的四大组件

    Android的四大组件:Activity.Service.BroadcastReceiver.Content Provider. Content Provider 属于Android应用程序的组件之 ...

  3. C++的那些事:数据与类型

    一.前言 最近在看C++Primer第5版,先前已经看过第4版,但是发现第5版在整个知识布局与个别知识的讲解上跟第4版差别还是挺大的,尤其是新增了C++11的内容,正如孟岩老师在第5版前言中所讲:“现 ...

  4. jq查找父类元素三个函数的区别

    parent是找当前元素的第一个父节点,parents是找当前元素的所有父节点 parent().parents()与closest()方法两两之间有类似又有不同,本篇简短的区分一下这三个方法.通过本 ...

  5. 记录sqoop同步失败问题解决过程,过程真的是很崎岖。(1月6日解决)

    记录sqoop同步失败问题解决过程,过程真的是很崎岖.事发原因:最近突然出现sqoop export to mysql时频繁出错.看了下日志是卡在某条数据过不去了,看异常.看sqoop生成的mr并未发 ...

  6. 关于LR中的EXTRARES

    LoadRunner脚本之EXTRARES参数 EXTRARES:分隔符,表示标记下一个属性是资源属性的列表(list of resource attributes). [EXTRARES后的资源是由 ...

  7. exec命令

    exec 命令实例 find . -name "*.cc" -exec grep -P -n -H --color=auto "[^\w]main[^\w]" ...

  8. vi-11

    vi编辑器linux命令大全 作者:xiaoru  出处:本站整理  发布时间:2013-04-29 13:20:23 -     vi就是linux命令行下的最著名的编辑器之一,Vim常被称作“程序 ...

  9. LIS HDOJ 1257 最少拦截系统

    题目传送门 题意:中文题面 分析:LIS模板题:n - 最长下降子序列 -> 最长上升子序列 贪心做法以后再补:) 代码: #include <cstdio> #include &l ...

  10. HDU 1045 (DFS搜索)

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1045 题目大意:在不是X的地方放O,所有O在没有隔板情况下不能对视(横行和数列),问最多可以放多少个 ...