超全图文带你学习Unity编辑器扩展(Advanced Editor Scripting)

1.使用MenuItem添加菜单栏按钮

一、Editor下面所有的资源以及代码都不会被打包(file build setting等)

Editor下面的代码与资源只会在编辑模式下进行

二、都要在这个Editor文件夹下来创建脚本以及资源

在菜单栏上添加我们自己的按钮,执行我们自己的方法:
 

效果:

2.关于MenuItem的路径设置和实现的先后顺序设置

书接上回

一、我们还可以将路径设置为系统路径如Windows:
 

二、如何在Hierarchy窗口右键可以有我们自定义的按钮要如何做呢?

1.可以发现只有在GameObject窗口中第一个横线之上的按钮才能在Hierarchy窗口中被点击
 

2.可以看到在菜单中不同的类别会被横线分隔开,那如何我们自己将他们设为不同的分类呢?

3.例子:现在要将test1,test2为一类,test3为一类中间横线分隔开

4.实现:第一步:

5.效果:

6.第二步:
 

7.效果:

结论:当同一列表相邻两条目优先级差距大于10会自动产生一条横线 !!!

 GameObject/ 下的菜单项目中优先级小于50的会显示在Hierarchy面板对象的右键菜单中!!

8.所以如此就可以:

最后效果:

首先菜单栏出现窗口

hierarchy窗口右键也会有

三、注意:在Project窗口中右键弹出来的是Assets窗口下的按钮,并且默认弹出所有Assets下的按钮:
 

3.给组件右键菜单栏添加按钮

tips:第7章节写的是如何不用这一章节CONTEXT方法来实现给组件添加按钮的功能,而是直接写在组件的代码中(注意第7章节只针对于用户自己写的组件,而系统内部组件因为我们没办法修改其代码所以还是需要这一章节的内容)

一、首先第一步:

CONTEXT 组件名 按钮名

如此:

二、如何在按钮方法中实现修改当前组件的值:

三、举一反三:如何使用自定义的按钮来修改Rigidbody组件的值呢?
如下:

clear后便会执行我们的逻辑

4.使用selection获取选择的游戏物体

Selection静态类

一、Selection下的一些接口

1.objects 可以获得一个数组,这个数组是选择的所有的游戏物体数组

并且可以获取Project窗口中的

3.activeGameObject是在Hierachy面板上显示的游戏物体

选择多个时,只会显示第一个:

3.activeTransform是通过activeGameObject直接访问身上的Transform组件,且只能获取一个

4.activeObject是包含了预制体的,不只Hierarchy窗口中的物体

5.只有以active打头的才可以获取场景中的物体而不包含Project窗口中的物体。

二、自制删除功能:

使用GameObject.DestroyImmediate函数,将自制的删除功能添加到project右键的菜单栏中:

注意:当使用自己的删除后没办法ctrl+z撤销!!!!

因为我们是使用代码执行的操作,没办法取消,唯一办法是将删除操作注册到操作记录中

三、如何将我们的删除操作注册进删除记录中:使用Undo类!

这样子删除后就可以使用Ctrl+z撤销删除操作!

5.如何给菜单项增加快捷键

一、普通字母作为快捷键

在想要点击的按钮后面+空格+_+想要绑定的快捷键即可完成快捷键的绑定

快捷键和路径中间一定要有一个空格的间隔

如上面的"Tools/test _v"

二、如何使用Ctrl、Alt等组合快捷键:不可以直接打ctrl、alt。。

要作如下转换:

%=ctrl  #=shift  &=alt(API中有)

而且不需要写下划线_ 直接使用%替换就行

运行结果:

 6.控制菜单项是否启用的功能(MenuItem第二个参数的作用)

MenuItem的参数列表:

第二个参数就是isValidateFunction

功能:只有当我们选择了一个游戏物体时才可以点击

代码:

//isValidateFunction参数设置为true

//并且路径以及按钮名称需要一模一样,表示下面我们声明的方法是对应按钮的验证方法

//方法的返回值一定要是bool类型的,当返回值为true时表示执行下面的方法

//当每次弹出选择栏的时候便会执行一次这个方法

可以看到:只有选中了才会有my delete按钮:

不选中时便不会有这个按钮

7.关于ContextMenu和ContextMenuItem的使用

Tips1:该只针对于用户自己写的组件,而系统内部组件因为我们没办法修改其代码所以还是需要第3章节的内容

Tips2:使用ContextMenu和ContextMenuItem不需要引用命名空间UnityEditor的,它存在于UnityEngine,因为它属于MonoBehaviour里的方法(虽然也是属于编辑器扩展)

一、ContextMenuItem(在API中显示的时ContextMenuItemAttribute(因为特性的定义是以Attribute结尾,实际使用只使用前半部分ContextMenuItem就可以了))

ContextMenuItem作用:给我们脚本的属性添加功能的

执行效果:

二、ContextMenu:添加在方法前面

如此便实现了这个功能

8.对话框(弹窗)的全部知识

一、如何创建对话框(弹窗)

首先注意:ScriptableWizard是继承自EditorWindow类的

效果:

二、如何兼容按钮点击统一修改字段

1.首先如何修改对话框中的点击按钮的名字呢?

可以发现按钮的名字已经更改了

1.2.补充:其实DisplayWizard还有第三个参数:也就是说其实可以创建两个按钮也不只是一个

"otherButtonName"

注意:CreateButton执行完后会关闭对话框,而OtherButton关闭后不会关闭对话框

2.如何为点击按钮增加点击事件/方法呢?

3.如何取得我们所选取的所有物体:

需要返回第四章了,使用Selection类中的gameObjects(因为gameObjects包含Prefabs预制体的)

 逻辑:

4.但是这样做修改了数据后没办法使用ctrl+z撤销修改,我们只能增加以下逻辑:

这样子就可以做到记录下面要执行的操作然后撤销更改了。

三、Unity自带的几个对话框方法:

1.首先第一个就是上面的OnWizardCreate()

2.第二个就是OnWizardUpdate():

3.OnSelectionChange()当选择的Selection发生改变时会触发这个方法

四、使用ShowNotification在对话框中显示提示信息

首先注意:ShowNotification是继承自EditorWindow类的,但由于ScriptableWizard是继承自EditorWindow类的所以便可以直接调用

1.ShowNotification的用法:

2.效果:

 

五、在对话框中使用EditorPrefs保存数据

1.使用方法;

1.1EditorPrefs下有多个接口,我们使用SetInt来举例:

1.2可以看到首先需要传入一个string类型的键,再传入一个int类型的值

1.3具体实现:(注意划红线的才是本节的代码)

2.运行效果:

 

六、显示进度条

1.使用EditorUtility下的接口:

有两个接口:1.DisplayProgressBar 2.DisplayCancelableProgressBar

其区别是DisplayCancelableProgressBar这个接口可以给进度条增加一个取消按钮,可以随时中断进度,用途比较广泛

但是这里我们只用第一个DisplayProgressBar 来做案例讲解

2.效果:

9.如何创建一个功能性的自定义窗口

一、首先需要添加一个类,这个类来负责管理窗口

二、具体的实现:

1.首先得到一个MyWindow的对象

2.之后调用show方法让其显示出来

3.增加一个可以创建一个用户自己输入的名字的物体:

执行效果:

4.但是这样同样也有一个问题:

创建的物体删除后没办法撤销:究其原因也是因为创建的物体Unity没有记录操作,所以同样需要调用Undo里的方法来将其注册进操作记录中:

这样之后就可以Ctrl+z撤销操作了

  • 22
    点赞
  • 37
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值