【unity游戏开发——编辑器扩展】使用EditorGUI的EditorGUILayout绘制工具类在自定义编辑器窗口绘制各种UI控件

注意:考虑到编辑器扩展的内容比较多,我将编辑器扩展的内容分开,并全部整合放在【unity游戏开发------编辑器扩展】专栏里,感兴趣的小伙伴可以前往逐一查看学习。

文章目录

前言

EditorGUI是一个主要用于绘制编辑器拓展 UI 的工具类,主要是绘制编辑器功能中会用到的一些特殊UI控件。EditorGUILayout是一个带有自动布局功能的 EditorGUI 绘制工具类。

官方文档:EditorGUILayout官方文档

常用的EditorGUILayout控件

我就不一一介绍了,直接放出最终例子,大家对照着效果查看就行了。

csharp 复制代码
using UnityEditor;
using UnityEngine;

public class EditorGUIWindow : EditorWindow
{
    int layer;
    string tag;
    Color color;

    public enum E_TestType
    {
        One = 1,
        Two = 2,
        Three = 4,
        One_and_Two = 1 | 2,
    }

    E_TestType type;
    E_TestType mul_type;

    string[] strs = { "选择123", "选择234", "选择345" };
    int[] ints = { 123, 234, 345 };
    int num = 0;

    GameObject gameObj;

    int i;
    int i2;
    float f;
    double d;
    long l;

    string str;
    Vector2 vec2;
    Vector3 vec3;
    Vector4 vec4;

    Rect rect;
    Bounds bounds;
    BoundsInt boundsInt;

    bool isHide;

    bool isHideGroup;

    bool isTog;
    bool isTogLeft;

    bool isTogGroup;
    bool isTog1;
    bool isTog2;

    float fSlider;
    int iSlider;

    float leftV;
    float rightV;

    AnimationCurve curve = new AnimationCurve();

    Vector2 vec2Pos;
    [MenuItem("编辑器拓展/自定义窗口拓展/EditorGUI绘制自定义窗口")]
    private static void OpenEditorGUIWindow()
    {
        EditorGUIWindow win = EditorWindow.GetWindow<EditorGUIWindow>("EditorGUI知识讲解窗口");
        win.Show();
    }

    private void OnGUI()
    {
        // 文本控件
        EditorGUILayout.LabelField("文本标题", "测试内容");
        EditorGUILayout.LabelField("文本内容");

        // 层级标签控件
        layer = EditorGUILayout.LayerField("层级选择", layer);
        tag = EditorGUILayout.TagField("标签选择", tag);

        // 颜色获取控件
        color = EditorGUILayout.ColorField(new GUIContent("自定义颜色获取"), color, true, true, true);

        // 枚举选择
        type = (E_TestType)EditorGUILayout.EnumPopup("枚举选择", type);

        mul_type = (E_TestType)EditorGUILayout.EnumFlagsField("枚举多选", mul_type);

        // 整数选择控件
        num = EditorGUILayout.IntPopup("整数单选框", num, strs, ints);
        EditorGUILayout.LabelField("整数单选框选中值", num.ToString());

        // 按钮
        if (EditorGUILayout.DropdownButton(new GUIContent("下拉按钮"), FocusType.Passive)) Debug.Log("你点击了下拉按钮");
        if (EditorGUILayout.LinkButton("链接按钮")) Debug.Log("你点击了链接按钮");

        //对象关联
        gameObj = EditorGUILayout.ObjectField("关联资源对象", gameObj, typeof(GameObject), false) as GameObject;

        //各类型输入控件
        i = EditorGUILayout.IntField("Int输入框", i);
        EditorGUILayout.LabelField("前面Int输入框内容", i.ToString());
        i2 = EditorGUILayout.DelayedIntField("Int输入框", i2);//Delayed开头的输入控件和普通输入控件的区别:普通输入控件在输入时,会立即响应输入,而Delayed开头的输入控件只有在用户按 Enter 键或将焦点从字段移开之后,返回值才会修改。
        EditorGUILayout.LabelField("前面Int输入框内容", i2.ToString());

        l = EditorGUILayout.LongField("long输入框", l);
        f = EditorGUILayout.FloatField("Float 输入:", f);
        d = EditorGUILayout.DoubleField("double 输入:", d);
        str = EditorGUILayout.TextField("Text输入:", str);
        vec2 = EditorGUILayout.Vector2Field("Vec2输入: ", vec2);
        vec3 = EditorGUILayout.Vector3Field("Vec3输入: ", vec3);
        vec4 = EditorGUILayout.Vector4Field("Vec4输入: ", vec4);
        rect = EditorGUILayout.RectField("rect输入: ", rect);
        bounds = EditorGUILayout.BoundsField("Bounds输入: ", bounds);
        boundsInt = EditorGUILayout.BoundsIntField("Bounds输入: ", boundsInt);

        //折叠控件
        isHide = EditorGUILayout.Foldout(isHide, "折叠控件", false);// 第二个参数为true代表点击整体都能展开收起,为false只能点击前面箭头展开收起
        if (isHide)
        {
            EditorGUILayout.LabelField("折叠文本内容");
            EditorGUILayout.LabelField("折叠文本内容2");
        }

        //折叠组控件
        isHideGroup = EditorGUILayout.BeginFoldoutHeaderGroup(isHideGroup, "折叠组控件");//和折叠的主要区别是折叠组会高亮,且折叠组需要结束组
        if (isHideGroup)
        {
            EditorGUILayout.LabelField("折叠组文本内容");
            EditorGUILayout.LabelField("折叠组文本内容2");
        }
        EditorGUILayout.EndFoldoutHeaderGroup();

        // 开关控件
        isTog = EditorGUILayout.Toggle("开关控件", isTog);
        isTogLeft = EditorGUILayout.ToggleLeft("左侧开关", isTogLeft);

        //开关组控件
        isTogGroup = EditorGUILayout.BeginToggleGroup("开关组控件", isTogGroup);
        isTog1 = EditorGUILayout.Toggle("开关控件1", isTog1);
        isTog2= EditorGUILayout.Toggle("开关控件2", isTog2);
        EditorGUILayout.EndToggleGroup();

        //滑动条控件
        fSlider = EditorGUILayout.Slider("滑动条", fSlider, 0, 10);
        iSlider = EditorGUILayout.IntSlider("整形滑动条", iSlider, 0, 10);

        //双块滑动条控件
        EditorGUILayout.MinMaxSlider("双块滑动条", ref leftV, ref rightV, 0, 10);
        EditorGUILayout.LabelField(leftV.ToString());
        EditorGUILayout.LabelField(rightV.ToString());

        //提示框控件
        EditorGUILayout.HelpBox("一般提示", MessageType.None);
        EditorGUILayout.HelpBox("感叹号提示", MessageType.Info);
        EditorGUILayout.HelpBox("警告符号提示", MessageType.Warning);
        EditorGUILayout.HelpBox("错误符号提示", MessageType.Error);

        //间隔控件
        EditorGUILayout.Space(10);// 间隔控件      
        EditorGUILayout.LabelField("内容1");
        EditorGUILayout.Space(50);// 间隔控件
        EditorGUILayout.LabelField("内容2");

        //动画曲线控件
        curve = EditorGUILayout.CurveField("曲线控件", curve);

        //布局相关API
        EditorGUILayout.BeginHorizontal();// 开始水平布局
        EditorGUILayout.LabelField("水平布局内容");
        EditorGUILayout.LabelField("水平布局内容");
        EditorGUILayout.LabelField("水平布局内容");
        EditorGUILayout.EndHorizontal();// 结束水平布局
        
        EditorGUILayout.BeginVertical();// 开始垂直布局
        EditorGUILayout.LabelField("垂直布局内容");
        EditorGUILayout.LabelField("垂直布局内容");
        EditorGUILayout.LabelField("垂直布局内容");
        EditorGUILayout.EndVertical();// 结束垂直布局

        vec2Pos = EditorGUILayout.BeginScrollView(vec2Pos);// 开启滚动视图
        EditorGUILayout.LabelField("滚动视图内容");
        EditorGUILayout.LabelField("滚动视图内容");
        EditorGUILayout.LabelField("滚动视图内容");
        EditorGUILayout.LabelField("滚动视图内容");
        EditorGUILayout.LabelField("滚动视图内容");
        EditorGUILayout.LabelField("滚动视图内容");
        EditorGUILayout.LabelField("滚动视图内容");
        EditorGUILayout.LabelField("滚动视图内容");
        EditorGUILayout.LabelField("滚动视图内容");
        EditorGUILayout.EndScrollView();// 结束滚动视图
    }
}

效果


专栏推荐

地址
【unity游戏开发入门到精通------C#篇】
【unity游戏开发入门到精通------unity通用篇】
【unity游戏开发入门到精通------unity3D篇】
【unity游戏开发入门到精通------unity2D篇】
【unity实战】
【制作100个Unity游戏】
【推荐100个unity插件】
【实现100个unity特效】
【unity框架/工具集开发】
【unity游戏开发------模型篇】
【unity游戏开发------InputSystem】
【unity游戏开发------Animator动画】
【unity游戏开发------UGUI】
【unity游戏开发------联网篇】
【unity游戏开发------优化篇】
【unity游戏开发------shader篇】
【unity游戏开发------编辑器扩展】

完结

好了,我是向宇,博客地址:https://xiangyu.blog.csdn.net,如果学习过程中遇到任何问题,也欢迎你评论私信找我。

赠人玫瑰,手有余香!如果文章内容对你有所帮助,请不要吝啬你的点赞评论和关注,你的每一次支持都是我不断创作的最大动力。当然如果你发现了文章中存在错误或者有更好的解决方法,也欢迎评论私信告诉我哦!

相关推荐
chxii26 分钟前
5java集合框架
java·开发语言
老衲有点帅35 分钟前
C#多线程Thread
开发语言·c#
C++ 老炮儿的技术栈43 分钟前
什么是函数重载?为什么 C 不支持函数重载,而 C++能支持函数重载?
c语言·开发语言·c++·qt·算法
IsPrisoner1 小时前
Go语言安装proto并且使用gRPC服务(2025最新WINDOWS系统)
开发语言·后端·golang
Python私教1 小时前
征服Rust:从零到独立开发的实战进阶
服务器·开发语言·rust
chicpopoo1 小时前
Python打卡DAY25
开发语言·python
敲代码的 蜡笔小新1 小时前
【行为型之解释器模式】游戏开发实战——Unity动态公式解析与脚本系统的架构奥秘
unity·设计模式·游戏引擎·解释器模式
crazyme_62 小时前
深入掌握 Python 切片操作:解锁数据处理的高效密码
开发语言·python
PascalMing2 小时前
C# 通过脚本实现接口
c#·codeanalysis·接口派生