在unity开发中经常会对资源或者脚本进行批量处理,开发自己的工具可以加快处理的速度。当然有的地方必须要用到编辑器类,例如资源打包的时候需要触发,这时候就用到了。
1.MeuItam函数的使用,如下;
当编辑器没有你自定义的根选项时编辑器会新建一个选项,例如Tools。有的话就合并进入,例如Window。在menuitam下面的函数必须是静态函数。
using UnityEditor; using UnityEngine; public class Tools { [MenuItem("Tools/test/test1")] static void Test() { Debug.Log("Test"); } [MenuItem("Tools/test/test2")] static void Test2() { Debug.Log("Test"); } [MenuItem("Window/mytool/test1")] static void Test3() { Debug.Log("Test"); } }
menuitam后面的参数具体含义,第一个参数代表编辑器的选框路径,第二个参数false时能显示(具体第二个参数含义存疑)
第三个参数代表你定义的选框的优先级,在编辑器里选框的优先级是有分类的 ,他们之间用实线进行区分,分组,如图
int类型的参数,根据你想把他放的位置进行尝试,放的位置不同权限不同,例如前面的你可以在herarchy面板直接右键使用。具体设置多上合适,自己尝试。
using UnityEditor;
using UnityEngine;
public class Tools {
[MenuItem("GameObject/my tool", false, 10)] static void Test4() { Debug.Log("Test"); } [MenuItem("GameObject/my delete", true, 11)] static bool MyDeleteValidate() { if (Selection.objects.Length > 0) return true; else return false; } [MenuItem("GameObject/my delete", false, 11)] static void Mydelete() { foreach (Object o in Selection.objects) { //GameObject.DestroyImmediate(o); Undo.DestroyObjectImmediate(o);//利用Undo进行的删除操作 是可以撤销的 } //需要把删除操作注册到 操作记录里面 } [MenuItem("Assets/assetbutton")] static void Test5() { Debug.Log("Test"); } //每一个菜单栏的priority优先级默认为1000 [MenuItem("Tools/show info",false,1)] static void Test1() { //Debug.Log(Selection.activeGameObject.name );//是我们第一个选择的游戏物体 //Debug.Log(Selection.objects.Length); } //%=ctrl #=shift &=alt [MenuItem("Tools/test2 %q",false,100)] static void Test2() { Debug.Log("Test2"); } [MenuItem("Tools/test3 %t",false,0)] static void Test3() { Debug.Log("Test3"); } }
添加快捷键
- %-CTRL 在Windows / CMD在OSX
- # -Shift
- & -Alt
- LEFT/RIGHT/UP/DOWN-光标键
- F1…F12
- HOME,END,PGUP,PDDN
注:字母键不是key-sequence的一部分,要让字母键被添加到key-sequence中必须在前面加上下划线(例如:_g对应于快捷键”G”)。
[MenuItem(
"Tools/New Option %#a"
)]即Alt+Shift+A
[MenuItem(
"Tools/Item2 _g"
)]即G
2.CONTEXT参数用来对游戏物体上的组件进行操作,如下代码段中
[MenuItem("CONTEXT/Rigidbody/Clear")]//是对编辑器状态下的缸体进行Clear操作static void ClearMassAndGravity( MenuCommand cmd )clear对应的函数是ClearMassAndGravity,参数cmd就是当前组建,com.context强转为你要操作的类型,然后对其内部的参数进行修改
using UnityEditor; public class PlayerEditor { [MenuItem("CONTEXT/Rigidbody/Clear")] static void ClearMassAndGravity( MenuCommand cmd )// CONTEXT 组件名 按钮名//menucommand是当前正在操作的组
{Rigidbody rgd = cmd.context as Rigidbody;
rgd.mass = 0; rgd.useGravity = false; }
}
3.EditorWindow是窗口类,可以创建自己的窗口,在窗口几面集合工具。窗口内的内容是OnGUI中实现。
using UnityEditor; using System.Collections; // This example shows how to create a context menu inside a custom EditorWindow. // context-click the green area to show the menu public class GenericMenuExample : EditorWindow { [MenuItem("Example/Open Window")] static void Init() { var window = GetWindow<GenericMenuExample>(); window.position = new Rect(50, 50, 250, 60); window.Show(); } void Callback(object obj) { Debug.Log("Selected: " + obj); } void OnGUI() { Event currentEvent = Event.current; Rect contextRect = new Rect(10, 10, 100, 100); EditorGUI.DrawRect(contextRect, Color.green); } rgd.mass = 0; rgd.useGravity = false; }}