Assert Store上有一個Editor Console Pro,功能很是全面,百度也能搜到破解。若是有須要建議使用,不要再造車輪ide
起初由於自帶Console功能太弱,有很多能夠提高空間。因而嘗試本身寫,但是寫到後面發現上面那個工具。。大體原理明白以後發上來分享一下。工具
=======================================spa
讀到Log信息,有兩個方法線程
1.Application.RegisterLogCallbackdebug
惋惜是運行時用的,Editor下須要建立一個GameObject綁上運行時腳本,還有一個很嚴重的問題,就是會佔用其餘的回調註冊,或者被佔用而讀不到Log。3d
2.調用內部類LogEntries指針
在看EditorConsolePro源碼時發現它這麼用,很奇怪這個類Unity官方沒徹底開放出來,在UnityEditorInternal.LogEtries下,只能經過反射調用。Unity官方論壇的資料也不多code
-------------------------------------------------------blog
在嘗試第一種方法無果以後,選用第二種方法。接口
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過濾,加標籤。
具體就寫到這裏