Unity3D 封 Log

  1 using System;
  2 using System.Text;
  3 using System.Text.RegularExpressions;
  4 using UnityEngine;
  5 #if UNITY_EDITOR
  6 using System.Reflection;
  7 using UnityEditor;
  8 #endif
  9 
 10 public class LogUtil  
 11 {
 12     private static LogLevel logLv = LogLevel.INFO;
 13 
 14     public enum LogLevel : byte
 15     {
 16         NONE        = 0,
 17         INFO        = 1,
 18         WARNING     = 2,
 19         ERROR       = 3,
 20         EXCEPTION   = 4,
 21     }
 22 
 23     public static void Info(object message, UnityEngine.Object sender = null)
 24     {
 25         if (LogLevel.INFO < logLv)
 26             return;
 27         Format(LogLevel.INFO,message,sender);
 28     }
 29 
 30     public static void Warning(object message, UnityEngine.Object sender = null)
 31     {
 32         if (LogLevel.WARNING < logLv)
 33             return;
 34         Format(LogLevel.WARNING, message,  sender);
 35     }
 36 
 37     public static void Error(object message, UnityEngine.Object sender = null)
 38     {
 39         if (LogLevel.ERROR < logLv)
 40             return;
 41         Format(LogLevel.ERROR, message, sender);
 42     }
 43 
 44     public static void Exception(Exception exption, UnityEngine.Object sender = null)
 45     {
 46         if (LogLevel.EXCEPTION < logLv)
 47             return;
 48         Format(LogLevel.EXCEPTION, exption, sender);
 49     }
 50 
 51     public static void Break(object message, UnityEngine.Object sender = null)
 52     {
 53         Info(message, sender);
 54         Debug.Break();
 55     }
 56 
 57     private static void Format(LogLevel lv, object message, UnityEngine.Object sender)
 58     {
 59         StringBuilder sb = new StringBuilder();
 60         sb.AppendFormat("<color={0}>[{1}] {2}</color>", GetColor(lv), lv.ToString(), message);
 61         Debug.Log(sb, sender);
 62     }
 63 
 64     private static string GetColor(LogLevel lv)
 65     {
 66         string str = "#909090";
 67 
 68         if (LogLevel.WARNING == lv)
 69             str = "orange";
 70         else if (LogLevel.ERROR == lv)
 71             str = "red";
 72 
 73         return str;
 74     }
 75 
 76     #if UNITY_EDITOR
 77     [UnityEditor.Callbacks.OnOpenAssetAttribute(0)]
 78     static bool OnOpenAsset(int instanceID, int line) {
 79         string stackTrace = GetStackTrace ();
 80         if (string.IsNullOrEmpty (stackTrace))
 81             return false;
 82 
 83         Match matches = Regex.Match (stackTrace, @"\(at Assets(.+)\)");
 84         while (matches.Success) {
 85             string str = matches.Groups [1].Value;
 86             if (str.Contains ("LogUtil.cs")) {
 87                 matches = matches.NextMatch ();
 88                 continue;
 89             }
 90 
 91             int splitIdx = str.LastIndexOf (":");
 92             string path = str.Substring (0, splitIdx);
 93             Int32.TryParse (str.Substring(splitIdx + 1), out line);
 94             path = Application.dataPath + path;
 95             UnityEditorInternal.InternalEditorUtility.OpenFileAtLineExternal (path.Replace('/', '\\'), line);
 96             return true;
 97         }
 98 
 99         return false;
100     }
101 
102     static string GetStackTrace() {
103         // Get ConsoleWindow
104         Assembly editorWinAssembly = Assembly.GetAssembly(typeof(EditorWindow));
105         Type consoleWinType = editorWinAssembly.GetType("UnityEditor.ConsoleWindow");
106         FieldInfo fieldInfo = consoleWinType.GetField("ms_ConsoleWindow", BindingFlags.Static | BindingFlags.NonPublic);
107         object consoleWin = fieldInfo.GetValue(null);
108         if ((null == consoleWin) || ((object)EditorWindow.focusedWindow != consoleWin))
109             return null;
110 
111         // Get ListViewState in ConsoleWindow
112         Type listViewStateType = editorWinAssembly.GetType ("UnityEditor.ListViewState");
113         fieldInfo = consoleWinType.GetField("m_ListView", BindingFlags.Instance | BindingFlags.NonPublic);
114         object listView = fieldInfo.GetValue (consoleWin);
115 
116         // Get row in ListViewState
117         fieldInfo = listViewStateType.GetField("row", BindingFlags.Instance | BindingFlags.Public);
118 
119         // Get m_ActiveText in ConsoleWindow
120         fieldInfo = consoleWinType.GetField("m_ActiveText", BindingFlags.Instance | BindingFlags.NonPublic);
121         string text = fieldInfo.GetValue (consoleWin).ToString ();
122 
123         return text;
124     }
125     #endif
126 }

 

posted @ 2017-05-26 15:08  tomren  阅读(508)  评论(0编辑  收藏  举报