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过滤,加标签。

具体就写到这里

转载于:https://www.cnblogs.com/hont/p/3751628.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Unity3DConsole控制台右键功能可以通过编写自定义的Editor扩展来进行添加。以下是添加右键功能的步骤: 1. 创建Editor扩展脚本:在Unity项目创建一个Editor文件夹,然后在文件夹创建一个C#脚本,命名为"ConsoleContextMenu.cs"。 2. 实现OnGUI函数:在ConsoleContextMenu.cs实现OnGUI函数,该函数将在右键菜单显示。以下是一个示例: ```csharp using UnityEditor; using UnityEngine; public class ConsoleContextMenu : Editor { [MenuItem("CONTEXT/LogEntry/Copy Log Message")] private static void CopyLogMessage(MenuCommand menuCommand) { LogEntry logEntry = (LogEntry)menuCommand.context; GUIUtility.systemCopyBuffer = logEntry.message; } private void OnGUI() { if (Event.current.type == EventType.MouseUp && Event.current.button == 1) { GenericMenu menu = new GenericMenu(); menu.AddItem(new GUIContent("Copy Log Message"), false, CopyLogMessage, LogEntries.GetEntryFromInstanceID(Selection.activeInstanceID)); menu.ShowAsContext(); } } } ``` 在上述代码,我们为Console控制台添加了一个"Copy Log Message"的右键菜单选项。当用户右键点击Console控制台的日志条目时,该选项将在右键菜单显示,并且用户可以选择该选项以将日志消息复制到剪贴板。 3. 将Editor扩展脚本添加到项目:将ConsoleContextMenu.cs文件拖放到Editor文件夹,然后保存脚本。 4. 测试右键功能:在Unity编辑器按下Ctrl+Shift+C键打开Console控制台,并在控制台添加一些日志消息。然后右键单击任意日志条目,应该会看到"Copy Log Message"选项在右键菜单显示。 以上是为Unity3DConsole控制台添加右键功能的步骤。您可以根据需要添加其他右键菜单选项,并使用相应的函数来实现它们。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值