Unity 编辑器扩展,让开发更加快捷

      在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;    }}

猜你喜欢

转载自blog.csdn.net/laoshaonian/article/details/79873057
今日推荐