Assert Store上有一個Editor Console Pro,功能非常全面,百度也能搜到破解。如果有需要建議使用,不要再造車輪
起初因為自帶Console功能太弱,有不少可以提升空間。於是嘗試自己寫,可是寫到后面發現上面那個工具。。大致原理明白之后發上來分享一下。

=======================================
讀到Log信息,有兩個方法
1.Application.RegisterLogCallback
可惜是運行時用的,Editor下需要創建一個GameObject綁上運行時腳本,還有一個很嚴重的問題,就是會占用其他的回調注冊,或者被占用而讀不到Log。
2.調用內部類LogEntries
在看EditorConsolePro源碼時發現它這么用,很奇怪這個類Unity官方沒完全開放出來,在UnityEditorInternal.LogEtries下,只能通過反射調用。Unity官方論壇的資料也很少
-------------------------------------------------------
在嘗試第一種方法無果之后,選用第二種方法。

ILSpy里稍微看了下
GetCount()可以直接得到Log的總數
bool GetEntryInternal(int,LogEntry) 可以得到詳細的Title和stack信息。
int StartGettingEntries()和void EndGettingEntries()在取值的時候需要調用兩個方法包圍取值代碼,否則會報指針錯誤。
SetConsoleFlag(int,bool)可以屏蔽Warning,Error之類的,和自帶Console一樣。
Clear()也是自帶Console的Clear。
取值代碼如下
string GetSourceText(int row) { var LogEntriesType = typeof(EditorWindow).Assembly.GetType("UnityEditorInternal.LogEntries"); var startGettingEntriesMethod = LogEntriesType.GetMethod("StartGettingEntries", BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic); var endGettingEntriesMethod = LogEntriesType.GetMethod("EndGettingEntries", BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic); startGettingEntriesMethod.Invoke(null, new object[0]); var GetEntryInternalMethod = LogEntriesType.GetMethod("GetEntryInternal", BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic); var logEntryType = typeof(EditorWindow).Assembly.GetType("UnityEditorInternal.LogEntry"); var logEntry = Activator.CreateInstance(logEntryType); //Get detail debug info. GetEntryInternalMethod.Invoke(null, new object[2] { row, logEntry }); //More info please search "UnityEditorInternal.LogEntry" class of ILSPY. var fieldInfo = logEntryType.GetField("condition", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic); var result = fieldInfo.GetValue(logEntry).ToString(); endGettingEntriesMethod.Invoke(null, new object[0]); return result; } int GetCount() { var debugType = typeof(EditorWindow).Assembly.GetType("UnityEditorInternal.LogEntries"); var methodInfo = debugType.GetMethod("GetCount", BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic); return (int)methodInfo.Invoke(null, new object[0]); }

調用GetEntryInternal取到的Log會返回LogEntry class結構,其中condition是棧跟蹤信息。
然后遇到第二個問題,讀到的Log信息始終都是最末輸出的那個。
查了一下發現是用GetStatusTest()來讀的Title,只能讀到最后一行,似乎Unity內部輸出Debug信息是在另一個線程里,才導致這個問題。
於是對每次得到的Count和上一次的Count值對比重新遍歷,以輸出所有的信息。
還需要加Count數的改變判斷,不會像注冊Log回調那樣直接給你每條Log
點擊具體Log跳轉到IDE指定行數,調用這個接口
InternalEditorUtility.OpenFileAtLineExternal(Path, Line);
這樣的話,可以做到對Console過濾,加標簽。
具體就寫到這里
