Editor Scripting学习笔记之Menu Item

主要用到:
    MenuItem属性
    MenuCommand参数
可能用到:
    EditorApplicationSelectionGameObjectUtilityFileUtilUndo类
    以及各种工具类,视情况而定


Menu Item是编辑器扩展中最简单的一种扩展方式,主要用于对常用操作进行封装,使之成为菜单,方便调用。用法非常简单,直接上代码

using UnityEngine;
using UnityEditor;

public class MenuTest
{
    // Add a menu item to create custom GameObjects.
    [MenuItem ("GameObject/MyCategory/Custom GameObject #g", false, 10)]
    static void CreateCustomGameObject (MenuCommand command)
    {
        // Create a custom game object
        GameObject go = new GameObject ("Custom GameObject");

        // 如果当前有选择的游戏对象时,让go作为该游戏对象的子对象;否则为顶层对象
        GameObjectUtility.SetParentAndAlign (go, Selection.activaObject);

        // Register the creation in the undo system
        Undo.RegisterCreatedObjectUndo (go, "Create " + go.name);
        Selection.activeObject = go;
    }
}

其中,对于这种扩展方式,需要注意的只有5点:

  1. 特殊菜单项:
  2. 快捷键
  3. 是否是验证函数
  4. 优先级
  5. 传递的参数

下面就对这些注意点做出一些解释

特殊菜单项包括CONTEXT。因为MenuItem主要对主菜单和Inspector中组件的context菜单进行定制

快捷键有:%(ctrl/cmd) #(shift) &(alt) _ 这4个特殊字符,还有LEFT, RIGHT, UP, DOWN, F1, F2, ..., F12, HOME, END, PGUP, PGDN

MenuItem属性的第2个参数用来决定下面的函数是否为验证函数,true为验证函数,false为非验证函数(默认)。验证函数返回true时,该菜单项才可用。

MenuItem属性的第3个参数用来控制优先级。Unity会自动根据你指定的优先级大小进行排序,优先级小的菜单在上面,优先级大的菜单在下面。如果相邻的两个菜单项之间的优先级相差超过10,那么会自动在这两个菜单项中间插入一个分隔符。系统本身的菜单项的优先级可以通过一些工具来查看,比如.net的Reflector。但好像并不能查看所有的菜单项的优先级,只有Window下面的一些菜单可以查到,别的菜单我是没有查出来。

另外,函数可以传递一个MenuCommand类型的参数,该参数主要用于context类型的菜单,比如Hierarchy视图和Project视图中的右键菜单以及Inspector面板中组件的菜单。可以使用该参数中的context字段来获取该菜单命令的作用对象。


相关类的使用:

ContextMenu属性的使用(等同于MenuItem (CONTEXT/ComponentName/...), 同样是实例函数) ContextMenuItem属性的使用(注意该函数是实例函数而不再是静态函数)

下面就来实战一下,我会在主菜单中定制一个工具,用来切换场景(这样就不用在Project视图中查找了)

using UnityEngine;
using UnityEditor;
using System.Collections;

public class SwitchScene
{
    [MenuItem ("OpenScene/StartScene")]
    public static void StartScene ()
    {
        EditorApplication.SaveCurrentSceneIfUserWantsTo ();
        EditorApplication.OpenScene ("Assets/Scenes/StartScene.unity");
    }

    [MenuItem ("OpenScene/MainScene")]
    public static void MainScene ()
    {
        EditorApplication.SaveCurrentSceneIfUserWantsTo ();
        EditorApplication.OpenScene ("Assets/Scenes/MainScene.unity");
    }

    [MenuItem ("OpenScene/LoseScene")]
    public static void LoseScene ()
    {
        EditorApplication.SaveCurrentSceneIfUserWantsTo ();
        EditorApplication.OpenScene ("Assets/Scenes/LoasScene.unity");
    }

    [MenuItem ("OpenScene/WinScene")]
    public static void WinScene ()
    {
        EditorApplication.SaveCurrentSceneIfUserWantsTo ();
        EditorApplication.OpenScene ("Assets/Scenes/WinScene.unity");
    }
}

这个只是一个很简单的例子,项目中有四个场景文件,然后自定义一个菜单工具在这四个场景之间切换。当然,也可以使用C#中的一些文件操作来动态查找项目中的场景文件(后缀名为.unity),然后提取路径,把该路径做相应处理后作为参数传递给MenuItem和OpenScene,这样就可以动态地改变菜单项了。(由于本人C#基础不太好,目前正在学习中,所以就没有实现该功能。随后,我会翻看一下C#中的文件相关的类,来实现该功能)

好吧,我承认的确不是那么容易实现的,没有方法动态创建函数,并且MenuItem好像也不能用在函数里面。这个问题先放这吧,以后有解决办法在写出来吧。

时间: 2024-11-08 21:48:43

Editor Scripting学习笔记之Menu Item的相关文章

Android学习笔记之Menu的ShowAsAction属性的设置

(1)在res--menu目录下的main.xml文件 <menu xmlns:android="http://schemas.android.com/apk/res/android" > <item android:id="@+id/file" android:orderInCategory="100" android:showAsAction="always" android:title="文件

Android学习笔记之Menu一级菜单、二级菜单的使用

(1)布局文件没有做更改 (2)在res--menu目录下的main.xml文件中代码如下: <menu xmlns:android="http://schemas.android.com/apk/res/android" > <!-- 一级菜单 --> <item android:id="@+id/file" android:title="@string/file"> <!-- 二级菜单 -->

Effective C++学习笔记(Part Seven:Item 41-48)

 最近终于把effectvie C++仔细的阅读了一边,很惊叹C++的威力与魅力.最近会把最近的读书心得与读书笔记记于此,必备查找使用,如果总结有什么不当之处,欢迎批评指正: 现在只列出框架,最近会尽快填充完整: 第7部分:模板与泛型编程 所谓泛型编程就是以独立于任何特定类型的方式编写代码.使用泛型程序时,我们需要提供具体程序实例所操作的类型或值.模板是泛型编程思想的一种实现,也是C++研发者思想精髓所在. 条款41:了解隐式接口和编译器多态 条款42:了解typename的双重含义 条款4

android学习笔记37——Menu资源

Menu菜单资源 android应用推荐使用XML来定义菜单,其可提供更好的解耦方式. 菜单资源通常位于res/menu文件夹下,其菜单根元素为<menu.../>,menu元素下可包含子元素如下: <item.../>子元素 定义菜单项 <group.../>子元素 将多个<item>定义的菜单项包装成一个菜单组 <group.../>子元素 用于控制整个菜单组的行为,该元素可指定如下常用属性: checkableBehavior menuCa

Effective C++学习笔记(Part Six:Item 32-40)

 最近终于把effectvie C++仔细的阅读了一边,很惊叹C++的威力与魅力.最近会把最近的读书心得与读书笔记记于此,必备查找使用,如果总结有什么不当之处,欢迎批评指正: 现在只列出框架,最近会尽快填充完整: 第6部分:继承与面向对象设计 面向对象语言有三大特性:继承,封装和多态.遥想当年,每次校招笔试的时候都会有的,但能够甚至这六个字内涵的人,不再多数.本部分概括的说,深入的讲解三大特性之一----继承性.本部分花的时间不少,也感觉挺有意思的.特别是针对某个条款编写个具体程序实现后,明

Effective C++学习笔记(Part Two:Item 5-12)

?? 近期最终把effectvie C++细致的阅读了一边,非常惊叹C++的威力与魅力.近期会把近期的读书心得与读书笔记记于此.必备查找使用,假设总结有什么不当之处,欢迎批评指正: 如今仅仅列出框架.近期会尽快填充完整: 第2部分:构造/析构/赋值运算 个人觉得这是C++的比較难理解的地方,也是C++的深邃所在,刚開始阅读时,可能在某些地方不理解,最好的方式是边读边编程实现,用心去思考其精髓所在! 条款5:了解C++默默编写并调用那些函数 条款6:若不想使用编译器自己主动生成的函数,就该明白拒绝

Effective C++学习笔记(Part Three:Item 13-17)

 最近终于把effectvie C++仔细的阅读了一边,很惊叹C++的威力与魅力.最近会把最近的读书心得与读书笔记记于此,必备查找使用,如果总结有什么不当之处,欢迎批评指正: 现在只列出框架,最近会尽快填充完整: 第3部分:资源管理(Resource Management) 个人认为这是C++的比较关键的地方,利用好,可以使项目节约资源,合理利用内存资源,防止内存泄露.对于"资源"这两个字,可能刚接触,比较抽象,但你结合一下实际,也有很具体了! 条款13:以对象管理资源 条款14:

Effective C++学习笔记(Part Four:Item 18-25)

 最近终于把effectvie C++仔细的阅读了一边,很惊叹C++的威力与魅力.最近会把最近的读书心得与读书笔记记于此,必备查找使用,如果总结有什么不 当之处,欢迎批评指正: 现在只列出框架,最近会尽快填充完整: 第4部分:设计与申明(Designs and Declarations) 本部分主要讲述了类的设计原则以及设计规则,以及成员命令.成员函数设计时,应该注意的一些地方:个人感觉这是设计好一个类必不可少的. 条款18:让接口容易本正确使用,不易被误用 条款19:设计class犹如设计

Effective C++学习笔记(Part Five:Item 26-31)

 最近终于把effectvie C++仔细的阅读了一边,很惊叹C++的威力与魅力.最近会把最近的读书心得与读书笔记记于此,必备查找使用,如果总结有什么不 当之处,欢迎批评指正: 现在只列出框架,最近会尽快填充完整: 第5部分:实现(Implementations) 本部分主要讲述了类实现过程中的一些原则,为设计出高效率的实现方式,这是你的必经之路:在这一部分读的比较仔细,因为本人在类型转换这方面吃了不少苦头. 条款26:尽可能延后变量定义式的出现时间 条款27:尽量少做转型动作 条款28:避