当前位置: 首页 > news >正文

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 文件夹中,避免打包时报错。

image-20240208224523481

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);
}
image-20250122041123568 image-20250122041200497

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”。

  • 单键:菜单路径 + 空格 + 下划线 + 想要的按键
  • 组合键:下划线替换为
    1. %:表示 Ctrl
    2. #:表示 Shift
    3. &:表示 Alt
  • 其他支持的按键:
    1. LEFTRIGHT:#LEFT 表示左 Shift 按键。
    2. UPDOWNF1-F12HOMEENDPGUPPGDN

3.5 MenuItem 激活与失活

​ 控制 MenuItem(path) 的激活与失活,需要:

  1. 额外声明一个静态方法,添加 MenuItem 特性。
    • MenuItem 的菜单路径与目标路径 path 一致。
    • MenuItem 额外添加参数 validate = true
  2. 静态方法方法返回 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 中所有编辑器相关的脚本都需要放置在其中&#xf…...

解锁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转实体类&#xff0c;首先要定义类 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. 滑动窗口最大值 - 力扣&#xff08;LeetCode&#xff09; 每次只取窗口中最大值&#xff0c;这个最大值可能在后面的滑动中保持不变&#xff0c;而比最大值小的值且在最大值之前出现的值没必要保留&#xff0c;因此可以通过单调队列利用这个特性。 这个单调队列具有如下…...

动手学深度学习2025.1.23

一、预备知识 1.数据操作 &#xff08;1&#xff09;数据访问&#xff1a; 一个元素&#xff1a;[1,2] //行下标为1&#xff0c;列下标为2的元素 一行元素&#xff1a;[1,:] //行下标为1的所有元素 一列元素&#xff1a;[:,1] //列下标为1的所有元素 子区域&#xff1a;[…...

生存网络与mlr3proba

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

C#与AI的共同发展

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

2000-2020年各省第二产业增加值数据

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

【MySQL】 库的操作

欢迎拜访&#xff1a;雾里看山-CSDN博客 本篇主题&#xff1a;【MySQL】 库的操作 发布时间&#xff1a;2025.1.23 隶属专栏&#xff1a;MySQL 目录 库的创建语法使用 编码规则认识编码集查看数据库默认的编码集和校验集查看数据库支持的编码集和校验集指定编码创建数据库验证不…...

docker 启动镜像命令集合

安装rabbitmq 参考地址&#xff1a; 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 程序时&#xff0c;数据都是存储在内存中的&#xff0c;属于临时存储&#xff0c;当程序停止或重启时&#xff0c;内存中的数据就会丢失&#xff0c;我们为了解决数据的长期存储问题&#xff0c;有以下解决方案&#xff1a; 通过 IO流书记&…...

联想电脑怎么设置u盘启动_联想电脑设置u盘启动方法(支持新旧机型)

有很多网友问联想电脑怎么设置u盘启动&#xff0c;联想电脑设置u盘启动的方法有两种&#xff0c;一是通过bios进行设置。二是通过快捷方式启动进入u盘启动。但需要注意有两种引导模式是&#xff0c;一种是uefi引导&#xff0c;一种是传统的leacy引导&#xff0c;所以需要注意制…...

C# 解析 HTML 实战指南

在网页开发和数据处理的场景中&#xff0c;经常需要从 HTML 文档里提取有用的信息。C# 作为一门强大的编程语言&#xff0c;提供了丰富的工具和库来实现 HTML 的解析。这篇博客就带你深入了解如何使用 C# 高效地解析 HTML。 一、为什么要在 C# 中解析 HTML 在实际项目中&…...

观成科技:隐蔽隧道工具Ligolo-ng加密流量分析

1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具&#xff0c;该工具基于TUN接口实现其功能&#xff0c;利用反向TCP/TLS连接建立一条隐蔽的通信信道&#xff0c;支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式&#xff0c;适应复杂网…...

Cursor实现用excel数据填充word模版的方法

cursor主页&#xff1a;https://www.cursor.com/ 任务目标&#xff1a;把excel格式的数据里的单元格&#xff0c;按照某一个固定模版填充到word中 文章目录 注意事项逐步生成程序1. 确定格式2. 调试程序 注意事项 直接给一个excel文件和最终呈现的word文件的示例&#xff0c;…...

【力扣数据库知识手册笔记】索引

索引 索引的优缺点 优点1. 通过创建唯一性索引&#xff0c;可以保证数据库表中每一行数据的唯一性。2. 可以加快数据的检索速度&#xff08;创建索引的主要原因&#xff09;。3. 可以加速表和表之间的连接&#xff0c;实现数据的参考完整性。4. 可以在查询过程中&#xff0c;…...

Python:操作 Excel 折叠

💖亲爱的技术爱好者们,热烈欢迎来到 Kant2048 的博客!我是 Thomas Kant,很开心能在CSDN上与你们相遇~💖 本博客的精华专栏: 【自动化测试】 【测试经验】 【人工智能】 【Python】 Python 操作 Excel 系列 读取单元格数据按行写入设置行高和列宽自动调整行高和列宽水平…...

visual studio 2022更改主题为深色

visual studio 2022更改主题为深色 点击visual studio 上方的 工具-> 选项 在选项窗口中&#xff0c;选择 环境 -> 常规 &#xff0c;将其中的颜色主题改成深色 点击确定&#xff0c;更改完成...

2.Vue编写一个app

1.src中重要的组成 1.1main.ts // 引入createApp用于创建应用 import { createApp } from "vue"; // 引用App根组件 import App from ./App.vue;createApp(App).mount(#app)1.2 App.vue 其中要写三种标签 <template> <!--html--> </template>…...

MODBUS TCP转CANopen 技术赋能高效协同作业

在现代工业自动化领域&#xff0c;MODBUS TCP和CANopen两种通讯协议因其稳定性和高效性被广泛应用于各种设备和系统中。而随着科技的不断进步&#xff0c;这两种通讯协议也正在被逐步融合&#xff0c;形成了一种新型的通讯方式——开疆智能MODBUS TCP转CANopen网关KJ-TCPC-CANP…...

Python如何给视频添加音频和字幕

在Python中&#xff0c;给视频添加音频和字幕可以使用电影文件处理库MoviePy和字幕处理库Subtitles。下面将详细介绍如何使用这些库来实现视频的音频和字幕添加&#xff0c;包括必要的代码示例和详细解释。 环境准备 在开始之前&#xff0c;需要安装以下Python库&#xff1a;…...

在鸿蒙HarmonyOS 5中使用DevEco Studio实现录音机应用

1. 项目配置与权限设置 1.1 配置module.json5 {"module": {"requestPermissions": [{"name": "ohos.permission.MICROPHONE","reason": "录音需要麦克风权限"},{"name": "ohos.permission.WRITE…...

OpenLayers 分屏对比(地图联动)

注&#xff1a;当前使用的是 ol 5.3.0 版本&#xff0c;天地图使用的key请到天地图官网申请&#xff0c;并替换为自己的key 地图分屏对比在WebGIS开发中是很常见的功能&#xff0c;和卷帘图层不一样的是&#xff0c;分屏对比是在各个地图中添加相同或者不同的图层进行对比查看。…...