Unity编辑器扩展学习

基础篇

using UnityEditor;
using UnityEngine;
public class Tools
{
    //菜单栏编辑,这个标签显示菜单栏上按钮的名字,点击则调用这个标签下的方法
    //注意标签名字和方法名不能有两个一样的
    [MenuItem("Tools/Test1")]
    //必须是静态方法才能在菜单栏上显示
    static void Test1()
    {
        Debug.Log("你大爷");
    }

    /* 
     * MenuItem(string itemName, bool isValidateFunction, int priority);
     * 第一个参数:菜单栏显示的名字
     * 第二个参数:
     * 第三个参数:菜单栏名字显示的优先级,每一个菜单栏默认优先级为1000
     * 如果手动设置,数值越小,优先级别越高,显示越靠前
     * 其中每级相差数值>11时,分为一个类别,即显示的时候中间会用一条横线隔开
     */
    [MenuItem("Tools/Test2")]
    static void Test2()
    {
        Debug.Log("你2大爷");
    }
    [MenuItem("Tools/Test3")]
    static void Test3()
    {
        Debug.Log("你3大爷");
    }


    /*================================================控制脚本代码==================================================================*/
    /// <summary>
    /// CONTEXT:代表这是一个要控制组件的标签方法
    /// CubeMove:组件名字即脚本名字
    /// DoSomething:显示的按钮名
    /// MenuCommand cmd:通过这个cmd.context来获取GameObject的脚本进行修改
    /// </summary>
    [MenuItem("CONTEXT/CubeMove/DoSomething")]
    static void DoSome(MenuCommand cmd)
    {
        CubeMove cubeMove = (CubeMove)cmd.context;
        cubeMove.speed = 0.1f;
        Debug.Log("Big妈妈");
    }

    /*================================================删除功能======================================================================*/
    /// <summary>
    /// Selection:函数,是指所有选中的物体,对其进行操作
    /// </summary>
    [MenuItem("Tools/MyDelete")]
    static void MyDelete()
    {

        foreach (var o in Selection.objects)
        {//这样操作删除物体之后不能撤销
         //需要把删除操作注册到操作记录才能撤销
            GameObject.DestroyImmediate(o);

            //用Undo下的方法所做的操作都是可以撤销的
            //Undo.DestroyObjectImmediate(o);

        }
    }

    /*================================================添加快捷键功能======================================================================*/
    /// <summary>
    /// 按单个按键的情况:按p键直接输出,注意前面有空格和下划线,如果有冲突会提示冲突
    /// </summary>
    [MenuItem("Tools/Shortcutkeys _b")]
    static void ShortCutKeys()
    {
        Debug.Log("按p键直接输出");
    }
    /// <summary>
    /// %:代表Ctrl
    /// #:代码表shift
    /// &:代表Alt
    /// </summary>
    [MenuItem("Tools/SCK &y")]
    static void SCK()
    {
        Debug.Log("%#&");
    }

    /*================================================添加验证功能是否可用===================================================*/
    /// <summary>
    /// 同一个名字的标签函数,验证函数,如果选中物体这个hehe按钮就显示否则变灰
    /// 这个是menuitem标签第二个参数的功能,验证函数设置为true的时候不会在编辑器上显示
    /// 验证函数可以不必添加快捷键功能,只需要保持按钮名字相同
    /// 个人感觉这个功能实际用处不大,反正在方法中写好选中的物体做相应的功能就行了,不选中的也不会执行这个操作
    /// </summary>
    /// <returns></returns>
    [MenuItem("GameObject/hehe", true, 10)]
    static bool HEHE()
    {
        //如果选中物体
        if (Selection.objects.Length > 0)
        {
            return true;
        }
        else
        {
            return false;
        }
    }

    /// <summary>
    /// 获取选中的物体添加脚本,如果本来有的就不添加,本来没有该脚本的就添加
    /// 这里使用大写的L则  添加脚本的快捷键就是Alt+shift+L键
    /// </summary>
    [MenuItem("GameObject/hehe &L", false, 10)]
    static void AddCubeMove()
    {
        if (Selection.objects.Length > 0)
        {
            foreach (var item in Selection.transforms)
            {
                if (item.gameObject.GetComponent<CubeMove>())
                {
                    break;
                }
                else
                {
                    item.gameObject.AddComponent<CubeMove>();
                }
            }
        }
    }


    /*================================================================================================*/
    //给属性添加特性:[ContextMenuItem("按钮名","方法名")]
    //给函数添加特性:[ContextMenu("方法名")]
    //这两个标签直接写在脚本当中不用继承UnityEditor
    //到时候直接右键点击该脚本所在的组件就会出来

}

自定义对话框

/*=====================================自定义对话框======继承自ScriptableWizard=====================================================*/
/// <summary>
/// 需要继承自ScriptableWizard
/// </summary>
public class DialogBox : ScriptableWizard
{
    /// <summary>
    /// 创建对话框
    /// </summary>
    [MenuItem("Tools/CreateWizard")]
    static void CreateWizard()
    {
        ScriptableWizard.DisplayWizard<DialogBox>("统一修改DialogBox类中的参数", "确定并关闭", "其他按钮");
    }
    public int heheda = 0;
    public string hhh = "hello world";
    const string hehedaKey = "hehedaKey";
    const string hhhKey = "hhhKey";
    /// <summary>
    /// 每次进入对话框,先把字段赋值为上一次设置的值
    /// </summary>
    void OnEnable()
    {
        heheda = EditorPrefs.GetInt(hehedaKey, heheda);
        hhh = EditorPrefs.GetString(hhhKey, hhh);
    }
    /// <summary>
    /// 方法名是unity内置的固定函数,和Start(),Update()一样不能是其他方法名
    /// 诺没有该方法 按“确定并关闭”按钮会报错,提示找不到对应方法
    /// </summary>
    void OnWizardCreate()
    {
        GameObject[] obj = Selection.gameObjects;
        if (obj.Length <= 0)
        {
            Debug.LogError("没选中GameObject");
            return;
        }
        foreach (var item in obj)
        {
            CubeMove cubeMove = item.GetComponent<CubeMove>();
            //记录cubemove数据被更改前的样子,按Ctrl+z可以撤销,否则没有撤销功能
            Undo.RecordObject(cubeMove, "record changes");
            if (cubeMove == null)
            {
                Debug.LogError(string.Format("{0}:没有cubemove脚本", item.name));
                continue;
            }
            cubeMove.speed += 9;
        }
        ShowNotification(new GUIContent("修改成功"));
        Debug.Log("点击确定并关闭");
    }
    /// <summary>
    /// 对应“其他按钮”的方法
    /// 也是内置函数
    /// </summary>
    void OnWizardOtherButton()
    {
        OnWizardCreate();
        Debug.Log("我是其他按钮啊");
    }
    /// <summary>
    /// 方法名是unity内置的固定函数,和Start(),Update()一样不能是其他方法名,否则按“确定”按钮会报错
    /// 当有数值变化的时候才会调用检测这个函数,并不会你选中多少个GameObject,就立马提示你选中多少个
    /// </summary>
    void OnWizardUpdate()
    {
        errorString = helpString = null;
        if (Selection.gameObjects.Length > 0)
        {
            helpString = "您当前选择的GameObject的数量:" + Selection.gameObjects.Length;
        }
        else
        {
            errorString = "请至少选择一个GameObject";
        }
        //每次字段数值改变就储存字段
        EditorPrefs.SetInt(hehedaKey, heheda);
        EditorPrefs.SetString(hhhKey, hhh);
    }
    /// <summary>
    /// 该方法会随着你鼠标实时监测,点一下,提示一次
    /// </summary>
    void OnSelectionChange()
    {
        OnWizardUpdate();
    }
}

测试脚本

using UnityEngine;

public class CubeMove : MonoBehaviour
{
    public float speed = 0;
    // Start is called before the first frame update
    void Start()
    {
        
    }

    // Update is called once per frame
    void Update()
    {
        transform.Translate(speed, 0, 0);
    }
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值