前言

第二篇U3D的笔记了,希望能一直坚持写下去。

什么是EditorWindow

EditorWindow就是一种可视化窗口,可以贴在Unity界面的各个位置。比如,我们的场景窗口Scene、游戏窗口Game、资源商店窗口Asset Store、层级窗口Hierarchy等。

Unity自带的窗口毕竟有限,所以如果我们想要自定义自己的工具窗口,就需要用到编辑器扩展。

第一步

首先用UnityEditor库。

using UnityEditor;

之后创建你自己的自定义窗口类,并且继承EditorWindow类。

public class MyWindow : EditorWindow
{
	//这里面是我们接下来要写的
}



几个关键方法

EditorWindow里面有几个很关键的方法,我们需要通过实现这些方法来完成我们的自定义窗口。

当然,我们用到的并不是EditorWindow里面所有的方法(不需要全部用到),想要查看更多方法去官网查即可。


Init(),初始化窗口的方法。这里加上了MenuItem特性,以便在Unity菜单栏中直接打开。

[MenuItem("Tools/新建我的窗口")]
public static void Init()
{
    MyWindow myWindow = EditorWindow.GetWindow(typeof(MyWindow)) as MyWindow;//新建窗口
    myWindow.Show();//显示窗口
}

OnEnable(),窗口显示时会调用的方法。

public void OnEnable()
{
    this.titleContent = new GUIContent("我的窗口");//设置窗口标题
}

OnGUI(),窗口界面。

public void OnGUI()
{
    GUILayout.Label("我是普通框", EditorStyles.boldLabel);//普通框

    num1 = EditorGUILayout.IntField("num1", num1);//int类型填空框
    num2 = EditorGUILayout.FloatField("num2", num1);//float类型填空框
    num3 = EditorGUILayout.IntSlider("num3", num3, 0, 100);//int类型滑块

    if (GUILayout.Button("我是按钮"))
    {
        Debug.Log("我点击了按钮!!");
    }

    if(GUILayout.Button("创建进度条"))//不会强制停止其他操作
    {
        EditorUtility.DisplayProgressBar("我是进度条", "我是内容", num3/100f);
    }

    if(GUILayout.Button("结束进度条"))
    {
        EditorUtility.ClearProgressBar();
    }

    if(GUILayout.Button("显示复杂对话框"))//会强制停止其他操作,直到对话框消失
    {
        int choose = EditorUtility.DisplayDialogComplex("我是对话框标题", "我是对话框内容", "我是OK", "我是CANCEL", "我是ALT");
        switch(choose)
        {
            case 0:
                Debug.Log("我点击了OK");
                break;
            case 1:
                Debug.Log("我点击了CANCEL");
                break;
            case 2:
                Debug.Log("我点击了ALT");
                break;
            default:
                Debug.Log("我啥也没点");
                break;
        }
    }

    if(GUILayout.Button("弹窗"))//这里的弹窗在底下说明
    {
        PopupWindow.Show(GUILayoutUtility.GetLastRect(), new MyPopupWindowContent());
    }
}

代码里面都是一些常用的组件,大家自己动手实践一下很容易的。

弹窗PopupWindow

在上面的OnGUI()方法里面的最后一行,实现了一个弹窗。

其中PopupWindow.Show()方法的第一个参数是Rect类型的,意思是这个弹窗出现的位置;第二个参数是PopupWindowContent类型的,意思是这弹窗的内容。这个PopupWindowContent我们需要自定义一下。

public class MyPopupWindowContent : PopupWindowContent
{
    public override void OnGUI(Rect rect)//弹窗的显示界面
    {
        EditorGUILayout.LabelField("Laaaaaaable");//普通标签
    }

    public override void OnOpen()//打开时调用
    {
        Debug.Log("打开了弹窗");
    }

    public override void OnClose()//关闭时调用
    {
        Debug.Log("关闭了弹窗");
    }

    public override Vector2 GetWindowSize()//弹窗大小
    {
        return new Vector2(200, 300);//弹窗大小
    }
}



小结

自定义的窗口可以让我们更加方便使用自己实现的扩展工具。具体操作以及功能还有很多,这里描述的只是最基本的实现。因为本人也还在学习过程中,所以肯定有很多地方考虑不全,以及会有很多错误。希望有大佬看到能够及时指出,我会立刻进行改正,帮助我自己和大家共同进步!

有问题的小伙伴们可以在下方留言,大家可以一起讨论。