Unity3D Editor 扩展

时间:2021-07-29 17:01:53

官方教程:链接

EditorLayout API:链接

Handles API:链接

1.首先来个Inspector面板Editor的实现

要实现一个组件在Inspector中的Editor功能,首先需要写一个编辑器类:

Unity3D 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的具体控件中看到,

例如,Unity3D Editor 扩展

的最后一个参数便是一些GUILayoutOption不定参,表示可以有多个设置方案。

注意:GUILayoutOption只是表示是设置方案的意思,并不是代表有GUILayoutOption这种设置方法,GUILayoutOption其实是个空类,

具体的设置方案由具体决定。

例如:

GUILayout.Label("Hello World"), EditorStyles.helpBox);

GUILayout.Label("Hello World")表示在面板上显示一条内容为“Hello World”的Label,(下图第一条)

而EditorStyles.helpBox则表示此Label的显示方式是以帮助框的形式显示(下图第二条)

Unity3D Editor 扩展

更多的GUILayoutOption:

EditorStyles.boldLabel Unity3D Editor 扩展

EditorStyles.centeredGreyMiniLabelUnity3D Editor 扩展

EditorStyles.radioButton Unity3D Editor 扩展

EditorStyles.whiteBoldLabel Unity3D Editor 扩展

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列,具体如图:

Unity3D Editor 扩展

4.折页

首先用这句:

showState = EditorGUILayout.Foldout(showState, "State List"); 参数分别为是否打开,显示标签的名字

其实折页就相当于一个toggle按钮,并不做任何事,只是你按下它,它会返回一个是否折开或者合并的结果,

然后自己再根据这个结果显示对应内容来达到折页效果。

if (showState)
{
  GUILayout.Label("内容", EditorStyles.inspectorDefaultMargins);
}
// 为了模拟折页后的子层级的树状缩进结构,我门用EditorStyles.inspectorDefaultMargins这中设置来将内容向右缩进。

Unity3D Editor 扩展

5.自定义自己的GUIStyle

在2中我们知道了如何用GUIStyle扩展GUILayout的各种控件的样式,但我们用的都是EditorStyles附带的风格,

这个EditorStyles是系统用的,我们只能用里面的风格,不能修改(其实也可以改,但改后会将系统其他所以使用该风格的地方都改)。

为了定制我们自己的风格,其实我们可以自己创建一个GUIStyle。

GUIStyle topStyle = new GUIStyle(EditorStyles.centeredGreyMiniLabel);  // 这里我用EditorStyles的centeredGreyMiniLabel来初始化我的新风格
topStyle.fontStyle = FontStyle.Bold;                      // 新Style的字体为粗体
topStyle.fontSize = ;
topStyle.richText = true;                              // 允许富文本

Unity3D Editor 扩展

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*, test.transform.name +" : "+ test.transform.position.ToString() );
//开始绘制GUI
Handles.BeginGUI();
//规定GUI显示区域
GUILayout.BeginArea(new Rect(, , , ));
//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一样会自动调用

Unity3D Editor 扩展

但是一般情况下,绘制函数里的参数只有'center','size'之类的,绘制出来的图形是没有角度的,

如果有需要绘制旋转过的图形,例如一个跟随摄影机旋转的Cube

Unity3D Editor 扩展

那么就需要利用Gizmos的重要参数——matirx,

这是Gimos的绘制矩阵,绘制的图形信息在这里,要缩放,旋转Gizmos绘制出来的图形,

只需要改变矩阵即可。

void OnDrawGizmos()
{
Vector3 size = new Vector3(half.x * , half.y * , half.z * );
// 变换矩阵
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菜单栏快捷键

Unity3D Editor 扩展

Unity3D Editor 扩展

%代表 Ctrl

#代表 Shift

9.手动将Scene标志为“修改过的”

有时候会动态在Editor脚本里创建对象在Scene里,但是动态创建之后Scene默认是认为场景没被修改过的,

这个时候是没法保存场景的,就算你强制Ctrl + S,重载场景后之前动态生成的对象也会丢失(除非你在生成对象后,又手动在场景里做一些修改)

那么我需要手动调用场景管理器里的一个方法,将当前所有打开的场景标志为“脏的”,即被改动过的,这个时候在就可以Ctrl + S保存了。

EditorSceneManager.MarkAllScenesDirty();

同理,如果你通过代码改过资源,那么也需要手动调用AssetDatabase.Refresh 刷新下编辑器。

Unity3D Editor 扩展的更多相关文章

  1. Unity3D引擎扩展中的编辑器定制方法

    http://gamerboom.com/archives/36432 作者:Richard Fine Unity3D的方便之处在于,它很容易地扩展编辑器套件.每款游戏都对加工有着不同的需求,可以快速 ...

  2. Unity3D编辑器扩展(五)——常用特性(Attribute)以及Selection类

    前面写了四篇关于编辑器的: Unity3D编辑器扩展(一)——定义自己的菜单按钮 Unity3D编辑器扩展(二)——定义自己的窗口 Unity3D编辑器扩展(三)——使用GUI绘制窗口 Unity3D ...

  3. Unity3D编辑器扩展(四)——扩展自己的组件

    前面已经写了三篇: Unity3D编辑器扩展(一)——定义自己的菜单按钮 Unity3D编辑器扩展(二)——定义自己的窗口 Unity3D编辑器扩展(三)——使用GUI绘制窗口 今天写第四篇,扩展自己 ...

  4. Unity3D编辑器扩展(六)——模态窗口

    前面我们已经写了5篇关于编辑器的,这是第六篇,也是最后一篇: Unity3D编辑器扩展(一)——定义自己的菜单按钮 Unity3D编辑器扩展(二)——定义自己的窗口 Unity3D编辑器扩展(三)—— ...

  5. Unity3D编辑器扩展(一)——定义自己的菜单按钮

    Unity3D 引擎的编辑器拥有很强的扩展性,用的好可以帮我们省很多事情.在这里记录下如何去扩展 Unity3D 的编辑器,定制属于我们自己的开发环境. 本篇主要讲解在 Unity3D 引擎的各个窗口 ...

  6. U3D之Editor扩展学习

    Unity3D提供了强大的编辑器扩展机制,在项目开发中,如果可以将一些繁琐的工作放在编辑器扩展中进行,则会大大提高效率.本文对编辑器扩展进行了一些总结,希望对有兴趣编写编辑器扩展的开发人员有所帮助.当 ...

  7. U3D 自定义shader创建Editor扩展

    “工欲善其事,必先利其器”Shader学习工具篇 最近一直忙于录制关于Shader入门的视频教程,其中一个反复的机械动作就是右键创建所需要的新Shader.悲剧的是每次打开的都是Unity3D默认的S ...

  8. Unity3d编辑器扩展学习笔记

    编辑器扩展 1.添加菜单栏:把特性应用于静态方法 参数1:菜单名的空格后面是定义快捷键(单符号得用"_"开头,组合键%=Ctrl,#=Shift,&=Alt) 参数2:通过 ...

  9. unity3D编辑器扩展

    编辑器扩展只是在编辑项目中运行,发布出来是不会运行的. 固定创建一个文件夹Editor:所有的资源或者代码都不会被打包进去. 01.使用MenuItem添加菜单栏按钮 脚本不需要作为组件存在,可以不用 ...

随机推荐

  1. dpkg: 处理归档 /var/cache/apt/archives/软件名 (--unpack)时出错:由于已经达到 MaxReports 限制,没有写入 apport 报告。

    一.环境介绍: OS:ubuntu16.04 64bit 二.错误如下: 正准备解包 .../libqt4-script_4%3a4.8.7+dfsg-5ubuntu2_i386.deb  ...正在 ...

  2. OC 内存泄露 自动释放池

    花絮:看到下面的代码就想起这么一个调侃: 一个老程序员,功成名就,金盆洗手不在写代码后,决定练练书法.提笔思索良久后在纸上写下:Hello world! /********************** ...

  3. pdf 显示

    昨天调用同事写好的显示pdf借口  他返回给我的byte 我这面进行接受流的时候  长度一直跟他的对应不上 最后用WebClient类进行解决 webclient类 第一种是将文件存储在文件系统上,用 ...

  4. mysql 常用配置

    1. 帐号不允许从远程登陆,只能在localhost 这个时候只要在localhost的那台电脑,登入mysql后,更改 “mysql” 数据库里的 “user” 表里的 “host” 项,从“loc ...

  5. 【转】 管理CPU 亲和性

    简单地说,CPU 亲和性(affinity) 就是进程要在某个给定的 CPU 上尽量长时间地运行而不被迁移到其他处理器的倾向性.Linux 内核进程调度器天生就具有被称为 软 CPU 亲和性(affi ...

  6. (七)《Java编程思想》——多态的缺陷

    1.不能“覆盖”私有方法 package chapter8; /** * 不能"覆盖"私有方法 */ public class PrivateOverride { private ...

  7. linux进程间通信之信号

    1.wait()函数 原型:pid_t  wait(int *status) 子进程退出时,它向父进程发送一个SIGCHLD信号,默认情况是总是忽略SIGCHLD信号,此时进程状态一直保留在内存中,因 ...

  8. python包

    有个伟人说过: python的学习很大一部分取决与你对第三方包的熟悉和掌握程度! virtualenv virtualenv用于创建独立的Python环境,多个Python相互独立,互不影响,它能够: ...

  9. CSS 实现的各种球体效果

    CSS 实现的各种球体效果[附在线演示] CSS 可以实现很多你想不到的效果,今天我们来尝试使用 CSS 实现各种球体效果.有两种方法可以实现,第一种是使用大量的元素创建实际的 3D 球体,这种方法有 ...

  10. git 入门教程之实战 git

    实战 git git 是一款分布式版本控制系统,可以简单概括: 不要把鸡蛋放在一个篮子里,你的一举一动都在监视中. 实战场景 你作为某项目的其中一员或者负责人,和小伙伴们一起开发,大家既有着各自分工互 ...