【unity游戏开发——编辑器扩展】使用MenuItem自定义菜单栏拓展

免职声明:

  • 1、目前本博客分享的大部分知识产出方式是:学习别人知识+自己实际做一遍+自己的理解+扩展内容+自己整理、归纳、总结再分享。
  • 2、正如博客简介所说:这里没有教程,这里只做学习分享。所有的内容都是学习笔记,可以说没有什么内容是真正的意义上的“原创”,哪怕是如何安装unity都是跟着网上教程学习的,我的学习理念是:与其闭门造车,不如站在巨人的肩膀上 —— 融会贯通行业前辈们的宝贵经验。
  • 3、unity基础入门知识我就看了3个老师的教程,然后整合起来。比如这里的【unity游戏开发入门到精通】,其实一开始是看b站飞羽老师的,然后又融合外网CodeMonkey的知识,最后又看了唐老师的基础入门的课程,结果发现唐老师的课程确实讲的最好,又全部推翻重置了,目前看到的其实已经是第三版了。其中还包括一些其他的实战内容和自己的理解。
  • 4、其实每篇文章我都参考了很多资料。真要全部写出来,可能理不清楚。比如参考平台有b站、百度、知乎、csdn、siki、泰课、unity官方文档、外网论坛、一些私人博客网站等等,博主包括唐老师、林新发、BeaverJoe、奥飒姆、飞鱼老师、麦扣、打工人小棋、C酱、IGBeginner0116等等,外网就更多了都不太记得名字了比如CodeMonkey、MixandJam、SunnyValleyStudio等等。这里就不一一列举了,毕竟参考的资料实在太多了。
  • 5、参考的部分博主我都私信问过了,得到过许可。
  • 6、关于原创性。我觉得有个说法很好,只要不是直接复制粘贴,而是自己整理、归纳、总结,我觉得都可以算原创。学习他人知识其实更像是查阅了参考资料,不然,除了官方文档,应该都不算是原创内容了。
  • 7、为什么收费?我也很佩服那些无偿分享知识甚至开源的人,他们真的很伟大。但是,我也理解为什么有些人会选择收费。毕竟,时间和精力都是有限的,有时候整理一个知识点就花费几个星期甚至上月,也不是每个家庭都很富裕,我们需要通过分享知识来获得一定的经济回报,以支持我们的创作和维护。另外CSDN也没有任何其他的广告收入方式,完全靠用爱发电。所以,如果你觉得我的文章对你有帮助,欢迎支持我,谢谢!
  • 8、费用我也尽量最低(CSDN官方拿一半的分成,分到我手没多少),这个价格也仅仅算是收个笔记整理费用了,这个价格如果想要在其他地方购买,我想也很难买到了。如果大家不想花这个钱,也可以去网上找一些免费的视频教程,比如B站、YouTube等自行去进行学习整理,我分享的所有知识,不出意外都能在网上找到相关的解决方案。
  • 9、交易是你情我愿的,如果不满意可以选择退款。当然,如果有人觉得我整理的不好,也欢迎私信评论告诉我,我会重新整理的。
  • 10、正如前面所说,参考的资料太多了,每个文章都去写很麻烦。后面我会在首页做个感谢榜,尽量将参考过的博主链接直接放在首页展示,大家可以自行去查看。如果有遗漏也欢迎找我补充。
  • 11、为什么选择CSDN?一是习惯了,用了很多年了,一个是它的SEO做的确实很优秀。

注意:考虑到编辑器扩展的内容比较多,我将编辑器扩展的内容分开,并全部整合放在【unity游戏开发——编辑器扩展】专栏里,感兴趣的小伙伴可以前往逐一查看学习。

文章目录

  • 前置知识
    • 1、Editor 编辑器文件夹
    • 2、不⽤ Editor ⽂件夹
    • 3、编辑器扩展相关命名空间
  • 一、使用MenuItem自定义菜单栏拓展
    • 1、在Unity菜单栏中添加自定义页签
      • 1.1 用法
      • 1.2 示例
    • 2、在Hierarchy窗口中添加自定义页签
      • 2.1 用法
      • 2.2 示例
    • 3、在Project窗口中添加自定义页签
      • 3.1 用法
      • 3.2 示例
    • 4、在Inspector对脚本右键添加菜单
      • 4.1 用法
      • 4.2 示例
    • 5、快捷键
      • 5.1 介绍
      • 5.2 示例
    • 6、排序
  • 二、在菜单栏的Component菜单添加脚本(补充)
    • 1、介绍
    • 2、示例
  • 专栏推荐
  • 完结

前置知识

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/905379.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数学复习笔记 7

前言 现在复习线代基础,慢慢打基础。。 转置 方阵转置之后行列式保持不变。我的笔记感觉主要不是整理知识点,主要是把我的一些理解记录下来。这才是我自己的东西,那些需要记住的知识和内容记住就好了。记住转置有四个性质,在讲…

AIGC时代的内容安全:AI检测技术如何应对新型风险挑战?

在数字时代,互联网内容以文本、图像、音频和视频等形式呈现爆发式增长,深刻塑造了信息传播的格局。然而,内容的快速传播也带来了严峻挑战:违法信息(如涉黄、涉政)、虚假广告、网络暴力等内容不仅威胁用户体…

PyTorch中的nn.Embedding应用详解

PyTorch 文章目录 PyTorch前言一、nn.Embedding的基本原理二、nn.Embedding的实际应用简单的例子自然语言处理任务 前言 在深度学习中,词嵌入(Word Embedding)是一种常见的技术,用于将离散的词汇或符号映射到连续的向量空间。这种…

AI 检测原创论文:技术迷思与教育本质的悖论思考

当高校将 AI 写作检测工具作为学术诚信的 "电子判官",一场由技术理性引发的教育异化正在悄然上演。GPT-4 检测工具将人类创作的论文误判为 AI 生成的概率高达 23%(斯坦福大学 2024 年研究数据),这种 "以 AI 制 AI&…

langchain4j集成QWen、Redis聊天记忆持久化

langchain4j实现聊天记忆默认是基于进程内存的方式,InMemoryChatMemoryStore是具体的实现了,是将聊天记录到一个map中,如果用户大的话,会造成内存溢出以及数据安全问题。位了解决这个问题 langchain4提供了ChatMemoryStore接口&am…

Tomcat 日志体系深度解析:从访问日志配置到错误日志分析的全链路指南

一、Tomcat 核心日志文件架构与核心功能 1. 三大基础日志文件对比(权威定义) 日志文件数据来源核心功能典型场景catalina.out标准输出 / 错误重定向包含 Tomcat 引擎日志与应用控制台输出(System.out/System.err)排查 Tomcat 启…

万物互联时代:ONVIF协议如何重构安防监控系统架构

前言 一、ONVIF协议是什么 ONVIF(Open Network Video Interface Forum,开放式网络视频接口论坛)是一种全球性的开放行业标准,由安讯士(AXIS)、博世(BOSCH)和索尼(SONY&…

leetcode - 双指针问题

文章目录 前言 题1 移动零: 思路: 参考代码: 题2 复写零: 思考: 参考代码: 题3 快乐数: 思考: 参考代码: 题4 盛最多水的容器: 思考:…

从概念表达到安全验证:智能驾驶功能迎来系统性规范

随着辅助驾驶事故频发,监管机制正在迅速补位。面对能力表达、使用责任、功能部署等方面的新要求,行业开始重估技术边界与验证能力,数字样机正成为企业合规落地的重要抓手。 2025年以来,围绕智能驾驶功能的争议不断升级。多起因辅…

java数组题(5)

(1): 思路: 1.首先要对数组nums排序,这样两数之间的差距最小。 2.题目要求我们通过最多 k 次递增操作,使数组中某个元素的频数(出现次数)最大化。经过上面的排序,最大数…

Python(1) 做一个随机数的游戏

有关变量的,其实就是 可以直接打印对应变量。 并且最后倒数第二行就是可以让两个数进行交换。 Py快捷键“ALTP 就是显示上一句的代码。 —————————————————————————————— 字符串 用 双引号或者单引号 。 然后 保证成双出现即可 要是…

【认知思维】验证性偏差:认知陷阱的识别与克服

什么是验证性偏差 验证性偏差(Confirmation Bias)是人类认知中最普遍、最根深蒂固的心理现象之一,指的是人们倾向于寻找、解释、偏爱和回忆那些能够确认自己已有信念或假设的信息,同时忽视或贬低与之相矛盾的证据。这种认知偏差影…

Wpf学习片段

IRegionManager 和IContainerExtension IRegionManager 是 Prism 框架中用于管理 UI 区域(Regions)的核心接口,它实现了模块化应用中视图(Views)的动态加载、导航和生命周期管理。 IContainerExtension 是依赖注入&…

消息~组件(群聊类型)ConcurrentHashMap发送

为什么选择ConcurrentHashMap? 在开发聊天应用时,我们需要存储和管理大量的聊天消息数据,这些数据会被多个线程频繁访问和修改。比如,当多个用户同时发送消息时,服务端需要同时处理这些消息的存储和查询。如果用普通的…

Stapi知识框架

一、Stapi 基础认知 1. 框架定位 自动化API开发框架:专注于快速生成RESTful API 约定优于配置:通过标准化约定减少样板代码 企业级应用支持:适合构建中大型API服务 代码生成导向:显著提升开发效率 2. 核心特性 自动CRUD端点…

基于深度学习的水果识别系统设计

一、选择YOLOv5s模型 YOLOv5:YOLOv5 是一个轻量级的目标检测模型,它在 YOLOv4 的基础上进行了进一步优化,使其在保持较高检测精度的同时,具有更快的推理速度。YOLOv5 的网络结构更加灵活,可以根据不同的需求选择不同大…

Spring Security与SaToken的对比

Spring Security与SaToken的详细对照与优缺点分析 1. 核心功能与设计理念 对比维度Spring SecuritySaToken核心定位企业级安全框架,深度集成Spring生态,提供全面的安全解决方案(认证、授权、攻击防护等)轻量级权限认证框架&#…

【docker】--镜像管理

文章目录 拉取镜像启动镜像为容器连接容器法一法二 保存镜像加载镜像镜像打标签移除镜像 拉取镜像 docker pull mysql:8.0.42启动镜像为容器 docker run -dp 8080:8080 --name container_mysql8.0.42 -e MYSQL_ROOT_PASSWORD123123123 mysql:8.0.42 连接容器 法一 docker e…

力扣HOT100之二叉树:543. 二叉树的直径

这道题本来想到可以用递归做,但是还是没想明白,最后还是去看灵神题解了,感觉这道题最大的收获就是巩固了我对lambda表达式的掌握。 按照灵神的思路,直径可以理解为从一个叶子出发向上,在某个节点处拐弯,然后…

web 自动化之 yaml 数据/日志/截图

文章目录 一、yaml 数据获取二、日志获取三、截图 一、yaml 数据获取 需要安装 PyYAML 库 import yaml import os from TestPOM.common import dir_config as Dirdef read_yaml(key,file_name"test_datas.yaml"):file_path os.path.join(Dir.testcases_dir, file_…