C#反射——掀起Unity Editor面纱
来源:互联网 发布:php环境一键安装包 编辑:程序博客网 时间:2024/06/14 10:45
感觉非常棒的Spy手法,可以拿到更强大的API使用!
原文地址 戳这里。
之前在群里看到有人提到 Profiler Memory Plus这个插件,相当不错~在原来Profiler功能上扩展出了diff功能 非常实用。
然后我就在想这个是怎么做的呢,某天在折腾shader keyword的时候突然灵光一闪,莫非是private API搞的? 动手试了下果然可行。
具体解释一下:Unity引擎底层是用C++写的,但是外围逻辑绝大部分都是C#实现,包括Editor本身。平常我们常见的UnityEngine.dll和UnityEditor.dll里就有大量的宝藏值得挖掘,网上已经有提供了一份UnityDecompiled(当然也可以自己用ILSpy等工具处理)。我个人觉得可以分为两类:
- Undocument API 在代码里可以直接调用,但是并没有在文档里出现
- Private API 无法在代码里直接调用,一般是internal class或者private作用域
但是谁让这些代码是人见人爱的C#代码呢!在编辑器下完全可以使用反射来绕开这个限制。具体来说举个例子,如果我们希望访问到ProfilerWindow里的某个私有变量m_ProfilerWindow
private static List<ProfilerWindow> m_ProfilerWindows = new List<ProfilerWindow>();
完全可以这么写
m_ProfilerWindows = tProfilerWindow.GetField("m_ProfilerWindows", BindingFlags.NonPublic | BindingFlags.Static);IList windows = m_ProfilerWindows.GetValue(null) as IList;
这样直接绕开了internal和private双重限制。在这个思路下,三下五除二就自己实现了想要的功能
最后也不得不提示下这样做的缺点:
- 反射在性能上还是有不少损失的
- 如果Unity升级导致变量名变动等,就会代码出错需要人肉维护…
不过总得来说,作为编辑器扩展非常靠谱,最近用这个思路还折腾了不少事情,譬如设置Material Inspector面板的Reflection Probe/完美抓取shader keyword等。这酸爽感觉就是打开了一个新世界的大门(逃)
阅读全文
0 0
- C#反射——掀起Unity Editor面纱
- Unity Editor(二)C#特性与Editor
- 掀起C++ 11的神秘面纱
- 掀起C++ 11的神秘面纱
- 掀起C++ 11的神秘面纱
- 掀起C++ 11的神秘面纱
- 掀起C++ 11的神秘面纱(1)
- 掀起C++ 11的神秘面纱(2)
- 掀起C++ 11的神秘面纱(3)
- 掀起C++ 11的神秘面纱
- 【Unity】Unity Editor Tips
- 掀起JVM的引擎盖——classloader
- 掀起硬盘主引导扇区的神秘面纱
- 掀起“红盖头”:揭开真正意义的DSP神秘面纱
- 掀起斯柯达速派2.0TSI的神秘面纱
- 掀起“红盖头”:揭开真正意义的DSP神秘面纱
- XML 和 WebSphere Studio Application Developer — 第 6 部分: 使用 XML Schema 和 XML Editor 揭开 XML 名称空间神秘的面纱
- 【Unity 插件】 Shader Editor
- postgresql json查询出来的数据多出来一个双引号的问题
- linux文件系统的系统分析--(一)vfs和数据结构
- SQL 表值函数 做Split用
- Codeforces 582C Superior Periodic Subarrays
- Mac 安装软件时,提示已损坏解决
- C#反射——掀起Unity Editor面纱
- HttpURLConnection用法详解
- Linux 下安装xgboost
- arm交叉编译器gnueabi、none-eabi、arm-eabi、gnueabihf、gnueabi区别
- IPO的条件与要求
- python之自练习小程序(循环)
- maven打包
- 初窥Linux 之 我最常用的20条命令
- 【JavaSE学习笔记】键盘录入Scanner