Unity3D 引擎的编辑器拥有很强的扩展性,用的好可以帮我们省很多事情。在这里记录下如何去扩展 Unity3D 的编辑器,定制属于我们自己的开发环境。

本篇主要讲解在 Unity3D 引擎的各个窗口添加我们自己的菜单按钮。

添加菜单按钮我们需要用到 MenuItem 特性:

MenuItem 的三个重载:

MenuItem(string itemName);

MenuItem(string itemName, bool isValidateFunction);

MenuItem(string itemName, bool isValidateFunction, int priority);

参数详解:

string itemName:菜单路径以及名称,可以设置多级菜单

 bool isValidateFunction:控制菜单是否被激活。

   通常都是通过两个函数来完成的:

  1、菜单的名称必须完全一致;

  2、第1个函数的第2个参数必须是 false 或不写,因为默认值就是 false,第2个函数的第2个参数必须是 true

  3、第2个函数的返回值必须是 bool 类型:如果函数的返回值如果返回 true,则本菜单被高亮激活,并执行第一个函数;如果返回值为 false,本菜单就为灰色,不可以被点击;

int priority:控制菜单的显示上下的顺序。值越小越在上面显示,默认的优先级为1000;如果想要系统添加下划线,相邻的2个菜单的优先级的大小要超过 >= 11。

添加我们自己的菜单有两点需要注意:

  1、MenuItem 的函数必须是静态(static)函数。

  2、脚本必须放在 Editor 文件夹下。

在菜单栏添加菜单:

代码:

[MenuItem("MyMenuItem/Item1")]
private static void Item1Do1()
{
Debug.Log("MyMenuItem Item1");
}

效果图:

代码:

[MenuItem("GameObject/Item1")]
private static void Item1Do2()
{
Debug.Log("GameObject Item1");
}

效果图:

第二个参数 bool isValidateFunction 的用法:

代码:

[MenuItem("MyMenuItem/Item2")]
private static void Item2Do1()
{
Debug.Log(Selection.activeTransform.gameObject.name);
}
[MenuItem("MyMenuItem/Item2", true)]
private static bool Item2Do2()
{
return Selection.activeTransform != null;
}

效果图:

第三个参数 int priority 的用法:

代码:

[MenuItem("MyMenuItem/Item3", false, )]
private static void Item3Do()
{
Debug.Log("Item3");
}
[MenuItem("MyMenuItem/Item4", false, )]
private static void Item4Do()
{
Debug.Log("Item4");
}

效果图:

Project 视图右键添加菜单:

代码:

[MenuItem("Assets/AssetsItem")]
private static void AssetsItemDo()
{
Debug.Log("AssetsItem");
}

效果图:

Hierachry层级视图添加右键菜单:核心是参数第三个参数 int priority,设置为10,添加到同一组内

代码:

[MenuItem("GameObject/Custom Game Object", false, )]
private static void CreateCustomGameObject(MenuCommand menuCommand)
{
//创建一个新的游戏物体
GameObject go = new GameObject("Custom Game Object");
//menuCommand.context是当前鼠标左键选中的GameObjet游戏物体,通过GameObjectUtility.SetParentAndAlign函数设置为新创建的go物体的父节点
GameObjectUtility.SetParentAndAlign(go, menuCommand.context as GameObject);
//注册到U3D的Undo系统中。就是指我们可以使用Ctrl+Z组合键对这个物体进行撤销操作。
Undo.RegisterCreatedObjectUndo(go, "Create " + go.name);
//将鼠标的选中物体自动的移动到刚刚创建的go物体上
Selection.activeObject = go;
}

效果图:

Inspector 属性面板中添加一个右键菜单,功能可以通过MenuItem("COMTEXT/组件名称/右键菜单名称")完成

代码:

//MenuCommand 表示当前正在操作的组件
//通过context 属性获取到 对应的脚本对象或游戏物体GameObject
[MenuItem("CONTEXT/Rigidbody/SetMass=5")]
private static void DoSomething(MenuCommand command)
{
Rigidbody body = (Rigidbody)command.context as Rigidbody;
body.mass = ;
Debug.Log("Changed Rigidbody's Mass to " + body.mass + " from Context Menu...");
}

效果图:

我们还有另外一种方法,就是通过 ContextMenu 特性来完成,效果是一样的。并且 ContextMenu 的函数重载和参数与 MenuItem 是一样的,前面已经写过了,这里就不赘述了。与  ContextMenu 不同的是,它是写在组件函数里面,且不用并不能放在 Editor 文件夹下。

代码:

public class ContextMenuTest : MonoBehaviour
{
[ContextMenu ("Do Something")]
void DoSomething ()
{
Debug.Log ("Perform operation");
}
}

效果图:

接下来介绍另外两个属性:

ContextMenuItem 为菜单绑定一个方法。

代码:使 Reset 拥有了重置 playerBiography 值的功能。

[ContextMenuItem("Reset", "ResetBiography")]
public string playerBiography = "";
void ResetBiography()
{
playerBiography = "";
}

AddComponentMenu:允许将我们的脚本添加到Component菜单的指定位置,而不是"Component->Scripts-->xxxx"。特例: menuName为空,则菜单中将隐藏此脚本的显示

代码:

[AddComponentMenu("MyCompenent/ContextMenuTest",)]
public class ContextMenuTest : MonoBehaviour
{
}

效果图:

前面说了一大堆如何扩展自己的菜单,接下来我们说如何添加快捷键,毕竟使用快捷键比鼠标点爽多了有没有,而且显得很牛有没有。

代码:

[MenuItem("MyMenuItem/Item5 %G")]
private static void Item5Do()
{
Debug.Log("Item5");
}

效果图:这样我们就给这个菜单按钮设置了快捷键:Ctrl+G

设置快捷键的规则大致如下:

% (ctrl on Windows, cmd on macOS), # (shift), & (alt).

"MyMenu/Do Something _g" 快捷键g,字母签名添加下划线

"#LEFT" :shift+ left. 其他的一个键的支持情况: LEFT, RIGHT, UP, DOWN, F1 .. F12, HOME, END, PGUP, PGDN.

快捷键和前面的菜单名称中间必须加入空格,否则无效

_w 单一的快捷键 W 

#w shift+w 

%w ctrl+w 

&w Alt+w

Unity3D编辑器扩展(一)——定义自己的菜单按钮的更多相关文章

  1. Unity3D编辑器扩展(六)——模态窗口

    前面我们已经写了5篇关于编辑器的,这是第六篇,也是最后一篇: Unity3D编辑器扩展(一)——定义自己的菜单按钮 Unity3D编辑器扩展(二)——定义自己的窗口 Unity3D编辑器扩展(三)—— ...

  2. Unity3D编辑器扩展(五)——常用特性(Attribute)以及Selection类

    前面写了四篇关于编辑器的: Unity3D编辑器扩展(一)——定义自己的菜单按钮 Unity3D编辑器扩展(二)——定义自己的窗口 Unity3D编辑器扩展(三)——使用GUI绘制窗口 Unity3D ...

  3. Unity3D编辑器扩展(四)——扩展自己的组件

    前面已经写了三篇: Unity3D编辑器扩展(一)——定义自己的菜单按钮 Unity3D编辑器扩展(二)——定义自己的窗口 Unity3D编辑器扩展(三)——使用GUI绘制窗口 今天写第四篇,扩展自己 ...

  4. Unity3D编辑器扩展(二)——定义自己的窗口

    上一篇我们讲了如何定义菜单按钮 https://www.cnblogs.com/xiaoyulong/p/10115053.html 这一篇我们讲如何定义自己的窗口. 定义窗口我们需要继承 Edito ...

  5. Unity3d编辑器扩展学习笔记

    编辑器扩展 1.添加菜单栏:把特性应用于静态方法 参数1:菜单名的空格后面是定义快捷键(单符号得用"_"开头,组合键%=Ctrl,#=Shift,&=Alt) 参数2:通过 ...

  6. unity3D编辑器扩展

    编辑器扩展只是在编辑项目中运行,发布出来是不会运行的. 固定创建一个文件夹Editor:所有的资源或者代码都不会被打包进去. 01.使用MenuItem添加菜单栏按钮 脚本不需要作为组件存在,可以不用 ...

  7. Unity3D编辑器扩展(三)——使用GUI绘制窗口

    前两篇分别讲解了创建菜单https://www.cnblogs.com/xiaoyulong/p/10115053.html和创建窗口https://www.cnblogs.com/xiaoyulon ...

  8. [Unity3D]编辑器扩展之数组或List显示

    效果如下: 源码如下: using System.Collections.Generic; using UnityEditor; using UnityEngine; namespace XM.Edi ...

  9. Unity 3D编辑器扩展介绍、教程(二) —— 创建窗口

    Unity编辑器扩展教程(二) 本文提供全流程,中文翻译.Chinar坚持将简单的生活方式,带给世人!(拥有更好的阅读体验 -- 高分辨率用户请根据需求调整网页缩放比例) 一 Brief Introd ...

随机推荐

  1. 使用拦截器对前端传入的字符串进行trim操作

    @Before("apiItf()") public void before(JoinPoint joinPoint) throws Exception { Object[] ar ...

  2. H5-处理支付-前端部分

    调用后台支付接口,得到返回数据 1.如果是支付宝,需要后台配置支付成功的回调页面路径,还要在页面创建一个标签装表单内容,此处是id为box的div标签 <div id="box&quo ...

  3. webpack打包优化

    https://www.cnblogs.com/vvjiang/p/9327903.html

  4. IIS 设置查询字符串长度

  5. Spring:事务

    摘要 本文摘抄了Spring事务相关的一些理论,主要讲述事务的特性.事务的传播行为.事务的隔离规则. 关键词:事务特性,事务传播,事务隔离 一.什么是事务 事务是用来保证数据的完整性和一致性,正如金钱 ...

  6. win7系统标准用户恢复administrator账号方法

    一次误操作,把管理员账号给禁用了,满眼的泪花~~~~~~~~~ 标准用户,什么都干不了,怎么办呢????? 度娘一下,各种奇葩答案,就是解决不了 呵呵,最后找到了解决方法: 1.开机后BIOS过后,按 ...

  7. jq 字符串去除空格

    1.去除首尾空格: var txt = $('#Txt').val().trim(); txt = txt.replace(/(^\s*)|(\s*$)/g, ""); 2.去除所 ...

  8. kubernetes + istio进行流量管理

    实验目的: 本文介绍如何通过istio实现域名访问k8s部署的nginx服务 前提: 已经安装了kubernetes的服务器 了解 kubernetes 基本命令如何使用 (kubectl creat ...

  9. mysql执行计划id为空—UNION关键字

    简介 UNION 操作符用于合并两个或多个 SELECT 语句的结果集.例如,我有两个表,表1记录的是公司男员工的数据,包括年龄.姓名.职位.表2记录的是公司女员工的数据,包括姓名.家庭住址.手机号等 ...

  10. mysql的初次使用操作

    一.mysql 登录 mysql 参数 mysql -uroot -p123 -P3306 -h127.0.0.1 127.0.0.1本地回环地址 二.mysql退出 mysql >exit; ...