UnityEditor内置的一些编辑窗口有一些不方便的地方,想改有没有开放的接口,想起ulua用反射机导出了UnityEngine,受了启发,写点东西扒一下UnityEditor.dll。
首先需要ILSpy,在这个工具面前,Unity的c#的代码基本是裸体,想看哪里看哪里~
下载地址
http://ilspy.net/
找到并打开UnityEditor.dll,选中要导出的文件,save code,如果选中的dll本身,可以直接生成c#工程。
之后就是找到关心的类用反射找出方法和类型之类的,写了个例子,不用菜单打开AnimationWindow
class TestClass1
{
[MenuItem("GameObject/aaa")]
static void func()
{
Assembly asm = Assembly.LoadFile(@"C:\Program Files\Unity\Editor\Data\Managed\UnityEditor.dll");
Type t2 = asm.GetType("UnityEditor.CreateBuiltinWindows");
MethodInfo method = t2.GetMethod("ShowAnimationWindow", BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic);
method.Invoke(null, null);
}
[MenuItem("GameObject/bbb")]
static void func2()
{
Assembly asm = Assembly.LoadFile(@"C:\Program Files\Unity\Editor\Data\Managed\UnityEditor.dll");
Type t = asm.GetType("UnityEditor.AnimationWindow");
Resources.FindObjectsOfTypeAll(t);
UnityEngine.Object[] array = Resources.FindObjectsOfTypeAll(t);
EditorWindow editorWindow = (array.Length <= 0) ? null : ((EditorWindow)array[0]);
if (!editorWindow)
{
editorWindow = (ScriptableObject.CreateInstance(t) as EditorWindow);
editorWindow.Show();
}
else
{
editorWindow.Show();
editorWindow.Focus();
}
GameObject go = GameObject.CreatePrimitive(PrimitiveType.Cube);
MethodInfo method = t.GetMethod("EditGameObject");
method.Invoke(editorWindow, new System.Object[] { go });
}
}