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. C++基础内容复习

    下列语句定义了5个变量: int count; double sales_price,sum; std::string title; Sales_item bookItem; 每个定义都是以类型说明符 ...

  2. SVN服务器搭建和使用(三)(转载)

    转载地址:http://www.cnblogs.com/xiaobaihome/archive/2012/03/20/2408089.html 接下来,试试用TortoiseSVN修改文件,添加文件, ...

  3. 如何解决adb devices 端口被占用的问题zz

    在win xp ,win 7 上使用adb时, 越来越多的人出现了 adb devices 命令长时间无响应.adb start-server 失败.eclipse adt初始化时卡在dbms-ini ...

  4. 最新版Duilib在VS2012下编译错误的解决方法

            svn了好几次最新版本的项目源代码, 在VS2012下编译老是出错, 改了后没记录, 结果又忘记, 所以在此记录下.        这个问题很普遍, 非常多的人遇到.       至于 ...

  5. PHP5.3 goto操作符介绍

    goto操作符是PHP5.+后新增功能,用来跳转到程序的另一位置:用法很简单:goto后面带上目标位置的标志,在目标位置上用目标名加冒号标记如下: <?php goto a; echo 'aaa ...

  6. MS SQL SERVER 2000 常用 Tran-SQL 语句

    一.创建数据库:create database mydb-创建数据库mydbon primary-在primary文件组中( name = mydb_data1,filename = 'd:\sql ...

  7. iOS Simulator功能介绍关于Xamarin IOS开发

    iOS Simulator功能介绍关于Xamarin IOS开发 iOS Simulator功能介绍 在图1.38所示的运行效果中,所见到的类似于手机的模型就是iOS Simulator.在没有iPh ...

  8. 阿里云DRDS:分布式数据库服务

    最近在做阿里云相关的项目,用到阿里的很多接口服务的API,于是想把这段项目做个总结,顺便梳理下阿里云的云计算的相关知识点. DRDS:分布式数据库服务. 1.相关术语 DRDS(Distribute  ...

  9. 简单几何(线段相交) POJ 2826 An Easy Problem?!

    题目传送门 题意:两条线段看成两块木板,雨水从上方往下垂直落下,问能接受到的水的体积 分析:恶心的分类讨论题,考虑各种情况,尤其是入口被堵住的情况,我的方法是先判断最高的两个点是否在交点的同一侧,然后 ...

  10. Log4net源码View之Logger解析

    1.简介 Logger是Log4net的三大核心载体之一,搞清楚它的意义很重大.另外两个分别是Appender和Layout.其对应关系为一个Logger对应多个Appender,一个Appender ...