unity编辑器扩展

一、在菜单栏添加按钮、在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("统一修改敌人对话框","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();
            //对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.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");
        }     
    }
}

 

 

 

 

 

 

 

你可能感兴趣的:(c#)