Unity Editor编辑器(MenuItem)

来源:互联网 发布:阿里云空间购买流程 编辑:程序博客网 时间:2024/05/22 12:24

在菜单栏中添加按钮是为了方便大佬们编程方便

根据我写Editor编辑器的总结,可以添加 7 种按钮

注意所有Editor的脚本不需要挂载,只需要放在Editor文件夹下,Unity会自动编译,所有方法都是静态方法


MenuItem Constructor

Other Versions
Leave feedback
public MenuItem(string itemName);
public MenuItem(string itemName, bool isValidateFunction);
public MenuItem(string itemName, bool isValidateFunction, int priority);

Parameters

itemNameThe itemName is the menu item represented like a pathname. For example the menu item could be "GameObject/Do Something".
itemName是表示为路径名的菜单项。 例如,菜单项可以是“GameObject / Do Something”。
isValidateFunctionIf isValidateFunction is true, this is a validation function and will be called before invoking the menu function with the same itemName.
如果isValidateFunction为true,那么这是一个验证函数,将在调用具有相同itemName的菜单函数之前被调用。priorityThe order by which the menu items are displayed.
菜单项的显示顺序。

1.在菜单栏添加按钮(如果添加到GameObject中的相应位置(修改priority)还可以在Hierarchy中右键点出)

[MenuItem("MyEditor/Mybutton",false,0)]    public static void OnClick()    {        Debug.Log("按下button");    }

2.在组件中添加按钮(右键列表)(测试组件BoxCollider)

//必须在组件前面添加 CONTEXT组件标识    [MenuItem("CONTEXT/BoxCollider/TestCompent")]    public static void Test()    {        Debug.Log("查看测试组件");    }


3.MenuCommand //当前正在编辑的组件 (测试组件 Rigidbody)

[MenuItem("CONTEXT/Rigidbody/ChangeRigidboby")]    public static void ChangeRigidboby(MenuCommand cmd)    {        //获取当前组件        Rigidbody rig=cmd.context as Rigidbody;        //修改组件相关变量        rig.mass=12;        rig.useGravity = true;        Debug.Log(cmd.context.name);        Debug.Log("ChangeRigidbody");    }

注:(为字段添加特性)ContextMenuItem方法名”“按键名),(为方法添加特性)ContextMenu按键名)可以在组件内部为该组件添加button右键菜单按钮(详细可查API文档)

4.Selection 获取当前选中物体

[MenuItem("GameObject/Mydelete",false,11)]    public static void SeletionTest()    {        //打印当前选中物体的个数        Debug.Log(Selection.objects.Length);        //如果你删除了你选中的物体,可以点击此按钮恢复这些物体        foreach (Object item in Selection.objects)        {            //可以撤销删除操作            Undo.DestroyObjectImmediate(item);        }    }
5.为按键添加快捷键

    //%ctrl   #shift  &alt    //                       ctrl+shift+w    [MenuItem("MyButton/Debug %#w")]    public static void MyButton1()    {        Debug.Log("Debug ctrl+shift+w");    }

6.方法验证

//为下方SeletionTest方法的验证    [MenuItem("GameObject/MyDelete",true,11)]    public static bool MySeletionCondition()    {        //如果选中的物体不为空,则启用MyDelete按键        if(Selection.objects.Length!=0)        {            return true;        }        else        {            return false;        }    }    //两个名称要一至,上方的true为开启验证    [MenuItem("GameObject/MyDelete", false,11)]    public static void SeletionTest1()    {        //Selection 包含选中的一些方法,例如:ActionObject        //输出选中的物体的个数(包含Project面板的物体)        Debug.Log(Selection.objects.Length);        //删除所有选中的物体(Unity回收机制类似回收站,删除的物体统一到一个地方)        //当删除的物体达到一定程度时统一删除        foreach(Object item in Selection.objects)        {            DestroyObject(item);        }    }


7.创建与使用对话框

7.1创建对话框 例

/// <summary>/// 所有Editor的脚本不需要挂载,只需要放在Editor文件夹下,Unity会自动编译,所有方法都是静态方法/// </summary>
//需要继承ScriptableWizardpublic class MyEditorTest : ScriptableWizard{    //对话框中显示的值    public float aValue = 10.3f;    public int bValue = 20;    //按下那个键是创建    [MenuItem("MyTools/Create")]    static void CreatWizard()    {        //创建对话框《创建类》(“对话框名称”)        ScriptableWizard.DisplayWizard<MyEditorTest>("改变MyEditorTest脚本内部的值");    }}

执行效果

7.2 使用 例

    //unity内部方法,当按下对话框中Create键时执行(修改按键名称之后还是该方法)    private void OnWizardCreate()    {        //获取到所有选中的Prefab        GameObject[] objects = Selection.gameObjects;        foreach(GameObject obj in objects)        {            //当按下按键是,修改他们所有的相应值            obj.GetComponent<MyEditorTest>().aValue += 12;            obj.GetComponent<MyEditorTest>().bValue+=12;        }    }

OK,添加这 7种按钮方法,希望能给大家有一点帮助



原创粉丝点击