以前说过,可以控制Debug.unityLogger.logEnabled为false来全局控制输出,但是单单使用Debug.Log不好区分模块,也不好单独调试某一模块,一输出就全部输出了,很乱。
下一个就是自己封装Debug,用不同的方法表示不同模块,使用不同的开关控制模块输出,富文本输出不同的颜色区分,但是双击输出会定位到封装。
所以是封装成dll导入,Unity就不会定位到dll里面,而是上一层。但是,修改添加模块困难,所以这里封装成一个可扩展性的Debug管理器。
using UnityEngine; namespace DebugLog { public class MyDebug { public string Name; public string Color; public bool IsCanDebug = true; public MyDebug(string name, string color) { Name = name; Color = color; } public void Log(string mes) { if (IsCanDebug == false) return; string log = string.Format("<color={0}>{1}:</color>{2}", Color, Name, mes); Debug.Log(log); } } }
using System.Collections.Generic; namespace DebugLog { public class DebugManager { public MyDebug Default = new MyDebug("Default", "yellow"); public MyDebug UI = new MyDebug("UI","blue"); public MyDebug Net = new MyDebug("Net", "green"); public MyDebug Error = new MyDebug("Error", "red"); public MyDebug Logic = new MyDebug("Logic", "#FF6633"); private Dictionary<string, MyDebug> dic = new Dictionary<string, MyDebug>(); public DebugManager() { dic.Add(Default.Name, Default); dic.Add(UI.Name, UI); dic.Add(Net.Name, Net); dic.Add(Error.Name, Error); dic.Add(Logic.Name, Logic); } public void AddMyDebug(string name, string color) { if (!dic.ContainsKey(name)) { MyDebug debug = new MyDebug(name, color); dic.Add(name,debug); } } public MyDebug GetMyDebug(string name) { MyDebug debug = Default; if (dic.ContainsKey(name)) { debug = dic[name]; } return debug; } public void OpenAllDebug() { foreach (var i in dic) { i.Value.IsCanDebug = true; } } public void CloseAllDebug() { foreach (var i in dic) { i.Value.IsCanDebug = false; } } public void DebugOnly(string name) { if (!dic.ContainsKey(name)) return; CloseAllDebug(); dic[name].IsCanDebug = true; } } }
尽可能的把有的模块写成成员变量,方便使用时有提示,而不是使用Add后再用一个字符串的名字去获取这个Debug
实在是需要扩展,就可以直接Add再Get,也不需要重新修改导入dll了