unity编辑器扩展

来源:互联网 发布:我本知这世界 编辑:程序博客网 时间:2024/05/17 04:26

一、在菜单栏添加按钮、在project和Herarity里点击鼠标右键出现按钮 MenuItem

using UnityEditor;using UnityEngine;    //Editor下文件不会被打包,只能在编辑器下起作用public class Tools {    //第一种 菜单栏添加按钮    //第三个参数为显示的优先级,优先级越小越在上,每一个菜单栏的priority的优先级默认为1000,如果相邻的优先级大于11,就相当于分类    [MenuItem("Tools/Test1",false,4)]    static void Test1()    {        Debug.Log("添加成功!");    }    //在GameObject菜单栏和Hierarchy视图里点击鼠标右键显示    [MenuItem("GameObject/my tool",false,10)]    static void Test2()    {        Debug.Log("添加成功!");    }    //在菜单栏和project里点击鼠标右键显示AssetButton    [MenuItem("Assets/assetButton")]    static void Test3()    {        Debug.Log("添加成功!");    }    //资源商店下载的存放位置 C:\Users\huang\AppData\Roaming\Unity\Asset Store-5.x\Unity Technologies}


二、鼠标在组件上点击右键添加按钮  MenuCommand

using UnityEngine;using UnityEditor;public class PlayEditor {    //鼠标右键点击组件出现,并进行操作    [MenuItem("CONTEXT/PlayerHealth/InitHeathAndSpeed")]    //CONTEXT(大写) 组件名  按钮名    static void InitHeathAndSpeed(MenuCommand cmd)   //MenuCommand是当前正在操作的组件    {        Debug.Log(cmd.context.GetType().FullName);        CompleteProject.PlayerHealth health = cmd.context as CompleteProject.PlayerHealth;   //强制转换成PlayerHealth类型        health.startingHealth = 200;        health.flashSpeed = 10;        Debug.Log(cmd.context.name);  //输出组件所在游戏物体的名字        Debug.Log("Init");    }}

三,选中Selection和可以撤回的删除以及给按钮添加快捷键

    [MenuItem("Tools/show info",false,4)]    static void showinfo()    {        //Debug.Log(Selection.activeGameObject.name);    //选中多个,只显示第一个对象的名字        Debug.Log(Selection.objects.Length);                //选中的数量    }    //启用按钮 不启用时按钮为灰色 写在按钮的前面,名字必须一样    [MenuItem("GameObject/my delete",true,10)]    static bool MyDeleteValidate()    {        if (Selection.objects.Length > 0)            return true;        else            return false;    }    // 制作自己的删除功能按钮    [MenuItem("GameObject/my delete",false,10)]        static void MyDelete()    {        //无法撤回的删除功能        //foreach(Object o in Selection.objects)        //{        //    GameObject.DestroyImmediate(o);        //}        //要想撤回删除,需要把删除操作记录到操作记录里        foreach (Object o in Selection.objects)        {            Undo.DestroyObjectImmediate(o);        }    }    //给按钮添加快捷键  %=ctrl #=shift &=alt 直接使用字母前加_    [MenuItem("Assets/assetButton _t",false,10)]    static void Test3()    {        Debug.Log("添加成功!");    }

四、在脚本里使用编辑器,改变字段值(ContextMenu,ContextMenuItem)

    //在脚本内部修改属性 不需要引用    [ContextMenu("set color")]    void SetColor()    {        flashColour = Color.green;    }
    //右键字段显示按钮,第一个为按钮名,第二个为方法名 这句必须写在字段前面    [ContextMenuItem("Add Hp", "AddHp")]    public int startingHealth = 100;      void AddHp()    {        startingHealth += 20;    }

五、按钮打开对话框

using UnityEngine;using UnityEditor;public class EnemyChange : ScriptableWizard {    //创建对话框    [MenuItem("Tools/CreateWizard")]    static void CreateWizard()    {        //第一个参数是对话框名称,第二个参数是Create按钮的名字,第三个参数是第二个按钮,点击不会关闭窗口        ScriptableWizard.DisplayWizard<EnemyChange>("统一修改敌人对话框","Change Value","Other Button");      }    public int changeHealthValue = 10;    public int changeSinkSpeed = 1;    //当窗口被创建出来的时候,取值    private void OnEnable()    {        //赋值       changeHealthValue =  EditorPrefs.GetInt("changeHealthValue");    }    //Create按钮点击事件     private void OnWizardCreate()    {        GameObject[] enemyPrefabs=Selection.gameObjects;        //显示进度条        EditorUtility.DisplayCancelableProgressBar("进度条", "0/" + Selection.gameObjects.Length + "完成修改值", 0);        int count = 0;        foreach(GameObject go in enemyPrefabs)        {            //因为案例有两个相同的,默认操作的是继承自moonbehavior的,本处用的是继承CompleteProject的那个            CompleteProject.EnemyHealth hp = go.GetComponent<CompleteProject.EnemyHealth>();            //对hp进行记录,使其具有撤回的功能,这句话必须写在hp操作的前面            Undo.RecordObject(hp, "change health and speed");            hp.startingHealth += changeHealthValue;            hp.sinkSpeed += changeSinkSpeed;            count++;            EditorUtility.DisplayCancelableProgressBar("进度条", count+"/"+Selection.gameObjects.Length + "完成修改值", (float)count/Selection.gameObjects.Length);        }        EditorUtility.ClearProgressBar();        //窗口下方的提示信息        ShowNotification(new GUIContent(Selection.gameObjects.Length + "个敌人的信息被修改了"));    }    private void OnWizardOtherButton()    {        //调用一下显示效果,并无什么意义        OnWizardCreate();    }    //对话框里字段被修改就会调用    private void OnWizardUpdate()    {        helpString = null;        errorString = null;        if (Selection.gameObjects.Length > 0)        {            helpString = "您选择了" + Selection.gameObjects.Length + "个敌人";        }        else        {            errorString = "请至少选择一个敌人";        }        //记录保存改变的数值        EditorPrefs.SetInt("changeHealthValue", changeHealthValue);    }    //选则改变更换提示显示    private void OnSelectionChange()    {        OnWizardUpdate();    }}


六、自定义窗口

using UnityEngine;using UnityEditor;public class MyWindow :EditorWindow {    //自定义视图窗口    [MenuItem("Window/Show MyWindow")]    static void ShowMyWindow()    {        MyWindow myWindow = EditorWindow.GetWindow<MyWindow>();        myWindow.Show();    }    private string name = "";    private void OnGUI()    {        GUILayout.Label("这是我的窗口");        name=GUILayout.TextField(name);        if (GUILayout.Button("创建"))        {            GameObject go = new GameObject(name);            //把创建物体注册到unity里 方便撤回            Undo.RegisterCreatedObjectUndo(go, "Create GameObject");        }         }}