2025-01-22 Unity Editor 1 —— MenuItem 入门
文章目录
- 1 Editor 文件夹
- 2 MenuItem
- 3 使用示例
- 3.1 打开网址
- 3.2 打开文件夹
- 3.3 Menu Toggle
- 3.4 Menu 代码复用
- 3.5 MenuItem 激活与失活
- 4 代码示例
1 Editor 文件夹
Editor 文件夹是 Unity 中的特殊文件夹,Unity 中所有编辑器相关的脚本都需要放置在其中,其相关的命名空间为 UnityEditor。
使用命名空间 UnityEditor 的脚本最终不能被 Unity 打包,需要将这些脚本放置到 Editor 文件夹中,避免打包时报错。

2 MenuItem
在静态函数前加上特性:[MenuItem("页签/一级选项/二级选项/....")]
,则会在菜单栏显示对应的页签。
当点击页签时,特性修饰的静态函数将被执行。
[MenuItem("EditorExtension/01.Menu/01.Hello Editor")]
static void HelloEditor()
{Debug.Log("Hello Editor");
}
3 使用示例
3.1 打开网址
使用 Application.OpenURL
打开网址。
[MenuItem("EditorExtension/01.Menu/02.Open Bilibili")]
static void OpenBilibili()
{Application.OpenURL("https://bilibili.com");
}
3.2 打开文件夹
在 Editor 中,可以使用 EditorUtility 提供的 API 直接打开文件夹。
[MenuItem("EditorExtension/01.Menu/03.Open PersistentDataPath")]
static void OpenPersistentDataPath()
{EditorUtility.RevealInFinder(Application.persistentDataPath);
}[MenuItem("EditorExtension/01.Menu/04.打开策划目录")]
static void OpenDesignerFolder()
{EditorUtility.RevealInFinder(Application.dataPath.Replace("Assets", "Library"));
}
3.3 Menu Toggle
Menu 类为页签提供 Toggle 功能,点击页签后,可在旁边显示 √。
[MenuItem("EditorExtension/01.Menu/05.快捷键开关")]
static void ToggleShotCut()
{mOpenShotCut = !mOpenShotCut;Menu.SetChecked("EditorExtension/01.Menu/05.快捷键开关", mOpenShotCut);
}


3.4 Menu 代码复用
使用 EditorApplication.ExecuteMenuItem 可复用执行 MenuItem 对应的静态函数。
尽管直接调用静态函数更为方便,但当该静态函数为 private 且需要在外部调用时,便可使用该方法。
[MenuItem("EditorExtension/01.Menu/06.Hello Editor _c")]
static void HelloEditorWithShotCut()
{// 等价于调用 HelloEditor() 函数EditorApplication.ExecuteMenuItem("EditorExtension/01.Menu/01.Hello Editor");
}
上述代码为菜单路径添加了快捷键 “C” 触发,因为在菜单路径 “EditorExtensions/01.Menu/06.Hello Editor” 后添加了 " _c":使用空格隔开菜单路径与快捷键,使用下划线表示快捷键是单个键 “C”。
- 单键:菜单路径 + 空格 + 下划线 + 想要的按键
- 组合键:下划线替换为
%
:表示 Ctrl#
:表示 Shift&
:表示 Alt- 其他支持的按键:
LEFT
、RIGHT
:#LEFT 表示左 Shift 按键。UP
、DOWN
、F1-F12
、HOME
、END
、PGUP
、PGDN
。
3.5 MenuItem 激活与失活
控制 MenuItem(path)
的激活与失活,需要:
- 额外声明一个静态方法,添加 MenuItem 特性。
- MenuItem 的菜单路径与目标路径 path 一致。
- MenuItem 额外添加参数
validate = true
。
- 静态方法方法返回 bool 类型值,表示 MenuItem 是否可被点击(被激活)。
[MenuItem("EditorExtension/01.Menu/06.Hello Editor _c", validate = true)]
static bool HelloEditorWithShotCutValidate()
{// 由 Toggle:“05.快捷键开关” 控制return Menu.GetChecked("EditorExtension/01.Menu/05.快捷键开关");
}
4 代码示例
using UnityEngine;namespace EditorExtension
{using UnityEditor;public class MenuItemExample{[MenuItem("EditorExtension/01.Menu/01.Hello Editor")]static void HelloEditor(){Debug.Log("Hello Editor!");}[MenuItem("EditorExtension/01.Menu/02.Open Bilibili")]static void OpenBilibili(){Application.OpenURL("https://www.bilibili.com");}[MenuItem("EditorExtension/01.Menu/03.Open PersistentDataPath")]static void OpenPersistentDataPath(){EditorUtility.RevealInFinder(Application.persistentDataPath);}[MenuItem("EditorExtension/01.Menu/04.打开策划目录")]static void OpenDesignerFolder(){EditorUtility.RevealInFinder(Application.dataPath.Replace("Assets", "Library"));}[MenuItem("EditorExtension/01.Menu/05.快捷键开关")]static void ToggleShotCut(){var menuPath = "EditorExtension/01.Menu/05.快捷键开关";var check = Menu.GetChecked(menuPath);Menu.SetChecked(menuPath, !check);}[MenuItem("EditorExtension/01.Menu/06.Hello Editor _c")]static void HelloEditorWithShotCut(){// 复用方式 1:直接调用方法,但因为方法为 private,不可外部调用// HelloEditor();// 复用方式 2:复用菜单,可外部调用EditorApplication.ExecuteMenuItem("EditorExtension/01.Menu/01.Hello Editor");}[MenuItem("EditorExtension/01.Menu/06.Hello Editor _c", validate = true)]static bool HelloEditorWithShotCutValidate(){// 由 Toggle:“05.快捷键开关” 控制return Menu.GetChecked("EditorExtension/01.Menu/05.快捷键开关");}[MenuItem("EditorExtension/01.Menu/07.Open Bilibili %e")]static void OpenBilibiliWithShotCut(){EditorApplication.ExecuteMenuItem("EditorExtension/01.Menu/02.Open Bilibili");}[MenuItem("EditorExtension/01.Menu/07.Open Bilibili %e", validate = true)]static bool OpenBilibiliWithShotCutValidate(){return Menu.GetChecked("EditorExtension/01.Menu/05.快捷键开关");}[MenuItem("EditorExtension/01.Menu/08.Open PersistentDataPath %#t")]static void OpenPersistentDataPathWithShotCut(){EditorApplication.ExecuteMenuItem("EditorExtension/01.Menu/03.Open PersistentDataPath");}[MenuItem("EditorExtension/01.Menu/08.Open PersistentDataPath %#t", validate = true)]static bool OpenPersistentDataPathWithShotCutValidate(){return Menu.GetChecked("EditorExtension/01.Menu/05.快捷键开关");}[MenuItem("EditorExtension/01.Menu/09.打开策划目录 &r")]static void OpenDesignerFolderWithShotCut(){EditorApplication.ExecuteMenuItem("EditorExtension/01.Menu/04.打开策划目录");}[MenuItem("EditorExtension/01.Menu/09.打开策划目录 &r", validate = true)]static bool OpenDesignerFolderWithShotCutValidate(){return Menu.GetChecked("EditorExtension/01.Menu/05.快捷键开关");}}
}
相关文章:

2025-01-22 Unity Editor 1 —— MenuItem 入门
文章目录 1 Editor 文件夹2 MenuItem3 使用示例3.1 打开网址3.2 打开文件夹3.3 Menu Toggle3.4 Menu 代码复用3.5 MenuItem 激活与失活4 代码示例 1 Editor 文件夹 Editor 文件夹是 Unity 中的特殊文件夹,Unity 中所有编辑器相关的脚本都需要放置在其中…...
解锁C#编程新姿势:Z.ExtensionMethods入门秘籍
一、引言 在 C# 的开发旅程中,我们常常会遇到各种重复性高、复杂度低的任务,这些任务虽然基础,但却占据了我们大量的开发时间。比如处理字符串时,经常需要进行非空判断、格式转换;操作日期时间时,计算某个…...
不使用 JS 纯 CSS 获取屏幕宽高
前言 在现代前端开发中,获取屏幕的宽度和高度通常依赖于 JavaScript。然而现代 CSS 也可以获取到屏幕的宽高,通过自定义属性(CSS Variables)和一些数学函数来实现这一目标。本文将详细解析如何使用 CSS 的 property 规则和一些数…...
Node.js NativeAddon 构建工具:node-gyp 安装与配置完全指南
Node.js NativeAddon 构建工具:node-gyp 安装与配置完全指南 node-gyp Node.js native addon build tool [这里是图片001] 项目地址: https://gitcode.com/gh_mirrors/no/node-gyp 项目基础介绍及主要编程语言 Node.js NativeAddon 构建工具(node-gyp…...
【ARTS】【LeetCode-704】二分查找算法
目录 前言 什么是ARTS? 算法 力扣704题 二分查找 基本思想: 二分查找算法(递归的方式): 经典写法(找单值): 代码分析: 经典写法(找数组即多个返回值) 代码分析 经典题目 题目描述: 官方题解 深入思考 模版一 (相错终止/左闭右闭) 相等返回情形…...

Vue.js 配置路由:基本的路由匹配
Vue.js 配置路由:基本的路由匹配 在 Vue.js 应用中,Vue Router 是官方提供的路由管理器,用于在单页应用(SPA)中管理不同的视图。通过配置路由,应用可以根据 URL 的变化展示相应的组件。 基本的路由匹配是…...

鸿蒙(HarmonyOS)Json格式转实体对象(2)
下面是一个复杂的json体。 怎么把json转实体类,首先要定义类 import List from ohos.util.List export class InfoModel{msg: stringcars: List<Cars>code: numberpermissions: List<string>roles: List<string>user: User}class Cars{createBy:…...
代码随想录 栈与队列 test 6
239. 滑动窗口最大值 - 力扣(LeetCode) 每次只取窗口中最大值,这个最大值可能在后面的滑动中保持不变,而比最大值小的值且在最大值之前出现的值没必要保留,因此可以通过单调队列利用这个特性。 这个单调队列具有如下…...
动手学深度学习2025.1.23
一、预备知识 1.数据操作 (1)数据访问: 一个元素:[1,2] //行下标为1,列下标为2的元素 一行元素:[1,:] //行下标为1的所有元素 一列元素:[:,1] //列下标为1的所有元素 子区域:[…...

生存网络与mlr3proba
在R语言中,mlr3包是一个用于机器学习的强大工具包。它提供了一种简单且灵活的方式来执行超参数调整。 生存网络是一种用于生存分析的模型,常用在医学和生物学领域。生存分析是一种统计方法,用于研究事件发生的时间和相关因素对事件发生的影响。生存网络可以用来预测个体在给…...

C#与AI的共同发展
C#与人工智能(AI)的共同发展反映了编程语言随着技术进步而演变,以适应新的挑战和需要。自2000年微软推出C#以来,这门语言经历了多次迭代,不仅成为了.NET平台的主要编程语言之一,还逐渐成为构建各种类型应用程序的强大工具。随着时…...

2000-2020年各省第二产业增加值数据
2000-2020年各省第二产业增加值数据 1、时间:2000-2020年 2、来源:国家统计局、统计年鉴、各省年鉴 3、指标:行政区划代码、地区、年份、第二产业增加值 4、范围:31省 5、指标解释:第二产业增加值是指在一个国家或…...

【MySQL】 库的操作
欢迎拜访:雾里看山-CSDN博客 本篇主题:【MySQL】 库的操作 发布时间:2025.1.23 隶属专栏:MySQL 目录 库的创建语法使用 编码规则认识编码集查看数据库默认的编码集和校验集查看数据库支持的编码集和校验集指定编码创建数据库验证不…...
docker 启动镜像命令集合
安装rabbitmq 参考地址: https://blog.csdn.net/xxpxxpoo8/article/details/122935994 docker run -it -d --namerabbit-3.8 -v /d/docker/rabbitmq-stomp/conf:/etc/rabbitmq -p 5617:5617 -p 5672:5672 -p 4369:4369 -p 15671:15671 -p 15672:15672 -p 25672:2…...

微信小程序获取位置服务
wx.getLocation({type: gcj02,success(res) {wx.log(定位成功);},fail(err) {wx.log(定位失败, err);wx.showModal({content: 请打开手机和小程序中的定位服务,success: (modRes) > {if (modRes.confirm) {wx.openSetting({success(setRes) {if (setRes.authSetting[scope.u…...

Docker Load后存储的镜像及更改镜像存储目录的方法
Docker Load后存储的镜像及更改镜像存储目录的方法 Docker Load后存储的镜像更改镜像存储目录的方法脚本说明注意事项Docker作为一种开源的应用容器引擎,已经广泛应用于软件开发、测试和生产环境中。通过Docker,开发者可以将应用打包成镜像,轻松地进行分发和运行。而在某些场…...
Langchain本地知识库部署
本地部署(Docker + LangChain + FAISS) 1. 概述 本地部署 LangChain-Chatchat 可以为企业提供高效、安全、可控的 AI 知识库方案。本方案基于 Docker、LangChain 和 FAISS 进行本地化部署,适用于企业内部知识库问答、私有化 AI 应用等场景。 2. 技术选型 2.1 LangChain …...

java基础学习——jdbc基础知识详细介绍
引言 数据的存储 我们在开发 java 程序时,数据都是存储在内存中的,属于临时存储,当程序停止或重启时,内存中的数据就会丢失,我们为了解决数据的长期存储问题,有以下解决方案: 通过 IO流书记&…...

联想电脑怎么设置u盘启动_联想电脑设置u盘启动方法(支持新旧机型)
有很多网友问联想电脑怎么设置u盘启动,联想电脑设置u盘启动的方法有两种,一是通过bios进行设置。二是通过快捷方式启动进入u盘启动。但需要注意有两种引导模式是,一种是uefi引导,一种是传统的leacy引导,所以需要注意制…...
C# 解析 HTML 实战指南
在网页开发和数据处理的场景中,经常需要从 HTML 文档里提取有用的信息。C# 作为一门强大的编程语言,提供了丰富的工具和库来实现 HTML 的解析。这篇博客就带你深入了解如何使用 C# 高效地解析 HTML。 一、为什么要在 C# 中解析 HTML 在实际项目中&…...

2025年能源电力系统与流体力学国际会议 (EPSFD 2025)
2025年能源电力系统与流体力学国际会议(EPSFD 2025)将于本年度在美丽的杭州盛大召开。作为全球能源、电力系统以及流体力学领域的顶级盛会,EPSFD 2025旨在为来自世界各地的科学家、工程师和研究人员提供一个展示最新研究成果、分享实践经验及…...

Keil 中设置 STM32 Flash 和 RAM 地址详解
文章目录 Keil 中设置 STM32 Flash 和 RAM 地址详解一、Flash 和 RAM 配置界面(Target 选项卡)1. IROM1(用于配置 Flash)2. IRAM1(用于配置 RAM)二、链接器设置界面(Linker 选项卡)1. 勾选“Use Memory Layout from Target Dialog”2. 查看链接器参数(如果没有勾选上面…...

C# 求圆面积的程序(Program to find area of a circle)
给定半径r,求圆的面积。圆的面积应精确到小数点后5位。 例子: 输入:r 5 输出:78.53982 解释:由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982,因为我们只保留小数点后 5 位数字。 输…...
Mobile ALOHA全身模仿学习
一、题目 Mobile ALOHA:通过低成本全身远程操作学习双手移动操作 传统模仿学习(Imitation Learning)缺点:聚焦与桌面操作,缺乏通用任务所需的移动性和灵活性 本论文优点:(1)在ALOHA…...
服务器--宝塔命令
一、宝塔面板安装命令 ⚠️ 必须使用 root 用户 或 sudo 权限执行! sudo su - 1. CentOS 系统: yum install -y wget && wget -O install.sh http://download.bt.cn/install/install_6.0.sh && sh install.sh2. Ubuntu / Debian 系统…...

HDFS分布式存储 zookeeper
hadoop介绍 狭义上hadoop是指apache的一款开源软件 用java语言实现开源框架,允许使用简单的变成模型跨计算机对大型集群进行分布式处理(1.海量的数据存储 2.海量数据的计算)Hadoop核心组件 hdfs(分布式文件存储系统)&a…...

20个超级好用的 CSS 动画库
分享 20 个最佳 CSS 动画库。 它们中的大多数将生成纯 CSS 代码,而不需要任何外部库。 1.Animate.css 一个开箱即用型的跨浏览器动画库,可供你在项目中使用。 2.Magic Animations CSS3 一组简单的动画,可以包含在你的网页或应用项目中。 3.An…...

使用LangGraph和LangSmith构建多智能体人工智能系统
现在,通过组合几个较小的子智能体来创建一个强大的人工智能智能体正成为一种趋势。但这也带来了一些挑战,比如减少幻觉、管理对话流程、在测试期间留意智能体的工作方式、允许人工介入以及评估其性能。你需要进行大量的反复试验。 在这篇博客〔原作者&a…...

day36-多路IO复用
一、基本概念 (服务器多客户端模型) 定义:单线程或单进程同时监测若干个文件描述符是否可以执行IO操作的能力 作用:应用程序通常需要处理来自多条事件流中的事件,比如我现在用的电脑,需要同时处理键盘鼠标…...

【Linux手册】探秘系统世界:从用户交互到硬件底层的全链路工作之旅
目录 前言 操作系统与驱动程序 是什么,为什么 怎么做 system call 用户操作接口 总结 前言 日常生活中,我们在使用电子设备时,我们所输入执行的每一条指令最终大多都会作用到硬件上,比如下载一款软件最终会下载到硬盘上&am…...