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 }