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。

  1. using UnityEngine;
  2. using System.Collections;
  3.  
  4. public class Debuger
  5. {
  6. static public bool EnableLog = false;
  7. static public void Log(object message)
  8. {
  9. Log(message, null);
  10. }
  11. static public void Log(object message, Object context)
  12. {
  13. if (EnableLog)
  14. {
  15. Debug.Log(message, context);
  16. }
  17. }
  18. static public void LogError(object message)
  19. {
  20. LogError(message, null);
  21. }
  22. static public void LogError(object message, Object context)
  23. {
  24. if (EnableLog)
  25. {
  26. Debug.LogError(message, context);
  27. }
  28. }
  29. static public void LogWarning(object message)
  30. {
  31. LogWarning(message, null);
  32. }
  33. static public void LogWarning(object message, Object context)
  34. {
  35. if (EnableLog)
  36. {
  37. Debug.LogWarning(message, context);
  38. }
  39. }
  40. }

雨松提供下载的Dll,使用MonoDevelop编译器生成,在VS下可以用,但是会提示Debuger错误。在VS模式下,

(1)可以建议一个C# dll工程,.Net版本设置为3.5(4.0也会提示不兼容,如果MonoDevelop生成,则提示的.Net版本更低)

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

3.2 Unity中的使用

为了实现是否输出、输出位置、输出参数控制以及在界面中不同输出类型的效果、重复代码的检测等等,我顶层有重新进行封装了一下,不过文件的save,没仔细实现,直接代码吧:

  1. using UnityEngine;
  2. using System.Collections;
  3. using System.Collections.Generic;
  4. using System.IO;
  5. using System.Text;
  6.  
  7. public class strLog
  8. {
  9. public string log;
  10. public LogType type;
  11. public uint num;
  12.  
  13. public strLog(string _str, LogType _type, uint _num)
  14. {
  15. log = _str;
  16. type = _type;
  17. num = _num;
  18. }
  19.  
  20. public void AddNum(uint _num)
  21. {
  22. Debug.Log(num);
  23. num += _num;
  24. }
  25. }
  26.  
  27. public class DebuggerManager : MonoBehaviour
  28. {
  29. //打开Debug信息输出
  30. public bool m_isEnableDebugOut = true;
  31.  
  32. //打开界面调试信息输出
  33. public bool m_isEnableShowLogInGui = true;
  34.  
  35. //打开调试堆栈信息输出
  36. public bool m_isEnableShowTraceInfoInGui = false ;
  37.  
  38. //打开调试信息文件记录
  39. public bool m_isEnableSaveInText = false;
  40.  
  41. void Start()
  42. {
  43. if (false == m_isEnableDebugOut)
  44. {
  45. Debuger.EnableLog = false;
  46. return;
  47. }
  48.  
  49. Debuger.EnableLog = true;
  50. Application.RegisterLogCallback(HandleLog);
  51.  
  52. if (false == m_isEnableSaveInText)
  53. return;
  54.  
  55. m_DebugTextPath = Application.persistentDataPath + "/outLog.txt";
  56. if (System.IO.File.Exists(m_DebugTextPath))
  57. {
  58. File.Delete(m_DebugTextPath);
  59. }
  60. }
  61.  
  62. void Update()
  63. {
  64. WriteLogToFile();
  65. }
  66.  
  67. void HandleLog(string logString, string stackTrace, LogType type)
  68. {
  69. if (m_isEnableShowLogInGui)
  70. {
  71. AddToShowList(type,logString);
  72. }
  73.  
  74. if (m_isEnableShowTraceInfoInGui)
  75. {
  76. AddToShowList(type,stackTrace);
  77. }
  78.  
  79. if (m_isEnableSaveInText)
  80. {
  81. AddToSaveList(logString);
  82. }
  83. }
  84.  
  85. void OnGUI()
  86. {
  87. if (!m_isEnableShowLogInGui && !m_isEnableShowTraceInfoInGui)
  88. return;
  89.  
  90. foreach(strLog log in m_GuiTextLines)
  91. {
  92. Color showClr = new Color(0.0f, 0.0f, 0.0f, 1.0f);
  93. if (log.type == LogType.Error)
  94. {
  95. showClr.r = 1.0f;
  96. }
  97. else if (log.type == LogType.Warning)
  98. {
  99. showClr.r = 1.0f;
  100. showClr.g = 1.0f;
  101. }
  102. else if (log.type == LogType.Log)
  103. {
  104. showClr.g = 1.0f;
  105. }
  106.  
  107. GUI.skin.label.normal.textColor = showClr;
  108. GUI.skin.label.fontSize = ;
  109. GUI.skin.label.alignment = TextAnchor.UpperLeft;
  110. GUILayout.Label("【" + log.num.ToString() + "】 -->" + log.log);
  111. }
  112. }
  113.  
  114. public static void AddToShowList(LogType type , params object[] objs)
  115. {
  116. if (!Application.isPlaying)
  117. {
  118. return;
  119. }
  120.  
  121. string strShowInGui = " ";
  122.  
  123. for (int i = ; i < objs.Length; ++i)
  124. {
  125. if (i == )
  126. {
  127. strShowInGui += objs[i].ToString();
  128. }
  129. else
  130. {
  131. strShowInGui += ", " + objs[i].ToString();
  132. }
  133. }
  134.  
  135. for (int i = ; i < m_GuiTextLines.Count; ++i)
  136. {
  137. if (m_GuiTextLines[i].log == strShowInGui)
  138. {
  139. m_GuiTextLines[i].AddNum();
  140. return;
  141. }
  142. }
  143.  
  144. if (m_GuiTextLines.Count > constMaxNum_ShowInGui)
  145. {
  146. m_GuiTextLines.RemoveAt();
  147. }
  148.  
  149. m_GuiTextLines.Add(new strLog(strShowInGui,type,));
  150. }
  151.  
  152. void WriteLogToFile()
  153. {
  154. if (false == m_isEnableDebugOut)
  155. {
  156. return;
  157. }
  158.  
  159. if (m_TxtSavetoFile.Count > )
  160. {
  161. string[] temp = m_TxtSavetoFile.ToArray();
  162. foreach (string t in temp)
  163. {
  164. using (StreamWriter writer = new StreamWriter(m_DebugTextPath, true, Encoding.UTF8))
  165. {
  166. writer.WriteLine(t);
  167. }
  168. m_TxtSavetoFile.Remove(t);
  169. }
  170. }
  171. }
  172.  
  173. public static void AddToSaveList(string strLog)
  174. {
  175. m_TxtSavetoFile.Add(strLog);
  176. }
  177.  
  178. static List<strLog> m_GuiTextLines = new List<strLog>();
  179. static List<string> m_TxtSavetoFile = new List<string>();
  180. private string m_DebugTextPath;
  181. private const int constMaxNum_ShowInGui = ;
  182. }

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基础知识回顾之java Thread类学习(十一)--join方法的理解

    以下面例子说明下面的源码:main 线程 和 A线程,A线程是main线程创建并且启动的,main线程优先级比较高,正在执行:这个时候main线程调用A.join()之后,main线程一直等待,直到A ...

  2. ER-STUDIO 6.5工具使用帮助的中文翻译

    转自于:http://yujingwang.blog.sohu.com/63362979.html 1       资料 ER-STUDIO的帮助(英文) 2       内容 2.1         ...

  3. scp 使用

    [spark-hadoop@master ~]$ sudo scp /etc/profile spark-hadoop@slave1:/etc spark-hadoop@slave1's passwo ...

  4. JAVA中操作符的优先级

    一元数学比较有逻辑 三元赋值就可以! 一元操作符 数学操作符 比较操作符 逻辑操作符 三元操作符 赋值操作符

  5. DP ZOJ 3735 Josephina and RPG

    题目传送门 题意:告诉你C(m,3)个队伍相互之间的胜率,然后要你依次对战n个AI队伍,首先任选一种队伍,然后战胜一个AI后可以选择替换成AI的队伍,也可以不换,问你最后最大的胜率是多少. 分析:dp ...

  6. 水题 ZOJ 3875 Lunch Time

    题目传送门 /* 水题:找排序找中间的价格,若有两个,选价格大的: 写的是有点搓:) */ #include <cstdio> #include <iostream> #inc ...

  7. LightOJ1013 Love Calculator(DP)

    容易猜测到包含s1.s2序列的串的最短长度是LCS(s1,s2) + ( len(s1) - LCS(s1,s2) ) + ( len(s2) - LCS(s1,s2) ) ,即: len(s1)+l ...

  8. Unity3D Built-in Shader详解一

    Unity3D内置了很多Shader,文档很详细,自己翻一下.便于加深印象. 首先先解释下Unity3D的Shader.Unity里面的Shaders是使用一种叫ShaderLab的语言编写的,它同微 ...

  9. 发送JS错误日志到服务器

    JS记录错误日志/捕捉错误 //onerror提供异常信息,文件路径和发生错误代码的行数的三个参数. window.onerror = function(e,url,index){ var msg = ...

  10. 利用pingyin4j 将汉字转换为拼音

    jar包:http://pan.baidu.com/s/11ikCY import net.sourceforge.pinyin4j.PinyinHelper; import net.sourcefo ...