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[]);
- 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[] { 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[]);
- 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[]);
- }
调用GetEntryInternal取到的Log会返回LogEntry class结构,其中condition是栈跟踪信息。
然后遇到第二个问题,读到的Log信息始终都是最末输出的那个。
查了一下发现是用GetStatusTest()来读的Title,只能读到最后一行,似乎Unity内部输出Debug信息是在另一个线程里,才导致这个问题。
于是对每次得到的Count和上一次的Count值对比重新遍历,以输出所有的信息。
还需要加Count数的改变判断,不会像注册Log回调那样直接给你每条Log
点击具体Log跳转到IDE指定行数,调用这个接口
InternalEditorUtility.OpenFileAtLineExternal(Path, Line);
这样的话,可以做到对Console过滤,加标签。
具体就写到这里
Unity3D中Console控制台的扩展的更多相关文章
- phpStorm如何在Console控制台执行php文本,而不是浏览器中
如何在Console控制台执行php文本 phpStorm默认会在浏览器中执行脚本 默认的配置 配置PHP脚本 扩展,配置项目运行
- eclipse中的Console控制台视图脱离主窗口解决办法
问题:Console控制台视图由于操作不当,跑出来了,脱离了主窗口 解决:在eclipse主窗口最上面的工具条选项中,找到Window,点击里面的Reset Perspective,即可,这样视图就重 ...
- Unity3d中的PlayerPrefs游戏存档API的扩展
功能 在游戏会话中储存和访问游戏存档.这个是持久化数据储存,比如保存游戏记录. 静态函数 DeleteAll Removes all keys and values from the preferen ...
- Node中的console控制台
1. Node中的console类似于浏览器中的控制台console,它的作用在于帮助开发人员做API的辅助测试. 2. Node中的console主要功能:REPL 2.1 read 读取你输入的内 ...
- terminal(终端),shell,tty,console(控制台)区别
原文地址 stackexchange:What is the exact difference between a 'terminal', a 'shell', a 'tty' and a 'con ...
- 【转】Unity3D中脚本的执行顺序和编译顺序
支持原文,原文请戳: Unity3D中脚本的执行顺序和编译顺序 在Unity中可以同时创建很多脚本,并且可以分别绑定到不同的游戏对象上,它们各自都在自己的生命周期中运行.与脚本有关的也就是编译和执行啦 ...
- Windows系统Unity3D中的快捷键
Windows系统Unity3D中的快捷键 组合键 键 功能 File 文件 Ctrl N New Scene 新建场景 Ctrl O Open Scene 打开场景 Ctrl S Sav ...
- Unity3D中简单的C#异步Socket实现
Unity3D中简单的C#异步Socket实现 简单的异步Socket实现..net框架自身提供了很完善的Socket底层.笔者在做Unity3D小东西的时候需要使用到Socket网络通信.于是决定自 ...
- 通过google chrome操作JavaScript中Console
紧接着有关上一个文章的!function................. 前端开发人员一定会用到你的开发者工具中的Console控制台.通常Console用于调试程序,日志输出,打断点等功能.比如我 ...
随机推荐
- bzoj1832: [AHOI2008]聚会--LCA
本来觉得这是一道挺水的题目,后来觉得出题人挺变态的= = 半个小时敲完后,内存超限它给我看TLE,还是0ms,后来才发现内存限制64m 然后卡了一个小时后AC了.. 题目大意是在一棵树上找三点的最短路 ...
- 解决微信浏览器无法使用window.location.reload()刷新页面
解决方法: 使用 window.location.href=window.location.href+随机数 代替 window.location.reload(). function r ...
- 大量查询SQL语句 实例
1.查看表结构语句:DESC 表名 2.查询所有列:select * from 表名 3.查询指定列:select 字段名 form 表名 4.查询指定行:SELECT * ...
- 【iCore3 双核心板_FPGA】实验十四:FSMC总线通信实验——独立地址模式
实验指导书及代码包下载: http://pan.baidu.com/s/1kVJBxJ5 iCore3 购买链接: https://item.taobao.com/item.htm?id=524229 ...
- MVC4脚本压缩 BundleTable bundles 404错误
在发布网站的时候,因为使用了MVC4的新特性BundleTable,造成访问的时候js和css报了404错误, google了以后, 有朋友说是因为要在webservice添加 <modules ...
- SQL ORDER BY 子句
ORDER BY 语句用于对结果集进行排序. ORDER BY 语句 ORDER BY 语句用于根据指定的列对结果集进行排序. ORDER BY 语句默认按照升序对记录进行排序. 如果您希望按照降序对 ...
- fuelux.tree用法
ACE中带了一个树,样式和操作挺好看的,就是难用,下面记录下如何使用. 首先fuelux.tree接受的数据源是Json,关键这个Json还不怎么标准,可接受的Json示例如下: { '刑侦': { ...
- iScroll.js和swiper.js
最近系统地学习了iScroll.js和swiper.js,感觉它们在移动端特别好用:http://www.360doc.com/content/14/0724/11/16276861_39669990 ...
- ActiveMq池
有两种连接方式 1.Spring 引用 <!-- 配置JMS连接工厂 --> <bean id="connectionFactory" class=" ...
- sql操作之修改记录值
mysql修改.删除数据记录 用update修改记录 UPDATE tbl_name SET 要更改的列 WHERE 要更新的记录 这里的 WHERE 子句是可选的,因此如果不指定的话,表中的每个记录 ...