Unity3D Editor 扩展
官方教程:链接
EditorLayout API:链接
Handles API:链接
1.首先来个Inspector面板Editor的实现
要实现一个组件在Inspector中的Editor功能,首先需要写一个编辑器类:
要点:
1.继承Editor
2.放在Editor文件夹中
3.在类的头部写[CustomEditor(typeof(你要实现编辑的组件的类名))]
4.复写OnInspectorGUI函数(此函数仅在Inspector刷新时自动调用),然后在函数里实现编辑器功能的拓展实现。例如GUILayout.Label("Hello World");
5.通过target as ‘你的类名’ 来实现引用你要扩展的组件的类的具体对象。
2.GUILayoutOption
EditorGUILayout 与 EditorGUI功能基本差不多,它是EditorGUI的自动布局版本,用它可以快速创建默认UI,若要自定义UI样式,应该使用EditorGUI并传入GUIStyle等参数
GUILayoutOption是一种GUI布局方式的设置,常在GUILayout的具体控件中看到,
例如,
的最后一个参数便是一些GUILayoutOption不定参,表示可以有多个设置方案。
注意:GUILayoutOption只是表示是设置方案的意思,并不是代表有GUILayoutOption这种设置方法,GUILayoutOption其实是个空类,
具体的设置方案由具体决定。
例如:
GUILayout.Label("Hello World"), EditorStyles.helpBox);
GUILayout.Label("Hello World")表示在面板上显示一条内容为“Hello World”的Label,(下图第一条)
而EditorStyles.helpBox则表示此Label的显示方式是以帮助框的形式显示(下图第二条)
更多的GUILayoutOption:
EditorStyles.boldLabel
EditorStyles.centeredGreyMiniLabel
EditorStyles.radioButton
EditorStyles.whiteBoldLabel
3.GUILayout 之 SelectionGrid
设置一个网格按钮,并返回按钮的序号。
string[] text = { "1", "2", "3", "4" };
Debug.Log(GUILayout.SelectionGrid(-1, text, 2) + " has been choose.");
按钮可以是文字(上面的1,2,3,4四个按钮),也可以是图片等。
第一参数的-1表示按钮哪个被按下,如果为0,则表示第一按钮显示为被按下,-1表示没有。
第三个参数的2表示此网格分为2列,具体如图:
4.折页
首先用这句:
showState = EditorGUILayout.Foldout(showState, "State List"); 参数分别为是否打开,显示标签的名字
其实折页就相当于一个toggle按钮,并不做任何事,只是你按下它,它会返回一个是否折开或者合并的结果,
然后自己再根据这个结果显示对应内容来达到折页效果。
if (showState) {GUILayout.Label("内容", EditorStyles.inspectorDefaultMargins); }// 为了模拟折页后的子层级的树状缩进结构,我门用EditorStyles.inspectorDefaultMargins这中设置来将内容向右缩进。
5.自定义自己的GUIStyle
在2中我们知道了如何用GUIStyle扩展GUILayout的各种控件的样式,但我们用的都是EditorStyles附带的风格,
这个EditorStyles是系统用的,我们只能用里面的风格,不能修改(其实也可以改,但改后会将系统其他所以使用该风格的地方都改)。
为了定制我们自己的风格,其实我们可以自己创建一个GUIStyle。
GUIStyle topStyle = new GUIStyle(EditorStyles.centeredGreyMiniLabel); // 这里我用EditorStyles的centeredGreyMiniLabel来初始化我的新风格 topStyle.fontStyle = FontStyle.Bold; // 新Style的字体为粗体 topStyle.fontSize = 20; topStyle.richText = true; // 允许富文本
6.再来个Scene面板的Editor实现
基本与Inspector面板Editor的写法一样,只不过Scene面板的更新函数是OnSceneGUI,与之对应的是
Inspector面板的更新函数OnInspectorGUI。
甚至可以在同一个脚本里同时实现Inspector与Scene面板的Editor功能。
要点:
1.在OnSceneGUI()中只能通过Handles来绘制新视图,如果你想引入GUI的元素哪么就需要使用BeginGUI()和EndGUI()组合的使用。
2.同Inspector一样,仅在持有该脚本的对象被选择时才激活。
eg:
void OnSceneGUI() {//得到test脚本的对象Test test = (Test) target;//在Scene视图中,在该对象本身的位置画一个坐标轴,但画自身坐标轴的意义不大,因为自身坐标轴在被选中时本来就会画出来。但可以用来显示其他对象的坐标轴。 Handles.PositionHandle(fsm.test.transform.position, Quaternion.identity);//在场景中GameObject所在的位置绘制文本框,内容为该GO的坐标Handles.Label(test.transform.position + Vector3.up*2, test.transform.name +" : "+ test.transform.position.ToString() );//开始绘制GUI Handles.BeginGUI();//规定GUI显示区域GUILayout.BeginArea(new Rect(100, 100, 100, 100));//GUI绘制一个按钮if(GUILayout.Button("这是一个按钮!"))Debug.Log("test");//GUI绘制文本框GUILayout.Label("我在编辑Scene视图"); GUILayout.EndArea();Handles.EndGUI();}
7.利用Gizmos在Editor里绘制图形
Gizmos是常见的DebugDraw方式之一,可方便地在Editor里绘制线段,射线,方块之类的
用法:Gizmos只能用于OnDrawGizmos函数里,该函数跟Start,Update一样会自动调用
但是一般情况下,绘制函数里的参数只有'center','size'之类的,绘制出来的图形是没有角度的,
如果有需要绘制旋转过的图形,例如一个跟随摄影机旋转的Cube
那么就需要利用Gizmos的重要参数——matirx,
这是Gimos的绘制矩阵,绘制的图形信息在这里,要缩放,旋转Gizmos绘制出来的图形,
只需要改变矩阵即可。
void OnDrawGizmos(){Vector3 size = new Vector3(half.x * 2, half.y * 2, half.z * 2);// 变换矩阵Matrix4x4 trs = Matrix4x4.TRS(transform.position, transform.rotation, transform.localScale);Gizmos.matrix = trs;// 在该Transform的Vector3.zero处绘制一个位置、角度、缩放均与该Transform一样的方块,大小为size Gizmos.DrawCube(Vector3.zero, size);// 复位Gizmos设置Gizmos.matrix = Matrix4x4.identity;}
8.Editor菜单栏快捷键
%代表 Ctrl
#代表 Shift
9.手动将Scene标志为“修改过的”
有时候会动态在Editor脚本里创建对象在Scene里,但是动态创建之后Scene默认是认为场景没被修改过的,
这个时候是没法保存场景的,就算你强制Ctrl + S,重载场景后之前动态生成的对象也会丢失(除非你在生成对象后,又手动在场景里做一些修改)
那么我需要手动调用场景管理器里的一个方法,将当前所有打开的场景标志为“脏的”,即被改动过的,这个时候在就可以Ctrl + S保存了。
EditorSceneManager.MarkAllScenesDirty();
同理,如果你通过代码改过资源,那么也需要手动调用AssetDatabase.Refresh 刷新下编辑器。
转载于:https://www.cnblogs.com/jeason1997/p/5109541.html
Unity3D Editor 扩展相关推荐
- Unity3D Editor 编辑器扩展3 Editor脚本
Unity3D Editor 编辑器扩展3 Editor脚本 环境:Unity2017.2 语言:C# 总起: 在编辑Unity项目的时候,总不可能避免的接触到Unity自身自带的Inspector参 ...
- 【Unity3D编辑器扩展】Unity3D中实现Text的字体的替换
推荐阅读 CSDN主页 GitHub开源地址 Unity3D插件分享 简书地址 我的个人博客 大家好,我是佛系工程师☆恬静的小魔龙☆,不定时更新Unity开发技巧,觉得有用记得一键三连哦. 一.前言 ...
- 【Unity3D Editor】导入图片自动转换成Sprite
[Unity3D Editor]导入图片自动转换成Sprite https://blog.csdn.net/july_unity/article/details/79275097 一,导入 1,无论是 ...
- Unity3D之Editor扩展学习——四大名捕闹京东
Unity3D提供了强大的编辑器扩展机制,在项目开发中,如果可以将一些繁琐的工作放在编辑器扩展中进行,则会大大提高效率.本文对编辑器扩展进行了一些总结,希望对有兴趣编写编辑器扩展的开发人员有所帮助.当 ...
- Unity3D Editor 编辑器扩展2 选取物体、撤销操作和窗口小部件的显示
环境:Unity2017.2 语言:C# 总起: 今天主要介绍以下内容: 1.通过MenuCommand.Selection获取选中对象: 2.通过Undo编写可撤销的命令: 3.窗口小部件的显示. ...
- Unity3D 编辑器扩展 跳转显示指定目录
做编辑器扩展开发时,假如我们生成一个文件到Assets之外的目录,要查看它的时候,需要从系统路径一步步打开到那个目录. Unity给我们提供了一个API可以直接打开指定目录,类似Project窗口右键 ...
- Unity3D编辑器扩展--自定义创建圆锥体
前言 这几天琢磨着开发个个人作品的时候,发现原来Unity3D官方没有提供圆锥体的创建功能,就自己做了个编辑器扩展.鉴于之前搜索Mesh编程的时候很少有博客把自己的算法讲清楚,这里我抛砖引玉,尽我所能 ...
- 【Unity3D编辑器扩展】Unity3D中实现UI界面控制,UI界面的显示和隐藏实现
推荐阅读 CSDN主页 GitHub开源地址 Unity3D插件分享 简书地址 我的个人博客 QQ群:1040082875 大家好,我是佛系工程师☆恬静的小魔龙☆,不定时更新Unity开发技巧,觉得有 ...
- unity3D编辑器扩展
编辑器扩展只是在编辑项目中运行,发布出来是不会运行的. 固定创建一个文件夹Editor:所有的资源或者代码都不会被打包进去. 01.使用MenuItem添加菜单栏按钮 脚本不需要作为组件存在,可以不用 ...
最新文章
- 【网络编程】epoll 笔记
- [译]ES6新特性:八进制和二进制整数字面量
- MySQL 5.7.2 发布,增强性能和可扩展性
- html局部可复制,截取网页局部区域css样式的方法和系统的制作方法
- A Data Access Layer to persist business objects using attributes and reflection - Part II [无常译]...
- Android 控件之RatingBar评分条(五星)自定义样式
- Kafka科普系列 | 原来Kafka中的选举有这么多?
- 【正式发布】火星人敏捷开发手册2012-12-25(基于Scrum的敏捷开发免费培训教材及公司内部宣传材料)...
- Pycharm 字体大小及背景颜色的设置
- 深入理解Magento – 第三章 – 布局,块和模板
- C#如何设置Listview的行高-高度 转载
- 社保交满15年就可以停缴了吗?就可以领取养老金了吗?
- swift和java_Swift和Java关于字符串和字符的比较
- VS2017编译配置和使用LOG4CPP
- java中改变文本字体和大小_修改eclipse 代码字体大小以及文档字体大小
- 计算机网络课程设计——校园网的规划与设计
- jQuery LightBox插件原理的简单实现
- UVA 1391 - Astronauts(2-SET)
- 拉钩网前端项目实战06
- 华为云Hadoop与Spark集群环境搭建
热门文章
- 解决 LLVM 错误 cannot specify -o when generating multiple output files
- 关于贝叶斯的一个小小的总结
- 网络流 (EK Dinic)
- compat mysql51 5.1_MySQL mysql-5.1升级到mysql-5.6
- 如何在linux系统下对文件夹名有空格的文件
- java技术自我_2020年Java程序员如何进行自我提升?
- ios 隔空投安装ipa_ipa文件能不能直接安装到手机上?怎么操作?
- 致力协同办公oa系统服务器设置,致力协同办公oa系统安装手册新.pdf
- vlookup查找值不唯一时怎么办
- oracle 数组类型