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.快捷键开关");}}
}

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

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

相关文章

docker 安装 mysql 详解

在平常的开发工作中,我们经常需要用到 mysql 数据库。那么在docker容器中,应该怎么安装mysql数据库呢。简单来说,第一步:拉取镜像;第二步:创建挂载目录并设置 my.conf;第三步:启动容…

linux-samba服务配置与应用

1.了解samba的配置文件 2.熟悉samba服务的实例 以前我们在windows上共享文件的话,只需右击要共享的文件夹,然后选择共享相关的选项设置即可,然后如何实现windows和linux的文件共享呢,这就涉及到了samba服务,这个软件…

Spring Boot 整合 Redis 步骤详解

文章目录 1. 引言2. 添加依赖3. 配置 Redis 连接信息4. 创建 Redis 操作服务类5. 使用 RedisTemplate 或 ReactiveRedisTemplate6. 测试 Redis 功能7. 注意事项8. 总结 Redis 是一个高性能的键值存储系统,常用于缓存、消息队列等多种场景。将 Redis 与 Spring Boot …

缓存商品、购物车(day07)

缓存菜品 问题说明 问题说明:用户端小程序展示的菜品数据都是通过查询数据库获得,如果用户端访问量比较大,数据库访问压力随之增大。 结果: 系统响应慢、用户体验差 实现思路 通过Redis来缓存菜品数据,减少数据库查询…

C++ 在2D与3D游戏的开发库

在当今的游戏开发领域,C++以其高效性、灵活性和强大的性能成为众多开发者首选的语言之一。 C++游戏库流行程度排行榜单 Unreal Engine - 因其全面的功能集和易用性成为最受欢迎的3D引擎之一。Cocos2d-x - 在移动2D游戏开发领域占据重要位置,因其高效性能和易用性而备受推崇…

K8S中Service详解(三)

HeadLiness类型的Service 在某些场景中,开发人员可能不想使用Service提供的负载均衡功能,而希望自己来控制负载均衡策略,针对这种情况,kubernetes提供了HeadLiness Service,这类Service不会分配Cluster IP,…

npm install 报错:Command failed: git checkout 2.2.0-c

[TOC](npm install 报错:Command failed: git checkout 2.2.0-c) npm install 报错:Command failed: git checkout 2.2.0-c export NODE_HOME/usr/local/node-v14.14.0-linux-x64 npm config set registry https://registry.npmmirror.com 使用如上环…

DDD - 微服务落地的技术实践

文章目录 Pre概述如何发挥微服务的优势怎样提供微服务接口原则微服务的拆分与防腐层的设计 去中心化的数据管理数据关联查询的难题Case 1Case 2Case 3 总结 Pre DDD - 软件退化原因及案例分析 DDD - 如何运用 DDD 进行软件设计 DDD - 如何运用 DDD 进行数据库设计 DDD - 服…

【Leetcode 热题 100】763. 划分字母区间

问题背景 给你一个字符串 s s s。我们要把这个字符串划分为尽可能多的片段,同一字母最多出现在一个片段中。 注意,划分结果需要满足:将所有划分结果按顺序连接,得到的字符串仍然是 s s s。 返回一个表示每个字符串片段的长度的…

ChatGPT是强人工智能吗?

ChatGPT是强人工智能吗? 本文从人工智能发展的三个阶段的角度,分析当前强大的AI大模型所处的阶段,并通过对比各阶段的定义,明确各阶段的特点和未来发展方向; Narrow AI(弱人工智能)、AGI(人工通用智能)和 ASI(人工超级…

通过视觉语言模型蒸馏进行 3D 形状零件分割

大家读完觉得有帮助记得关注和点赞!!!对应英文要求比较高,特此说明! Abstract This paper proposes a cross-modal distillation framework, PartDistill, which transfers 2D knowledge from vision-language models …

深入探索 Nginx 的高级用法:解锁 Web 服务器的强大潜能

在当下互联网技术飞速发展的浪潮中,Nginx 凭借其轻量级、高性能的特性,在 Web 服务器和反向代理服务器领域脱颖而出,成为众多开发者和运维工程师的得力工具。它不仅能高效处理静态资源,在负载均衡、反向代理等方面也表现出色。然而…

【大模型】ChatGPT 高效处理图片技巧使用详解

目录 一、前言 二、ChatGPT 4 图片处理介绍 2.1 ChatGPT 4 图片处理概述 2.1.1 图像识别与分类 2.1.2 图像搜索 2.1.3 图像生成 2.1.4 多模态理解 2.1.5 细粒度图像识别 2.1.6 生成式图像任务处理 2.1.7 图像与文本互动 2.2 ChatGPT 4 图片处理应用场景 三、文生图操…

从零到一:Spring Boot 与 RocketMQ 的完美集成指南

1.Rocket的概念与原理 RocketMQ 是一款由阿里巴巴开源的分布式消息中间件,最初用于支持阿里巴巴的海量业务。它基于发布-订阅模型,具备高吞吐、低延迟、高可用和强一致性的特点,适用于消息队列、大规模数据流处理等场景。以下是对 RocketMQ …

mysql数据库启动出现Plugin ‘FEEDBACK‘ is disabled.问题解决记录

本人出现该问题的环境是xampp,异常关机,再次在xampp控制面板启动mysql出现该问题。出现问题折腾数据库之前,先备份数据,将mysql目录下的data拷贝到其他地方,这很重要。 然后开始折腾。 查资料,会发现很多…

MySQL日期时间函数详解

简介 本文主要讲解MySQL中的日期时间函数,包括:NOW、CURRENT_TIMESTAMP、CURDATE、CURRENT_DATE、CURTIME、CURRENT_TIME、STR_TO_DATE、DATE_FORMAT、TIME_FORMAT、DATE、TIME、YEAR、MONTH、DAY、HOUR、MINUTE、SECOND、QUARTER、YEARWEEK、WEEKDAY、…

ChatGPT 写作系列

ChatGPT 辅助写作 | 专栏 1 写作核心​ 先讲一下 ChatGPT 写作的核心。核心就是需要有文章大纲,而且文章大纲要足够细致。​ 具体怎么做呢?​ 提前准备多级标题大纲,刚开始有两个级别的标题就行,等用熟练了再细化。分一级标题&…

(1)STM32 USB设备开发-基础知识

开篇感谢: 【经验分享】STM32 USB相关知识扫盲 - STM32团队 ST意法半导体中文论坛 单片机学习记录_桃成蹊2.0的博客-CSDN博客 USB_不吃鱼的猫丿的博客-CSDN博客 1、USB鼠标_哔哩哔哩_bilibili usb_冰糖葫的博客-CSDN博客 USB_lqonlylove的博客-CSDN博客 USB …

【Java】Java抛异常到用户界面公共封装

前言 在Java中处理代码运行异常是常见的技术点之一,我们大部分会使用封装的技巧将异常进行格式化输出,方便反馈给用户界面,也是为了代码复用 看看这行代码是怎么处理异常的 CommonExceptionType.SimpleException.throwEx("用户信息不…

mkv转码mp4(ffmpeg工具)

基于windows,Linux也可以用,都是命令行 下载路径(https://github.com/BtbN/FFmpeg-Builds/releases) 下载安装包:ffmpeg-n6.1-latest-win64-lgpl-6.1.zip,(根据自己的平台选择下载)并…