利用unity的MenuItem给自己的编辑器增加一点定制选项

本文介绍如何使用Unity的MenuItem特性来扩展编辑器的功能,包括创建菜单项、验证选择、快捷键绑定及对特定组件操作的方法。

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

MenuItem是unity自带的特性,利用它我们可以方便的在编辑器里面加加入一些功能,以下是一些常用功能的总结,注意,需要把文件放在Assets下的Editor文件夹下.

using UnityEngine;
using UnityEditor;
using System.Collections;

public class MenuTest : MonoBehaviour {
    /// <summary>
    /// 增加一个MyMenu菜单下的show选项
    /// </summary>
    [MenuItem("MyMenu/show")]
    static void Show() {
        print("haha");
    }
    /// <summary>
    /// 增加一个MyMenu菜单下的printName选项,并且只有选中物体时才可以
    /// </summary>
    [MenuItem("MyMenu/ShowSelectedName")]
    static void PrintName() {
        print("Selected Transform name is " + Selection.activeTransform.gameObject.name);
    }
    [MenuItem("MyMenu/ShowSelectedName", true)]
    static bool Validate() {
        return Selection.activeTransform != null;
    }
    /// <summary>
    /// 添加一个选项,并且指定快捷方式为ctrl + G,%代表Ctrl键(mac机上面是cmd键)  #代表Shirt键   &代表Alt键
    /// </summary>
    [MenuItem("MyMenu/shortCutKey % g")]
    static void DoSomethingWithAShortcutKey() {
        print("push down ctrl + g");
    }
    /// <summary>
    /// 给刚体组件的菜单增加一个double选项
    /// </summary>
    /// <param name="command"></param>
    [MenuItem("CONTEXT/Rigidbody/Double Mass")]
    static void DoubleMass(MenuCommand command) {
        Rigidbody body = (Rigidbody)command.context;
        body.mass = body.mass * 2;
        print("double mass to " + body.mass);
    }
    /// <summary>
    /// 在GameObject的子菜单下新建目录选项,并设置撤销新建时的提示
    /// </summary>
    /// <param name="menuCommand"></param>
    [MenuItem("GameObject/MyCategory/Custom Game Object", false, 10)]
    static void CreateCustomGameObject(MenuCommand menuCommand) {
        GameObject go = new GameObject("Custom Game Object");
        GameObjectUtility.SetParentAndAlign(go, menuCommand.context as GameObject);
        Undo.RegisterCreatedObjectUndo(go, "Create " + go.name);
        Selection.activeGameObject = go;
    }
}
### Unity 编辑器脚本开发教程 #### 自定义功能概述 Unity 提供了一种强大的机制,允许开发者通过 C# 脚本来扩展其编辑器的功能。这种扩展可以通过多种方式实现,比如创建自定义窗口、面板、工具栏按钮以及菜单项等[^1]。 以下是有关如何在 Unity 中编写编辑器脚本并实现自定义功能的具体说明: --- #### 创建自定义编辑器窗口 要创建一个自定义的编辑器窗口,可以继承 `EditorWindow` 类,并使用 `[MenuItem]` 属性将其注册到 Unity菜单系统中。下面是一个简单的例子,展示如何创建一个带有简单 GUI 功能的自定义窗口[^2]: ```csharp using UnityEditor; using UnityEngine; public class CustomEditorWindow : EditorWindow { string inputText = "请输入文字"; [MenuItem("Tools/打开自定义窗口")] public static void ShowWindow() { GetWindow<CustomEditorWindow>("我的自定义窗口"); } private void OnGUI() { GUILayout.Label("这是一个自定义窗口", EditorStyles.boldLabel); inputText = EditorGUILayout.TextField("输入框:", inputText); if (GUILayout.Button("点击显示")) { Debug.Log($"你输入的内容是: {inputText}"); } } } ``` 上述代码会向 Unity 的 Tools 菜单添加一项名为“打开自定义窗口”的选项。当用户选择该选项时,将弹出自定义窗口。 --- #### 使用属性控制编辑器行为 为了进一步定制编辑器的行为,可以利用各种特性(Attributes)。这些特性可以帮助标记字段或方法,从而改变它们在 Inspector 面板中的表现形式。例如,`[HideInInspector]` 可用于隐藏某些变量不被显示;而 `[Range(min, max)]` 则能限定数值范围。 --- #### 生命周期管理 对于复杂的场景需求来说,掌握编辑器本身的生命周期非常重要。Unity 提供了一些静态成员函数来帮助检测当前所处的状态,像是否正在播放游戏 (`isPlaying`) 或者暂停状态 (`isPaused`) 等都可以借助于 `EditorApplication` 进行查询[^3]。 示例代码如下所示: ```csharp if (EditorApplication.isPlaying) { Debug.Log("当前处于 Play 模式."); } if (EditorApplication.isPaused) { Debug.Log("当前已暂停."); } ``` --- #### 导入第三方插件支持 如果不想完全从零构建所有的编辑器组件,则可以直接引入现成的解决方案——例如 “Unity Editor Toolbox”。只需按照官方文档指引完成安装操作即可快速获得一系列预制好的实用工具集[^4]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值