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

news2025/5/19 6:57:10

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

文章目录

  • 前言
  • 常用的EditorGUILayout控件
  • 专栏推荐
  • 完结

前言

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

官方文档:EditorGUILayout官方文档

常用的EditorGUILayout控件

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

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,如果学习过程中遇到任何问题,也欢迎你评论私信找我。

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2379101.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Linux基础第三天

系统时间 date命令&#xff0c;date中文具有日期的含义&#xff0c;利用该命令可以查看或者修改Linux系统日期和时间。 基本格式如下&#xff1a; gecubuntu:~$ date gecubuntu:~$ date -s 日期时间 // -s选项可以设置日期和时间 文件权限 chmod命令&#xff0c;是英文…

MoodDrop:打造一款温柔的心情打卡单页应用

我正在参加CodeBuddy「首席试玩官」内容创作大赛&#xff0c;本文所使用的 CodeBuddy 免费下载链接&#xff1a;腾讯云代码助手 CodeBuddy - AI 时代的智能编程伙伴 起心动念&#xff1a;我想做一款温柔的情绪应用 「今天的你&#xff0c;心情如何&#xff1f;」 有时候&#x…

接口——类比摄像

最近迷上了买相机&#xff0c;大疆Pocket、Insta Go3、大疆Mini3、佳能50D、vivo徕卡人像大师&#xff08;狗头&#xff09;&#xff0c;在买配件的时候&#xff0c;发现1/4螺口简直是神中之神&#xff0c;这个万能接口让我想到计算机设计中的接口&#xff0c;遂有此篇—— 接…

二十、案例特训专题3【系统设计篇】web架构设计

一、前言 二、内容提要 三、单机到应用与数据分离 四、集群与负载均衡 五、集群与有状态无状态服务 六、ORM 七、数据库读写分离 八、数据库缓存Memcache与Redis 九、Redis数据分片 哈希分片如果新增分片会很麻烦&#xff0c;需要把之前数据取出来再哈希除模 一致性哈希分片是…

【数据结构与算法】ArrayList 与顺序表的实现

目录 一、List 接口 1.1 List 接口的简单介绍 1.1 常用方法 二、顺序表 2.1 线性表的介绍 2.2 顺序表的介绍 2.3 顺序表的实现 2.3.1 前置条件:自定义异常 2.3.2 顺序表的初始化 2.3.2 顺序表的实现 三、ArrayList 实现类 3.1 ArrayList 的两种使用方式 3.2 Array…

【图像处理基石】OpenCV中都有哪些图像增强的工具?

OpenCV 图像增强工具系统性介绍 OpenCV 提供了丰富的图像增强工具&#xff0c;主要分为以下几类&#xff1a; 亮度与对比度调整 线性变换&#xff08;亮度/对比度调整&#xff09;直方图均衡化自适应直方图均衡化&#xff08;CLAHE&#xff09; 滤波与平滑 高斯滤波中值滤波双…

WPS PPT设置默认文本框

被一个模板折磨了好久&#xff0c;每次输入文本框都是很丑的24号粗体还有行标&#xff0c;非常恶心&#xff0c;我甚至不知道如何描述自己的问题&#xff0c;非常憋屈&#xff0c;后来终于知道怎么修改文本框了。这种软件操作问题甚至不知道如何描述问题本身&#xff0c;非常烦…

PostGIS实现矢量数据转栅格数据【ST_AsRaster】

ST_AsRaster函数应用详解&#xff1a;将矢量数据转换为栅格数据 [文章目录] 一、函数概述 二、函数参数与分组说明 三、核心特性与注意事项 四、示例代码 五、应用场景 六、版本依赖 七、总结 一、函数概述 ST_AsRaster是PostGIS中用于将几何对象&#xff08;如点、线…

FAST-DDS源码分析PDP(一)

准备开一个FAST-DDS源码分析系列&#xff0c;源码版本FAST-DDS 1.1.0版本。 FAST-DDS这种网络中间件是非常复杂的&#xff0c;所以前期先去分析每个类的作用是什么&#xff0c;然后在结合RTPS DOC&#xff0c;FAST-DDS DEMO,以及FAST-DDS的doc去串起来逻辑。 Builtin Discovery…

python打卡day29@浙大疏锦行

知识点回顾 类的装饰器装饰器思想的进一步理解&#xff1a;外部修改、动态类方法的定义&#xff1a;内部定义和外部定义 作业&#xff1a;复习类和函数的知识点&#xff0c;写下自己过去29天的学习心得&#xff0c;如对函数和类的理解&#xff0c;对python这门工具的理解等&…

【数据结构】2-3-1单链表的定义

数据结构知识点合集 知识点 单链表存储结构 优点&#xff1a;不要求大片连续空间&#xff0c;改变容量方便&#xff1b;缺点&#xff1a;不可随机存取&#xff0c;要耗费一定空间存放指针 /*单链表节点定义*/ typedef struct LNode{ElemType data;struct LNode *next; }LNo…

贝塞尔曲线原理

文章目录 一、 低阶贝塞尔曲线1.一阶贝塞尔曲线2. 二阶贝塞尔曲线3. 三阶贝塞尔曲线 一、 低阶贝塞尔曲线 1.一阶贝塞尔曲线 如下图所示&#xff0c; P 0 ​ P_0​ P0​​, P 1 ​ P_1​ P1​​ 是平面中的两点&#xff0c;则 B ( t ) B ( t ) B(t) 代表平面中的一段线段。…

3D个人简历网站 4.小岛

1.模型素材 在Sketchfab上下载狐狸岛模型&#xff0c;然后转换为素材资源asset&#xff0c;嫌麻烦直接在网盘链接下载素材&#xff0c; Fox’s islandshttps://sketchfab.com/3d-models/foxs-islands-163b68e09fcc47618450150be7785907https://gltf.pmnd.rs/ 素材夸克网盘&a…

创建型:原型模式

目录 1、核心思想 2、实现方式 2.1 基本结构 2.2 代码示例&#xff08;Java&#xff09; 3、适用场景 4、new与clone实际场景建议 1、核心思想 目的&#xff1a;通过复制&#xff08;克隆&#xff09;现有对象来创建新对象&#xff0c;而不是通过new关键字实例化。对于那…

Tapered Off-Policy REINFORCE_ 如何为LLM实现稳定高效的策略优化?

Tapered Off-Policy REINFORCE: 如何为LLM实现稳定高效的策略优化&#xff1f; 在大语言模型&#xff08;LLM&#xff09;的微调领域&#xff0c;强化学习&#xff08;RL&#xff09;正成为提升复杂任务性能的核心方法。本文聚焦于一篇突破性论文&#xff0c;其提出的Tapered …

[Java实战]Spring Boot整合Elasticsearch(二十六)

[Java实战]Spring Boot整合Elasticsearch&#xff08;二十六&#xff09; 摘要&#xff1a;本文通过完整的实战演示&#xff0c;详细讲解如何在Spring Boot项目中整合Elasticsearch&#xff0c;实现数据的存储、检索和复杂查询功能。包含版本适配方案、Spring Data Elasticsea…

图像分割(1)U-net

一、整体结构 虽然说是几年前的产品&#xff0c;但是现在还在用&#xff0c;因为深度学习很多时候越是简单的网络用起来效果越好&#xff0c;而且一般是目标比较小的时候产生的分割问题。u-net的优势就是网络结构简单&#xff0c;适合小目标分割&#xff0c;所以一直用到现在&a…

2025抓包工具Reqable手机抓包HTTPS亲测简单好用-快速跑通

前言 自安卓7.0高版本系统不在信任用户证书&#xff0c;https抓包方式市面查找方法太过复杂手机要root等&#xff0c;前置条件要求太高太复杂&#xff0c;看的头痛&#xff0c;今天一台电脑按步骤操作完即可抓包https,给大家搞定抓包https问题。支持直接编辑修改请求参…

使用 Auto-Keras 进行自动化机器学习

使用 Auto-Keras 进行自动化机器学习 了解自动化机器学习以及如何使用 auto-keras 完成它。如今&#xff0c;机器学习并不是一个非常罕见的术语&#xff0c;因为像 DataCamp、Coursera、Udacity 等组织一直在努力提高他们的效率和灵活性&#xff0c;以便将机器学习的教育带给普…

简单使用Slidev和PPTist

简单使用Slidev和PPTist 1 简介 前端PPT制作有很多优秀的工具包&#xff0c;例如&#xff1a;Slidev、revealjs、PPTist等&#xff0c;Slidev对Markdown格式支持较好&#xff0c;适合与大模型结合使用&#xff0c;选哟二次封装&#xff1b;revealjs适合做数据切换&#xff0c…