当我们在unity中使用其它的插件或者查看别人的开源代码会发现导入了这些插件或项目后菜单栏跟默认的菜单栏不一样。这是因为他们对菜单栏进行了扩展。由于unity有非常丰富的扩展接口,我们可以对菜单栏进行扩展.也可以创建自己的功能界面,甚至修改原有的窗口也是可以的.下面就是对菜单栏的修改。
菜单扩展图如下:
- 要扩展菜单栏首先要在project窗口下新建一个Editor的文件夹(如果有就不用重建).
然后就在这个文件夹下创建脚本,命字自己定. - 打开脚本,去掉脚本中继承的MonoBehaviour和start方法和update方法。
- 实现我们自己的菜单栏,代码如下:
[MenuItem("Tools/test1")]
static void Test1()
{
Debug.Log("test1");
}
MenuItem有三个参数:</br>第一个表示菜单的目录结构,"Tools/test1"表示新建一个Tools的目录,然后在这个菜单下建一个test1的按钮,按钮点击调用的方法就是Test1()方法。</br>第二个参数表示是否要进行判断这个按钮的置灰判断,如果要进行判断就需要再创建一个方法进行判断,判断的方法如下:
[MenuItem("GameObject/my delete %#h",true,10)]
static bool mydeleteValidate()
{
if(Selection.objects.Length > 0){
return true;
}else{
return false;
}
}
[MenuItem("GameObject/my delete %#h",false,10)]
static void mydelete()
{
//循环选中的 进行删除
foreach(Object o in Selection.gameObjects)
{
// GameObject.DestroyImmediate(o);//用GameObject自带的删后不能撤销
Undo.DestroyObjectImmediate(o);//用undo删除的东西是可以撤销的
}
}
上面的代码就是在原来的菜单下创建了一个名为my delete的按钮,上面有两个方法mydeleteValidate()和mydelete(),它们的目录结构一样,这样就会先调用第二个参数为true的方法,这个方法的返回参数是一个bool,如果为true表示当前的按钮为可点击,反之设为不可点击。第二个方法是实现具体的操作方法,里面的功能就是将选中的gameobject删除掉,删除的方法有两种,第一个被注释的方法删除后不可用ctrl+z进行撤销,第二个为可撤销的。</br>第三个方法:priority,传入一个int数值,越小就会显示在越前面,在同一目录中priority值相差10以上就会分成两组,用一条线分隔开来,如下图:- 如果想使用快捷键来操作这些菜单,可以在第一个参数后面跟上如下字符:
如果只有一个字母的快捷键:空格+下划线+字母</br>组合键:%代表windows下的ctrl,mac下的cmd</br>#代表shift</br>&代表alt(组合键不用下划线)
以上就是菜单栏的扩展,扩展的菜单栏如果是放在GameObject下的第一组里面,那么在Hierarchy中右键也是会展示出来。放在Assets中会在project中右键显示出来等等.
在unity中经常会在Inspector中调试某个脚本或者组件,比如一个脚本控制玩家的血量和速度,在调试的时候就得选中血量输入一个数字再选择速度字段再进行对应的修改,这种就会很麻烦。在这种情况下也是可以针对这个脚本或组件进行弹出菜单的扩展的,以下就是对脚本的菜单扩展:
- 单项数据修改:
首先找到对应的属性定义位置增加注解代码,代码如下
//给字段加一个按钮调方法 第一个是字段按钮名 第二个是调用的方法
[ContextMenuItem("加血","addHp")]
public int startingHealth = 100;
void addHp(){
startingHealth += 20;
}
ContextMenuItem有两个参数,第一个是点击属性后弹出菜单按钮的名字,第二个是点击后调用的方法名,以上方法实现在功能就是点一次对主角血量增加20.如下图:
- 批量进行数据修改:
//给这个组件加一个弹出选项 [ContextMenu("setcolor")] void setColor(){ flashColour = Color.green; startingHealth += 30; }
以上就是在脚本处新增了一个弹出按钮setcolor,这个脚本把修改了颜色和血量.弹出界面如下: