前置知识

1、Editor 编辑器文件夹

主要新项目需要自己手动创建
在这里插入图片描述

  • 作用:用于存放与Unity编辑器相关的脚本,内容不会被打包到发布版本中。
  • 注意:该文件夹中的脚本仅在编辑模式下使用,不会被打包到游戏发布包中。

2、不⽤ Editor ⽂件夹

如果你不想使用 Editor ⽂件夹其实也可以,我没就需要在代码中给每个 UnityEditor API 都加上#if UNITY_EDITOR宏判断。比如:

#if UNITY_EDITOR
using UnityEditor;
#endif

#if UNITY_EDITOR
        [MenuItem("XYFrame/XYFrame/1.一键打包XYFrame")]
#endif

这样做的⽬的,是为了不影响我们项⽬打包。如果编辑器扩展相关代码不放在Editor文件夹内,又不加宏判断,项目打包会报错。

3、编辑器扩展相关命名空间

using UnityEditor;

一、使用MenuItem自定义菜单栏拓展

  • 特性:MenuItem
  • 作用:在菜单栏点击该页签时,将执行静态函数中逻辑。
  • 注意
    • 不用在意继承对象,不继承Monobehaviour也没问题。
    • 斜杠必须是 / 不能是 \
    • 一定要加在静态函数上才有效

1、在Unity菜单栏中添加自定义页签

1.1 用法

在静态函数前加上

[MenuItem("页签/一级选项/二级选项/....")]

1.2 示例

using UnityEditor;
using UnityEngine;

public class MenuItemTest
{
   [MenuItem("编辑器拓展/菜单1/子菜单1")]
   private static void TestFun1()
   {
       Debug.Log("打印1");
   }
}

效果
在这里插入图片描述
不需要运行游戏,点击即可执行TestFun1方法
在这里插入图片描述

2、在Hierarchy窗口中添加自定义页签

2.1 用法

在静态函数前加上,并且页签命名前面放入GameObject路径

[MenuItem("GameObject/页签/一级选项/二级选项/....")]

2.2 示例

[MenuItem("GameObject/编辑器拓展/菜单1/子菜单1")]
private static void TestFun2()
{
    Debug.Log("打印2");
}

效果
在这里插入图片描述
或者
在这里插入图片描述

3、在Project窗口中添加自定义页签

3.1 用法

在静态函数前加上,并且页签命名前面放入Assets路径

[MenuItem("Assets/页签/一级选项/二级选项/....")]

3.2 示例

[MenuItem("Assets/编辑器拓展/菜单1/子菜单1")]
private static void TestFun3()
{
    Debug.Log("打印3");
}

效果
在这里插入图片描述
或者
在这里插入图片描述

4、在Inspector对脚本右键添加菜单

4.1 用法

在静态函数前加上,并且页签命名前面放入CONTEXT路径

[MenuItem("CONTEXT/脚本名/页签/一级选项/二级选项/....")]

4.2 示例

[MenuItem("CONTEXT/NewMonoBehaviourScript/编辑器拓展/菜单1/TestFun4")]
private static void TestFun4()
{
    Debug.Log("打印4");
}

在这里插入图片描述

5、快捷键

5.1 介绍

  • 基础用法:路径后 + 空格 + 下划线 + 想要的按键

    [MenuItem("编辑器拓展/菜单2/TestFun5 _F4")]
    
  • 特殊按键%表示ctrl#表示shift&表示alt,注意使用特殊按键前面不需要加下划线

    //最后有个 “ %e”,这个就是快捷键的符号,意思是 ctrl/cmd + e
    [MenuItem("XYFrame/XYFrame/1.一键打包XYFrame %e")]
    
  • 其他支持的按键LEFT、RIGHT、UP、DOWN、F1..F12、HOME、END、PGUP、PGDN 等等

5.2 示例

[MenuItem("编辑器拓展/菜单2/TestFun5 _F4")]
private static void TestFun5()
{
    Debug.Log("TestFun5");
}

[MenuItem("编辑器拓展/菜单2/TestFun6 _A")]
private static void TestFun6()
{
    Debug.Log("TestFun6");
}

[MenuItem("编辑器拓展/菜单2/TestFun7 _%#&A")]
private static void TestFun7()
{
    Debug.Log("TestFun7");
}

效果
在这里插入图片描述

6、排序

MenuItem第三个参数,意思是优先级,表示 MenuItem 所在的显示顺序,数值越⼤越在底部。

[MenuItem("XYFrame/XYFrame/2.打开存储目录, false, 1")]

注意:两个菜单按钮的排序差大于1,则会在两个按钮之间显示一条线进行分隔。

二、在菜单栏的Component菜单添加脚本(补充)

1、介绍

  • 特性:AddComponentMenu
  • 用法:在想要通过Component菜单添加的脚本前加上
    [AddComponentMenu("一级选项/二级选项/....")]
    
  • 注意
    • 脚本需要继承MonoBehaviour对象。
    • 斜杠必须是 / 。
    • 最后一级选项的名字可以和脚本名不一样,但是建议一致。
    • 由于给GameObject添加的脚本肯定要继承Monobehaviour,所以不放在Editor文件夹。

2、示例

using UnityEngine;

[AddComponentMenu("编辑器拓展/菜单1/子菜单1")]
public class AddComponentMenuTest : MonoBehaviour {
    
}

脚本不放在Editor文件夹
在这里插入图片描述
效果
在这里插入图片描述
或者
在这里插入图片描述


专栏推荐

地址
【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,如果学习过程中遇到任何问题,也欢迎你评论私信找我。

赠人玫瑰,手有余香!如果文章内容对你有所帮助,请不要吝啬你的点赞评论和关注,你的每一次支持都是我不断创作的最大动力。当然如果你发现了文章中存在错误或者有更好的解决方法,也欢迎评论私信告诉我哦!
在这里插入图片描述

Logo

技术共进,成长同行——讯飞AI开发者社区

更多推荐