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

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好像也不能用在函数里面。这个问题先放这吧,以后有解决办法在写出来吧。

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

  1. android学习笔记37——Menu资源

    Menu菜单资源 android应用推荐使用XML来定义菜单,其可提供更好的解耦方式. 菜单资源通常位于res/menu文件夹下,其菜单根元素为<menu.../>,menu元素下可包含子 ...

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

    (1)在res--menu目录下的main.xml文件 ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 2 ...

  3. Effective C++学习笔记(Part One:Item 1-4)

    最近的最终effectvie C++仔细阅读侧,我很惊讶C++动力和魅力.最近的" LL最近记得阅读体验和读书笔记其.必要查找使用,是什么假设总结不合适.欢迎批评: 如今仅仅列出框架,近期会 ...

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

     近期最终把effectvie C++细致的阅读了一边,非常惊叹C++的威力与魅力.近期会把近期的读书心得与读书笔记记于此.必备查找使用,假设总结有什么不当之处,欢迎批评指正: 如今仅仅列出框架. ...

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

     近期最终把effectvie C++细致的阅读了一边.非常惊叹C++的威力与魅力.近期会把近期的读书心得与读书笔记记于此,必备查找使用,假设总结有什么不 当之处,欢迎批评指正: 如今仅仅列出框架 ...

  6. 【转】 Pro Android学习笔记(三五):Menu(6):XML方式 & PopUp菜单

    目录(?)[-] 利用XML创建菜单 XML的有关属性 onClick事件 Pop-up菜单 利用XML创建菜单 在代码中对每个菜单项进行设置,繁琐且修改不灵活,不能适配多国语言的要求,可以利用资源进 ...

  7. 【转】 Pro Android学习笔记(三三):Menu(4):Alternative菜单

    目录(?)[-] 什么是Alternative menu替代菜单 小例子说明 Alternative menu代码 关于Category和规范代码写法 关于flags 多个匹配的itemId等参数 什 ...

  8. 【转】Pro Android学习笔记(三十):Menu(1):了解Menu

    目录(?)[-] 创建Menu MenuItem的属性itemId MenuItem的属性groupId MenuItem的属性orderId MenuItem的属性可选属性 Menu触发 onOpt ...

  9. 《DOM Scripting》学习笔记-——第三章 DOM

    <Dom Scripting>学习笔记 第三章 DOM 本章内容: 1.节点的概念. 2.四个DOM方法:getElementById, getElementsByTagName, get ...

随机推荐

  1. static用法总结

    C++的static有两种用法:面向过程程序设计中的static和面向对象程序设计中的static.前者应用于普通变量和函数,不涉及类:后者主要说明static在类中的作用. 一.面向过程设计中的st ...

  2. Linux学习--第二波

    虽然安装的centos感觉不能上网,权限也不知道怎么设置. 偶然的机会发现了一个好东西,博客:http://www.cnblogs.com/xiaoluo501395377/tag/CentOS/.有 ...

  3. 【boost】BOOST_LOCAL_FUNCTION体验

    c++11里支持使用lambda在函数内定义本地嵌套函数,将一些算法的判断式定义为本地函数可以使代码更加清晰,同时声明和调用靠近也使得更容易维护.遗憾的是公司开发平台任然停留在vs2008,使用boo ...

  4. .NET在IE9中页面间URL传递中文变成乱码的解决办法

     在.Net的项目中,鼠标点击查询按钮,转到查询页面,但URL中包含中文时,传到服务器端后,中文变成了乱码(只有IE9出现该问题).       尝试使用Server.UrlEncode()进行编码, ...

  5. erlang代码片段

    转载自http://blog.csdn.net/sw2wolf/article/details/6797708 .列表操作 lists:foreach(fun(X) -> io:format(& ...

  6. 自建存储与使用微软Azure、七牛等第三方云存储综合考察分析

    http://www.cnblogs.com/sennly/p/4136734.html 各种云服务这两年炒的火热,加之可以降低成本,公司想先在部分业务上尝试使用下,刚好最近有个项目有大量小文件需要存 ...

  7. 第二百零七天 how can I坚持

    都这么一大把年纪了,还没正事,哎.. mysql ifnull(expr,expr),oracle nvl();去null函数. 每天也没什么事. 哎,每天 也总有那么点事. 刘松.李承杰,都是些什么 ...

  8. LightOJ 1341 - Aladdin and the Flying Carpet (唯一分解定理 + 素数筛选)

    http://lightoj.com/volume_showproblem.php?problem=1341 Aladdin and the Flying Carpet Time Limit:3000 ...

  9. JSON如何序列图片

    图片采用JSON格式传输的话,需要把图片转成Base64格式. 首先把图片转成流:Image1.Picture.Graphic.SaveToStream(ss);然后编码成base64格式的:Enco ...

  10. Codeforces 627 A. XOR Equation (数学)

    题目链接:http://codeforces.com/problemset/problem/627/A 题意: 告诉你s 和 x,a + b = s    a xor b = x   a, b > ...