当前位置: 首页 > backend >正文

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

注意:考虑到编辑器扩展的内容比较多,我将编辑器扩展的内容分开,并全部整合放在【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);//布局相关APIEditorGUILayout.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.xdnf.cn/news/6070.html

相关文章:

  • 高速数字测试利器,新款是德科技UXR0504B示波器
  • RPA vs. 传统浏览器自动化:效率与灵活性的终极较量
  • STM32 片上资源之串口
  • 《实现模式》以Golang视角解读 价值观和原则 day 1
  • 快速定位到源码位置的插件 - vite/webpack
  • 【Python】普通方法、类方法和静态方法的区分
  • hbase shell的常用命令
  • 双目云台摄像机:双摄安防功能全方位
  • Java运行原理分析
  • LeetCode 热题 100 114. 二叉树展开为链表
  • Spring的bean的生命周期?
  • 【机器学习】支持向量回归(SVR)从入门到实战:原理、实现与优化指南
  • 各大编程语言基本语法区别
  • 游戏引擎学习第279天:将实体存储移入世界区块
  • 为什么 Linux 上默认没有 host.docker.internal
  • 【内网渗透】——NTML以及Hash Relay
  • MySQL Explain 中 Type 与 Extra 字段详解
  • MySQL 服务器配置和管理(上)
  • 监听用户切换浏览器标签页,切换回页面刷新页面
  • 代码随想录算法训练营第60期第三十五天打卡
  • 嵌入式自学第二十天(5.13)
  • AIStarter新功能上线:模型管理与创作者收益系统全面升级,助力AI开发效率提升
  • 函数定义、 异常处理、 迭代器协议、内置函数、返回值
  • WiFi密码查看器打开软件自动获取数据
  • 通用Agent如何评估效果:智能体评测方案AgentCLUE-General(Manus暂时领先)
  • 人形机器人的 9 个分岔口
  • 图灵爬虫练习平台 第十四题 逆向
  • 一款倒计时结束强制关闭浏览器的插件
  • 可视化图解算法38:重建二叉树
  • C++标准流详解:cin/cout的绑定机制与cerr/clog的缓冲差异