Unity编辑器扩展(一)

一、[MenuItem("--路径--")]

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");
    }
}
Unity编辑器扩展(一)_第1张图片
Paste_Image.png
MenuItem第二个参数

MenuItem第二个参数表示这个是否启用,根据判断如果当前选择了游戏物体可使用My deleta按钮,如果没有选择游戏物体,那么无法启用My deleta按钮 。

  [MenuItem("GameObject/My deleta", true, 14)]
    static bool MydeletaValidate()
    {
        if (Selection.objects.Length > 0)
            return true;
        else
            return false;
    }

    [MenuItem("GameObject/My deleta", false, 14)]
    static void Mydeleta()
    {
        foreach (Object o in Selection.objects) {
            //使用Undo.DestroyObjectImmediate进行删除操作 是可以Ctrl+Z进行撤销操作
            Undo.DestroyObjectImmediate(o);
        }
    }
Unity编辑器扩展(一)_第2张图片
Paste_Image.png
MenuItem第三个参数

那么如果我们想做一个分类让一类的按钮分开来如何做呢,
那就是相邻的两个菜单按钮之间的Priority如果相差11那就相当于做了一个分类。

using UnityEditor;
using UnityEngine;

public class Tools  {

 //每一个菜单栏的Priority优先级的默认为1000
 [MenuItem("Tools/test1",false,1)]
   static void Test() {
        Debug.Log("Test1");
    }
    [MenuItem("Tools/test2",false,12)]
    static void Test2()
    {
        Debug.Log("Test2");
    }

    [MenuItem("Tools/test3", false, 0)]
    static void Test3()
    {
        Debug.Log("Test3");
    }
}
Unity编辑器扩展(一)_第3张图片
Paste_Image.png

如果我们想给脚本右键添加一个按钮也可以用Menultem.

using UnityEditor;
public class PlayerEditor  {
    //CONTEXT是固定写法   
 [MenuItem("CONTEXT/PlayerHealth/InitHealthAndSpeed")]
   static void InitHealthAndSpeed() {
        Debug.Log("Init");
    }
}
Unity编辑器扩展(一)_第4张图片
Paste_Image.png
MenuItem快捷键的设置

那么我们想添加菜单按钮的快捷键如何去做呢,下面我们来看看,如果我们使用单个字母按键快捷的话我们之间在名字后面加一个空格分隔开,再加一个下划线然后是我们的快捷字母,如下。

[MenuItem("Tools/test3 _t", false, 0)]
    static void Test3()
    {
        Debug.Log("Test3");
    }

按快捷键T就可以输出Text3


Unity编辑器扩展(一)_第5张图片
Paste_Image.png

那么如果我们想使用Ctrl或者Shift的组合快捷按键呢,那就使用下面的方法

 //%=Ctrl #=Shift &=alt
 [MenuItem("Tools/test1 %q",false,1)]//表示Ctrl+q快捷
    static void Test() {
        Debug.Log("Test1");
    }
Unity编辑器扩展(一)_第6张图片
Paste_Image.png

二、方法(MenuCommand cmd){}

通过MenuCommand 去获取我们正在操作的组件并且更改组件的参数,下面一个例子设置刚体的质量和useGravity .

//CONTEXT是固定写法,组件名 按钮名
    [MenuItem("CONTEXT/Rigidbody/Clear")]
    static void ClearHassAndGravity(MenuCommand cmd) {
    //MenuCommand是当前正在操作的组件  
        Rigidbody rgd = cmd.context as Rigidbody;
        rgd.mass = 0;
        rgd.useGravity = false;
    }

点击Clear的时候可以看到设置到改变了


Unity编辑器扩展(一)_第7张图片
Paste_Image.png

三、Selection的使用

Selection官方API
Unity编辑器扩展(一)_第8张图片
Paste_Image.png
   [MenuItem("Tools/Show info", false, 0)]
    static void ShowInfo()
    {
        Debug.Log(Selection.activeObject.name);//是我们第一个选择的游戏物体
        Debug.Log(Selection.objects.Length);//获取选择的游戏物体的长度
    }
Unity编辑器扩展(一)_第9张图片
Paste_Image.png

那么我们如何去做一个删除游戏对象的按钮。

[MenuItem("Tools/My deleta", false, 11)]
    static void Mydeleta()
    {
        foreach (Object o in Selection.objects) {
            //使用Undo.DestroyObjectImmediate进行删除操作 是可以Ctrl+Z进行撤销操作
            Undo.DestroyObjectImmediate(o);
        }
    }
Unity编辑器扩展(一)_第10张图片
Paste_Image.png

ContextMenuItem与的使用

在组件脚本的一个变量上添加一个按钮事件

//第一个参数为按钮名字,第二个参数为方法名字
        [ContextMenuItem("Add Hp","AddHp")]
        public int startingHealth = 100;                            // The amount of health the player starts the game with.
        void AddHp()
        {
            startingHealth = 200;
        }

选择startingHealth并右键点击就会出现写入的事件按钮


Unity编辑器扩展(一)_第11张图片
Paste_Image.png

你可能感兴趣的:(Unity编辑器扩展(一))