当前位置: 首页 > 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 在实际项目中&…...

日语AI面试高效通关秘籍:专业解读与青柚面试智能助攻

在如今就业市场竞争日益激烈的背景下&#xff0c;越来越多的求职者将目光投向了日本及中日双语岗位。但是&#xff0c;一场日语面试往往让许多人感到步履维艰。你是否也曾因为面试官抛出的“刁钻问题”而心生畏惧&#xff1f;面对生疏的日语交流环境&#xff0c;即便提前恶补了…...

利用ngx_stream_return_module构建简易 TCP/UDP 响应网关

一、模块概述 ngx_stream_return_module 提供了一个极简的指令&#xff1a; return <value>;在收到客户端连接后&#xff0c;立即将 <value> 写回并关闭连接。<value> 支持内嵌文本和内置变量&#xff08;如 $time_iso8601、$remote_addr 等&#xff09;&a…...

连锁超市冷库节能解决方案:如何实现超市降本增效

在连锁超市冷库运营中&#xff0c;高能耗、设备损耗快、人工管理低效等问题长期困扰企业。御控冷库节能解决方案通过智能控制化霜、按需化霜、实时监控、故障诊断、自动预警、远程控制开关六大核心技术&#xff0c;实现年省电费15%-60%&#xff0c;且不改动原有装备、安装快捷、…...

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

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

如何将联系人从 iPhone 转移到 Android

从 iPhone 换到 Android 手机时&#xff0c;你可能需要保留重要的数据&#xff0c;例如通讯录。好在&#xff0c;将通讯录从 iPhone 转移到 Android 手机非常简单&#xff0c;你可以从本文中学习 6 种可靠的方法&#xff0c;确保随时保持连接&#xff0c;不错过任何信息。 第 1…...

让AI看见世界:MCP协议与服务器的工作原理

让AI看见世界&#xff1a;MCP协议与服务器的工作原理 MCP&#xff08;Model Context Protocol&#xff09;是一种创新的通信协议&#xff0c;旨在让大型语言模型能够安全、高效地与外部资源进行交互。在AI技术快速发展的今天&#xff0c;MCP正成为连接AI与现实世界的重要桥梁。…...

[Java恶补day16] 238.除自身以外数组的乘积

给你一个整数数组 nums&#xff0c;返回 数组 answer &#xff0c;其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法&#xff0c;且在 O(n) 时间复杂度…...

如何理解 IP 数据报中的 TTL?

目录 前言理解 前言 面试灵魂一问&#xff1a;说说对 IP 数据报中 TTL 的理解&#xff1f;我们都知道&#xff0c;IP 数据报由首部和数据两部分组成&#xff0c;首部又分为两部分&#xff1a;固定部分和可变部分&#xff0c;共占 20 字节&#xff0c;而即将讨论的 TTL 就位于首…...

人工智能(大型语言模型 LLMs)对不同学科的影响以及由此产生的新学习方式

今天是关于AI如何在教学中增强学生的学习体验&#xff0c;我把重要信息标红了。人文学科的价值被低估了 ⬇️ 转型与必要性 人工智能正在深刻地改变教育&#xff0c;这并非炒作&#xff0c;而是已经发生的巨大变革。教育机构和教育者不能忽视它&#xff0c;试图简单地禁止学生使…...

C#中的CLR属性、依赖属性与附加属性

CLR属性的主要特征 封装性&#xff1a; 隐藏字段的实现细节 提供对字段的受控访问 访问控制&#xff1a; 可单独设置get/set访问器的可见性 可创建只读或只写属性 计算属性&#xff1a; 可以在getter中执行计算逻辑 不需要直接对应一个字段 验证逻辑&#xff1a; 可以…...