Unity3D中Console控制檯的擴展

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]);
}
View Code

 

調用GetEntryInternal取到的Log會返回LogEntry class結構,其中condition是棧跟蹤信息。

 

而後遇到第二個問題,讀到的Log信息始終都是最末輸出的那個。

查了一下發現是用GetStatusTest()來讀的Title,只能讀到最後一行,彷佛Unity內部輸出Debug信息是在另外一個線程裏,才致使這個問題。

因而對每次獲得的Count和上一次的Count值對比從新遍歷,以輸出全部的信息。

還須要加Count數的改變判斷,不會像註冊Log回調那樣直接給你每條Log

 

點擊具體Log跳轉到IDE指定行數,調用這個接口

InternalEditorUtility.OpenFileAtLineExternal(Path, Line);

 

這樣的話,能夠作到對Console過濾,加標籤。

具體就寫到這裏

相關文章
相關標籤/搜索