Unity3D编辑器扩展(一)——定义自己的菜单按钮
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编辑器扩展(一)——定义自己的菜单按钮的更多相关文章
- Unity3D编辑器扩展(六)——模态窗口
前面我们已经写了5篇关于编辑器的,这是第六篇,也是最后一篇: Unity3D编辑器扩展(一)——定义自己的菜单按钮 Unity3D编辑器扩展(二)——定义自己的窗口 Unity3D编辑器扩展(三)—— ...
- Unity3D编辑器扩展(五)——常用特性(Attribute)以及Selection类
前面写了四篇关于编辑器的: Unity3D编辑器扩展(一)——定义自己的菜单按钮 Unity3D编辑器扩展(二)——定义自己的窗口 Unity3D编辑器扩展(三)——使用GUI绘制窗口 Unity3D ...
- Unity3D编辑器扩展(四)——扩展自己的组件
前面已经写了三篇: Unity3D编辑器扩展(一)——定义自己的菜单按钮 Unity3D编辑器扩展(二)——定义自己的窗口 Unity3D编辑器扩展(三)——使用GUI绘制窗口 今天写第四篇,扩展自己 ...
- Unity3D编辑器扩展(二)——定义自己的窗口
上一篇我们讲了如何定义菜单按钮 https://www.cnblogs.com/xiaoyulong/p/10115053.html 这一篇我们讲如何定义自己的窗口. 定义窗口我们需要继承 Edito ...
- Unity3d编辑器扩展学习笔记
编辑器扩展 1.添加菜单栏:把特性应用于静态方法 参数1:菜单名的空格后面是定义快捷键(单符号得用"_"开头,组合键%=Ctrl,#=Shift,&=Alt) 参数2:通过 ...
- unity3D编辑器扩展
编辑器扩展只是在编辑项目中运行,发布出来是不会运行的. 固定创建一个文件夹Editor:所有的资源或者代码都不会被打包进去. 01.使用MenuItem添加菜单栏按钮 脚本不需要作为组件存在,可以不用 ...
- Unity3D编辑器扩展(三)——使用GUI绘制窗口
前两篇分别讲解了创建菜单https://www.cnblogs.com/xiaoyulong/p/10115053.html和创建窗口https://www.cnblogs.com/xiaoyulon ...
- [Unity3D]编辑器扩展之数组或List显示
效果如下: 源码如下: using System.Collections.Generic; using UnityEditor; using UnityEngine; namespace XM.Edi ...
- Unity 3D编辑器扩展介绍、教程(二) —— 创建窗口
Unity编辑器扩展教程(二) 本文提供全流程,中文翻译.Chinar坚持将简单的生活方式,带给世人!(拥有更好的阅读体验 -- 高分辨率用户请根据需求调整网页缩放比例) 一 Brief Introd ...
随机推荐
- 在CentOS6.9 x86下编译libusb-1.0.22遇到的两个问题
OS版本:CentOS 6.9 x86,内核版本2.6.32 问题一:configure.ac:36: error: Autoconf version 2.69 or higher is requir ...
- Django最简单的从请求过程
1,url匹配,匹配路由,由理由分发器(urls.py)查找用户请求的url对应关系 1,找到业务函数就调用(views.py中的方法) 2,找不到就报404错误, 3,将数据返回给浏览器 ...
- mybatis出现无效的列类型
package com.webapp.hanqi.test; import java.util.Date; import org.junit.jupiter.api.AfterEach; import ...
- poj2828(线段树查找序列第k小的值)
题目链接:https://vjudge.net/problem/POJ-2828 题意:有n个人,依次给出这n个人进入队列时前面有多少人p[i],和它的权值v[i],求最终队列的权值序列. 思路:基本 ...
- laravel -查询近7月走势图案例
// 获取7月前的时间$time = date('Y-m',strtotime("-0 year -7 month -0 day" ));$where['created_at'] ...
- iOS相关的ARM汇编
一.iOS汇编1.真机:arm64汇编寄存器指令 堆栈2.模拟器:x86汇编 二.lldb (lldb)register read x0 (lldb)register read w0 (lldb)re ...
- ios 11 SDK 新特性 使用
Xcode 9虽然已经出了一段时间,但考虑到一些第三方库的适配,就没有升级.现在有时间了就升级到 Xcode 9,随便学习一下新的小技巧.感觉很好用哦~ 一.Named Color 关于更换主题的一个 ...
- Java API使用
汉化版Java API使用 首次打开出现的问题 在首次打开API时,可能你会遇见这样的问题. 经过查阅,发现是因为文档的权限问题,文档未解锁造成的.这时候只需要给给它权限就可以. 首先关闭程序,单击右 ...
- thinkphp 响应对象
<?php namespace app\admin\controller; use think\Request; class Index{ public function index(Reque ...
- css fixed 失效问题解法
https://stackoverflow.com/questions/11258877/fixed-element-disappears-in-chrome 开启css硬件加速,transform: ...