Unity3D中Console控制台的擴展


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

 

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

 

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

查了一下發現是用GetStatusTest()來讀的Title,只能讀到最后一行,似乎Unity內部輸出Debug信息是在另一個線程里,才導致這個問題。

於是對每次得到的Count和上一次的Count值對比重新遍歷,以輸出所有的信息。

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

 

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

InternalEditorUtility.OpenFileAtLineExternal(Path, Line);

 

這樣的話,可以做到對Console過濾,加標簽。

具體就寫到這里


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM