使用C#反射机制从UnityEditor扒东西

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 });
    }
}

猜你喜欢

转载自blog.csdn.net/songchao_xx/article/details/78637467