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. Tomcat热部署和虚拟目录配置

    1.Tomcat如何配置热部署 默认就是 <Host appBase="webapps" autoDeploy="true" name="loc ...

  2. Java Hour 22 I/O

    有句名言,叫做10000小时成为某一个领域的专家.姑且不辩论这句话是否正确,让我们到达10000小时的时候再回头来看吧. I/O InputStream, OutStream, Reader, Wri ...

  3. x264_param_t结构体参数分析

    转自:http://blog.chinaunix.net/uid-17053077-id-1987955.html 参考网上的一些资料,结合个人的理解,对x264中x264_param_t结构体作了初 ...

  4. 那些年不错的Android开源项目

    那些年不错的Android开源项目 转载自 eoe 那些年不错的Android开源项目-个性化控件篇 第一部分 个性化控件(View) 主要介绍那些不错个性化的View,包括ListView.Acti ...

  5. HUE的时区问题

    转自 http://molisa.iteye.com/blog/1953390   我主要是根据这个说明调整的HUE的时区问题 在使用Cloudera Hue时遇到一问题: 1. 使用Sqoop导入功 ...

  6. 暴力枚举 UVA 725 Division

    题目传送门 /* 暴力:对于每一个数都判断,是否数字全都使用过一遍 */ #include <cstdio> #include <iostream> #include < ...

  7. MBR 基础

    1.简介 MBR,全称为Master Boot Record,即硬盘的主引导记录,它位于整个硬盘的0磁道0柱面1扇区,其主要对硬盘进行了组织,是在驱动器最前端的一段引导扇区. MBR是不属于任何一个操 ...

  8. ZOJ2587 Unique Attack(判定最小割唯一性)

    看了题解,自己大概想了下. 最小割唯一的充分必要条件是残量网络中所有点要嘛能从源点floodfill到要嘛能floodfill到汇点. 必要性,这是当然的,因为假设从源点floodfill或者从汇点反 ...

  9. Square Coins[HDU1398]

    Square Coins Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Tota ...

  10. python 代码片段15

    #coding=utf-8 ''' 如果运行时发生异常的话,解释器会查找相应的处理函数.要是在当前函数里没有 找到的话,它会将异常传递给上层的调用函数,看看那里能不能处理.如果在在最 外层还没有找到的 ...