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 = 12; 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 = 0; i < objs.Length; ++i) { if (i == 0) { strShowInGui += objs[i].ToString(); } else { strShowInGui += ", " + objs[i].ToString(); } } for (int i = 0; i < m_GuiTextLines.Count; ++i) { if (m_GuiTextLines[i].log == strShowInGui) { m_GuiTextLines[i].AddNum(1); return; } } if (m_GuiTextLines.Count > constMaxNum_ShowInGui) { m_GuiTextLines.RemoveAt(0); } m_GuiTextLines.Add(new strLog(strShowInGui,type,0)); } void WriteLogToFile() { if (false == m_isEnableDebugOut) { return; } if (m_TxtSavetoFile.Count > 0) { 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 = 20; }
4 效果
Demo下载:http://pan.baidu.com/s/1jGBUK3G
转载请注明:细雨淅淅
时间: 2024-11-04 20:57:00