unity 编辑器 ---获取unity编辑器中的所有窗口,并打开显示,以备后面编辑器扩展

获取原理:unity 所有窗口界面都继承自编辑器UnityEditor程序集下的EditorWindow。而所有的编辑器窗口都在UnityEditor程序集里定义,所以,我们通过反射获取UnityEditor程序集获取所有窗口就可以了。

直接上代码:

using System;
using System.Collections;
using System.Collections.Generic;
using System.Reflection;
using UnityEditor;
using UnityEngine;

class ZzgWindow : EditorWindow
{
    static List<Type> windowList = new List<Type>();
    [MenuItem("TestContextMenu/Open Window")]

    static void Init()
    {
        var window = GetWindow(typeof(ZzgWindow));
        window.titleContent = new GUIContent("ZZG");
        window.position = new Rect(200, 200, 400, 800);
        window.Show();
        windowList = getWindowAll();
    }

    [MenuItem("TestContextMenu/getWindowAll")]

    static void getWindow()
    {
        windowList = getWindowAll();
    }
    /// <summary>
    /// 获取所有窗口类型
    /// </summary>
    /// <returns></returns>
    static List<Type> getWindowAll()
    {
        Assembly assembly = typeof(EditorWindow).Assembly; //获取UnityEditor程序集,当然你也可以直接加载UnityEditor程序集来获取,我这里图方便,具体方法看一下程序集的加载Assembly.Load();
        Type[] types = assembly.GetTypes();
        List<Type> list =new List<Type>();
        for (int i = 0; i < types.Length; i++)
        {
            if (isEditorWindow(types[i]))
            {
                if (types[i].Name == "GameView")
                {
                    Debug.Log(types[i].FullName);
                }

                if (types[i].Name == "SceneView")
                {
                    Debug.Log(types[i].FullName);
                }
                list.Add(types[i]);
            }
            
        }
        list.Sort((a,b)=> { return string.Compare(a.Name, b.Name); });  //排序
        return list;
    }
    /// <summary>
    /// 判断是否是编辑器窗口
    /// </summary>
    /// <param name="type"></param>
    /// <returns></returns>
    static bool isEditorWindow(Type type)
    {
        int i = 0;
        Type temp = type;
        while (null !=temp&&i<10000)
        {
            i++;
            if (temp.BaseType == typeof(EditorWindow))
            {
                return true;
            }
            temp = temp.BaseType;
        }
        return false;
    }
    /// <summary>
    /// 关闭所有窗口
    /// </summary>
    void closeWindowAll()
    {
        for (int i = 0; i < windowList.Count; i++)
        {
            try
            {
                EditorWindow editorWindow = EditorWindow.GetWindow(windowList[i]);
                if (editorWindow)
                {
                    editorWindow.Close();           //关闭窗口
                }
            }
            catch
            {

            }
        }
    }
    void showWindowAll()
    {
        for (int i = 0; i < windowList.Count; i++)
        {
            try
            {
                EditorWindow editorWindow = EditorWindow.GetWindow(windowList[i]);
                if (editorWindow)
                {
                    editorWindow.Show();        //打开窗口
                }
            }
            catch
            {

            }
        }
    }
    /// <summary>
    /// 显示指定类型窗口
    /// </summary>
    /// <param name="type"></param>
    void showWindow(Type type)
    {
        try
        {
            EditorWindow editorWindow = EditorWindow.GetWindow(type);
            if (editorWindow)
            {
                editorWindow.Show();
            }
        }
        catch
        {

        }
    }
    Vector2 pos = new Vector2(0,0);
    void OnGUI()
    {
        if (GUILayout.Button("关闭所有窗口"))
        {
            closeWindowAll();
        }
        //if (GUILayout.Button("打开所有窗口"))
        //{
        //    showWindowAll();
        //}
        pos = GUILayout.BeginScrollView(pos);
        for (int i = 0; i < windowList.Count; i++)
        {
            if (GUILayout.Button(windowList[i].Name))
            {
                showWindow(windowList[i]);
            }
        }
        GUILayout.EndScrollView();
    }
}

代码有注释,不再解释了。editorWindow.Close()关闭窗口。editorWindow.Show()显示窗口

首先关闭所有窗口如下图:界面真干净

然后我们通过点击上面的按钮打开unity自带的窗口:

猜你喜欢

转载自blog.csdn.net/fengya1/article/details/83011103