Editor_MenuItem学习01

本文介绍如何在Unity中创建自定义编辑器菜单项,包括菜单栏中的新选项、系统内部菜单项、针对特定组件的上下文菜单等,并提供具体实现代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

using UnityEditor;

public class Edit_Tools 
{
    /*开始之路,1.有project中建立Editor文件,建立脚本
    2.导入using UnityEditor;
     3. 要使用到MenuItem这个类,引号里面的就菜单的目录
    */
    //把按钮添加到菜单栏[新的一个]
    [MenuItem("EditTools/ShowTest")]
   static void ShowTest()
    {
        Debug.LogError("show");
    }
    [MenuItem("EditTools/ShowTestNew",false,15)]
    static void ShowTestNew()
    {
        Debug.LogWarning("MenuItem 最后一个参数是 显示的优先集,相差11 之后就会出一条线");
    }

    //把按钮添加到菜单栏[系统内部]
    [MenuItem("Window/ShowWindowTool")]
    static void WindowTools()
    {
        Debug.LogWarning("系统内置那一栏的");
    }

    [MenuItem("Assets/assetbuttonShow")]
    static void ShowAssetsButton()
    {
        Debug.LogWarning("Assest 内置那一栏的,在Project中右击可以出现");
    }

    [MenuItem("GameObject/ShowMyGO",false,10)]
    static void ShowGameObjectButton()
    {
        Debug.LogWarning("GameObject 内置那一栏的,在Hierarch视图中右击可以出现,第三个参数在10左右才能出现");
    }
}

自定义的EditTools,大于11会出一条横线

Hierarchy视图,第三个参数为10

Project视图


 //------------------------------------------------
    [MenuItem("CONTEXT/PlayerHealth/ModifyHealth")]
    static void ScriptAddComponent()
    {
        Debug.LogError("在属性面板针对某一脚本右键显示出ModifyHealth,进行操作");
    }

这里写图片描述

//自己写的脚本,很多地方用到,很多值,一个个输入,麻烦,直接用Editor操作
[MenuItem("CONTEXT/PlayerHealth/ModifyHealthValue")]
    static void ScriptComponentHealth(MenuCommand cmd)//cmd当前操作的组件
    {
        Debug.LogError("修改值啦,类型="+cmd.context.GetType().FullName);//得到名字,有些有命名空间的
        CompleteProject.PlayerHealth helath = (CompleteProject.PlayerHealth)cmd.context;
        helath.startingHealth = 10;//修改健康值
        helath.flashSpeed = 10;        
    }
    [MenuItem("CONTEXT/Rigidbody/ClearMass")]//清除重力
    static void CleartMassAndGravity(MenuCommand cmd)
    {
        Rigidbody rb = cmd.context as Rigidbody;
        rb.mass = 0;
        rb.useGravity = false;
        Debug.LogError("清除组件的重力");
    }
<think>好的,我现在要回答用户关于UNITY_EDITOR宏在Unity中的作用和应用场景的问题。首先,我需要回忆自己对这个宏的了解。记得在Unity开发中,UNITY_EDITOR是一个预处理器指令,用于区分编辑器环境和运行时环境。用户可能想知道这个宏的具体用途,比如在代码中如何用它来控制某些代码块只在编辑模式下执行。 接下来,我需要确保回答的结构清晰。用户的问题有两个部分:作用和应用场景。应该先解释UNITY_EDITOR是什么,然后说明它的作用,再列举应用场景。同时,用户要求用中文回答,并且需要生成相关问题,还要注意引用格式。系统级指令中提到要使用正确的LaTeX格式,但这个问题可能不涉及数学公式,所以暂时不需要处理这点。但如果有变量或代码,需要用行内代码格式。 首先,UNITY_EDITOR宏的作用是条件编译,即在编辑器中执行的代码与构建后的版本分开。这可以避免在发布版本中包含只在编辑器中使用的代码,比如工具脚本或者调试信息。需要举例子,比如使用#if UNITY_EDITOR包裹的代码块,在构建时不会被包含进去。 然后,应用场景可能包括:编辑器扩展开发、调试辅助工具、防止发布时包含不必要代码、自动化测试等。例如,在自定义Inspector面板时,可能需要使用UNITY_EDITOR来确保相关代码仅在编辑器中生效。另外,在场景加载或资源管理时,可能只在编辑器中执行某些初始化操作。 需要注意,UNITY_EDITOR只在Unity编辑器中定义,所以在构建后的游戏(如WebGL、移动平台)中不会定义该宏。因此,任何依赖于UNITY_EDITOR的代码在构建后都不会执行,这有助于优化最终包体大小和性能。 可能还需要提到相关的命名空间,比如UnityEditor命名空间中的类只能在编辑器中使用,因此也需要用UNITY_EDITOR宏来包裹,否则在构建时会报错。例如,使用EditorWindow或MenuItem特性时,必须将这些代码放在UNITY_EDITOR条件编译块中,否则无法成功构建。 用户提供的引用中,引用[2]提到Editor编程笔记,可能涉及如何修改编辑器菜单、窗口等,这正好和UNITY_EDITOR的应用场景相关。可以引用这一点来说明在编辑器扩展开发中的应用。例如,引用[2]提到修改菜单栏和窗口,这通常需要使用UnityEditor命名空间中的API,而这些API只能在编辑器模式下使用,因此必须用UNITY_EDITOR宏包裹。 另外,引用[3]提到Unity发布WebGL时的界面处理,测试用的UI需要在发布时移除。这时可以使用UNITY_EDITOR宏来包裹测试UI的代码,确保发布后不包含这些元素。例如,在测试时创建的UI控件可以放在#if UNITY_EDITOR块中,这样构建WebGL时自动排除这些代码,保持界面统一。 需要确保回答中的代码示例正确,比如展示#if UNITY_EDITOR的使用方法,并说明其效果。同时,注意区分编辑器和运行时行为,避免混淆。 最后,生成相关问题时要围绕UNITY_EDITOR的扩展使用、与其他宏的区别、处理依赖UnityEditor的代码的方法,以及实际应用案例。比如,如何区分不同平台,或者如何处理在编辑器中的资源加载问题。 总结步骤: 1. 解释UNITY_EDITOR宏的基本作用:条件编译,区分编辑器和运行时。 2. 详细说明其作用,包括代码隔离、优化构建等。 3. 列举典型应用场景,如编辑器工具开发、调试代码、自动化处理等。 4. 提供代码示例,展示如何使用该宏。 5. 引用提供的资料,说明在编辑器扩展和WebGL发布中的应用。 6. 生成相关问题,引导用户进一步学习。</think>### UNITY_EDITOR宏的作用及应用场景 #### 1. **基本作用** `UNITY_EDITOR` 是 Unity 引擎中的一个预处理器宏,用于**区分编辑器环境与运行时环境**。通过条件编译(`#if UNITY_EDITOR`),开发者可以控制某些代码仅在 Unity 编辑器中执行,而不会包含在最终发布的构建版本中[^1]。 #### 2. **核心用途** - **隔离编辑器专用代码**: 例如,工具脚本、自定义 Inspector 面板的扩展代码或调试功能需仅在编辑模式下运行。使用 `UNITY_EDITOR` 宏包裹这些代码,可避免构建时因依赖编辑器 API 而报错。 ```csharp #if UNITY_EDITOR using UnityEditor; #endif public class Example : MonoBehaviour { #if UNITY_EDITOR void OnValidate() { EditorUtility.DisplayDialog("提示", "仅在编辑器中触发", "OK"); } #endif } ``` - **优化构建体积与性能**: 避免发布版本包含仅在编辑器中使用的逻辑(如自动化测试、资源导入处理),减少包体大小并提升运行时效率[^2]。 #### 3. **典型应用场景** - **编辑器扩展开发**: 使用 `UnityEditor` 命名空间中的类(如 `EditorWindow`、`MenuItem`)时,必须通过 `UNITY_EDITOR` 宏隔离代码,否则构建会失败。 ```csharp #if UNITY_EDITOR [MenuItem("Tools/自定义功能")] static void MyTool() { // 编辑器菜单功能 } #endif ``` - **调试与测试**: 在编辑器中临时添加的日志输出、性能检测或快捷键功能,可通过宏快速启用/禁用。 - **资源与场景管理**: 例如,仅在编辑器中预加载资源或生成占位符对象,避免影响运行时逻辑。 - **发布时剔除测试代码**: 如引用[3]所述,开发阶段用于测试的 UI 或交互逻辑需在发布时移除,通过宏可自动屏蔽相关代码。 #### 4. **注意事项** - **命名空间依赖**: `UnityEditor` 中的类(如 `Editor`、`AssetDatabase`)仅在编辑器中可用,必须与 `UNITY_EDITOR` 宏配合使用。 - **与其他宏的协作**: 可结合 `UNITY_ANDROID`、`UNITY_IOS` 等平台宏,实现更细粒度的条件编译。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值