编辑器扩展:提升工作效率的秘密武器

编辑器扩展:提升工作效率的秘密武器

编辑器扩展摘要

工欲善其事橙光游戏,必先利其器

简介:在项目开发中,编辑器扩展为开发者提供了开发自定义工具的能力,让开发者更方便的使用编辑器来开发项目。 如果博客中有错误,请随时告诉我。 所有引用的博客或视频来源将显示在文章末尾。

开发版本:Unity 2019.4.9f1

相关博客门户

1.编辑器开发简介

2.编辑器的相关功能

3. 自定义检查器面板

4. 创建编辑器表单

5.Gizmos辅助调试工具

6. 展开场景视图

7.数组或列表集合的显示方法

8. EditorPrefs、ScriptableObject、撤消

9. GUI风格、GUI皮肤

10.AssetPostprocessor资源导入管道

文章目录

创建编辑器表单

Unity 提供了多种创建编辑器表单的方法,开发人员可以为不同的用例创建这些表单。

继承ScriptableWizard类来创建对话框表单

Unity为开发人员提供了一种快速创建对话框表单的简单方法。 它们只需要继承自ScriptableWizard 类。 我们不难发现unity 编辑器扩展,ScriptableWizard其实继承自EditorWindowunity 编辑器扩展,只是进行了一层封装。 此类形式一般用于快捷功能的操作,例如统一修改场景中多个物体的位置等信息。

常用的方法有以下几种:

using UnityEngine;
using UnityEditor;
public class WindowExample1 : ScriptableWizard
{
    public string msg = ""; 
    //显示窗体
    [MenuItem("MyWindow/First Window")]
    private static void ShowWindow()
    {
        ScriptableWizard.DisplayWizard("WindowExample1", "确定", "取消");
    }
    //显示时调用
    private void OnEnable()
    {
        Debug.Log("OnEnable");
    }
    //更新时调用
    private void OnWizardUpdate()
    {
        Debug.Log("OnWizardUpdate");
        if (string.IsNullOrEmpty(msg))
        {
            errorString = "请输入信息内容";//错误提示
            helpString = "";//帮助提示
        }
        else
        {
            errorString = "";
            helpString = "请点击确认按钮";
        }
    }
    //点击确定按钮时调用
    private void OnWizardCreate()
    {
        Debug.Log("OnWizardCreate");
    }
    //点击第二个按钮时调用
    private void OnWizardOtherButton()
    {
        Debug.Log("OnWizardOtherButton");
    }
    //当ScriptableWizard需要更新其GUI时,将调用此函数以绘制内容
    //为GUI绘制提供自定义行为,默认行为是按垂直方向排列绘制所有公共属性字段
    //一般不重写该方法,按照默认绘制方法即可
    protected override bool DrawWizardGUI()
    {
        return base.DrawWizardGUI();
    }
    //隐藏时调用
    private void OnDisable()
    {
        Debug.Log("OnDisable");
    }
    //销毁时调用
    private void OnDestroy()
    {
        Debug.Log("OnDestroy");
    }
}

继承EditorWindow类创建自定义窗体

要创建自定义编辑器窗口橙光游戏,您需要继承EditorWindow类。 它可以自由浮动或作为选项卡停靠,就像 Unity 编辑器中的其他窗口一样。 编辑器窗口通常由菜单项打开,并且通常包含某种类型的功能。 作为编辑器类,需要放在Editor文件夹下。

官方API:EditorWindow

常用的方法有以下几种:

using UnityEngine;
using UnityEditor;
public class WindowExample2 : EditorWindow
{
    private static WindowExample2 window;//窗体实例
    //显示窗体
    [MenuItem("MyWindow/Second Window")] 
    private static void ShowWindow()
    {
        window = EditorWindow.GetWindow("Window Example");
        window.Show();
    }
    //显示时调用
    private void OnEnable()
    {
        Debug.Log("OnEnable");
    }
    //绘制窗体内容
    private void OnGUI()
    {
        EditorGUILayout.LabelField("Your Second Window", EditorStyles.boldLabel);
    }
    //固定帧数调用
    private void Update()
    {
        Debug.Log("Update");
    }
    //隐藏时调用
    private void OnDisable() 
    {
        Debug.Log("OnDisable");
    }
    //销毁时调用
    private void OnDestroy()
    {
        Debug.Log("OnDestroy");
    }
}

继承PopupWindowContent类,创建弹出窗口

用于在编辑器中实现弹出窗口。 弹出窗口类继承自PopupWindowContent类。 当弹出窗口失去焦点时,它会自动关闭。

下面的案例实现了点击表单中的按钮显示弹窗的功能。 第一个脚本定义了一个可以通过按钮打开弹出窗口的编辑器窗口,第二个脚本将弹出窗口本身的内容定义为单独的类。

using UnityEngine;
using UnityEditor;
public class WindowExample3 : EditorWindow
{
    private static WindowExample3 window;
    private PopWindowExample popWindow = new PopWindowExample();
    private Rect buttonRect;
    //显示窗体
    [MenuItem("MyWindow/Third Window")]
    private static void ShowWindow()
    {
        window = EditorWindow.GetWindow("Window Example 3");
        window.Show();
    }
    //绘制窗体内容
    private void OnGUI()
    {
        GUILayout.Label("Popup example", EditorStyles.boldLabel);
        if (GUILayout.Button("Popup Options", GUILayout.Width(200)))
        {
            PopupWindow.Show(buttonRect, popWindow);
        }
        //获取GUILayout最后用于控件的矩形
        if (Event.current.type == EventType.Repaint)
            buttonRect = GUILayoutUtility.GetLastRect();
    }
}
public class PopWindowExample : PopupWindowContent
{
    bool toggle = true;
    //开启弹窗时调用
    public override void OnOpen()
    {
        Debug.Log("OnOpen");
    }
    //绘制弹窗内容
    public override void OnGUI(Rect rect)
    {
        EditorGUILayout.LabelField("PopWindow");
        toggle = EditorGUILayout.Toggle("Toggle", toggle);
    }
    //关闭弹窗时调用
    public override void OnClose()
    {
        Debug.Log("OnClose");
    }
    public override Vector2 GetWindowSize()
    {
        //设置弹窗的尺寸
        return new Vector2(200, 100);
    }
}

参考

弹出窗口

文章来源:https://blog.csdn.net/qq_35361471/article/details/108975020