unity编辑器扩展

目录

1.使用MenuItem添加菜单栏按钮

2.关于MenuItem的路径设置和显示的先后顺序设置 

3.给组件的右键菜单栏添加按钮(需要加CONTEXT)

4.关于MenuCommand的使用

5.使用Selection获取选择的游戏物体

6.编写可以撤销的删除操作(使用Undo.DestroyObjectImmediate()方法)

7.给菜单项添加快捷键(%=ctrl, #=shift, &=alt)

8.控制菜单项是否启用的功能(将MenuItem()的第二个参数设为true)

9.关于ContextMenu和ContextMenuItem的使用

10.创建对话框

11.兼容按钮点击统一修改字段

12.显示提示框的帮助信息和错误信息

13.创建OtherButton按钮并监听按钮点击(OnWizardOtherButton())

14.使用ShowNotification显示提示信息(ShowNotification())

15.使用EditorPrefs函数保存数据

16.显示进度条( EditorUtility.DisplayProgressBar())

17.创建自定义窗口


1.使用MenuItem添加菜单栏按钮

using UnityEditor;
using UnityEngine;

public class Tools  {
    [MenuItem ("Tools/test")]
    static void Test()
    {
        Debug.Log("Test");
    }
}

 

2.关于MenuItem的路径设置和显示的先后顺序设置 

  • 路径设置
using UnityEditor;
using UnityEngine;

public class Tools
{
    [MenuItem("Tools/mytest/test1")]
    static void Test1()
    {
        Debug.Log("Test1");
    }
    [MenuItem("Tools/mytest/test2")]
    static void Test2()
    {
        Debug.Log("Test2");
    }
}

  • 显示的先后顺序设置
using UnityEditor;
using UnityEngine;

public class Tools  {
    [MenuItem ("Tools/test1",false ,1)]
    static void Test1()
    {
        Debug.Log("Test1");
    }
    [MenuItem("Tools/test2",false ,2)]
    static void Test2()
    {
        Debug.Log("Test2");
    }
    [MenuItem("Tools/test3",false ,0)]
    static void Test3()
    {
        Debug.Log("Test3");
    }
}

       可以看到Tools菜单栏下面的菜单按钮的顺序是test3-test1-test2,现在我想让test3和test1成为一组,即想在test1和test2之间插入一根横线,我们只需要让相邻的两个菜单按钮(这里是test1和test2)之间的priority相差11(或11以上)即可,如下:

using UnityEditor;
using UnityEngine;

public class Tools  {
    [MenuItem ("Tools/test1",false ,13)]
    static void Test1()
    {
        Debug.Log("Test1");
    }
    [MenuItem("Tools/test2",false ,2)]
    static void Test2()
    {
        Debug.Log("Test2");
    }
    [MenuItem("Tools/test3",false ,0)]
    static void Test3()
    {
        Debug.Log("Test3");
    }
}

  • GameObject菜单栏下显示test4,test5;Hierarchy下右键弹出框中显示test4:
using UnityEditor;
using UnityEngine;

public class Tools  {
    [MenuItem("GameObject/test4", false, 0)]
    static void Test4()
    {
        Debug.Log("Test4");
    }
    [MenuItem("GameObject/test5")]
    static void Test5()
    {
        Debug.Log("Test5");
    }
}

  • Assets菜单栏下显示mytest6,Project下右键弹出框显示mytest6:
using UnityEditor;
using UnityEngine;

public class Tools  {
    [MenuItem("Assets/mytest6")]
    static void Test6()
    {
        Debug.Log("Test6");
    }
}

 

3.给组件的右键菜单栏添加按钮(需要加CONTEXT)

using UnityEditor;
using UnityEngine;

public class CubeEditor{
    [MenuItem ("CONTEXT/Cube/init")]//CONTEXT 组件名 按钮名
    static void Init()
    {
        Debug.Log("Init");
    }
}

4.关于MenuCommand的使用

  • 更改GameObject_Cube的Cube组件里的speed为100
using UnityEditor;
using UnityEngine;

public class CubeEditor{
    [MenuItem ("CONTEXT/Cube/init")]
    static void Init(MenuCommand cmd)
    {
        Debug.Log(cmd.context.GetType().FullName);//Cube
        Cube cube = cmd.context as Cube;
        cube.speed = 100;
        Debug.Log("Init");
    }
}

  • 更改GameObject_Cube的Rigidbody组件里的Mass为10,Use Gravity取消勾选
using UnityEditor;
using UnityEngine;

public class CubeEditor{
    [MenuItem ("CONTEXT/Rigidbody/clear")]
    static void Init(MenuCommand cmd)
    {
        Rigidbody rg = cmd.context as Rigidbody;
        rg.mass = 10;
        rg.useGravity = false;
    }
}

5.使用Selection获取选择的游戏物体

using UnityEditor;
using UnityEngine;

public class Tools
{
    [MenuItem("Tools/mytest")]
    static void Test()
    {
        Debug .Log(Selection.activeGameObject.name);//是我们选择的第一个游戏物体
        Debug.Log(Selection.objects.Length);
    }
}

6.编写可以撤销的删除操作(使用Undo.DestroyObjectImmediate()方法)

using UnityEditor;
using UnityEngine;

public class Tools
{
    [MenuItem("GameObject/my delete",false ,0)]
    static void Test()
    {
        foreach (Object o in Selection .objects)
        {
            Undo.DestroyObjectImmediate(o);//按Ctrl+Z可以撤销刚才的删除。推荐使用
            //GameObject.DestroyImmediate(o);按Ctrl+Z不可以撤销刚才的删除
        }
    }
}

7.给菜单项添加快捷键(%=ctrl, #=shift, &=alt)

using UnityEditor;
using UnityEngine;

public class Tools
{
    //%=ctrl #=shift &=alt
    [MenuItem("tools/test1 %q")]
    static void Test1()
    {
        Debug.Log("test1");
    }
    [MenuItem("tools/test2 _t")]
    static void Test2()
    {
        Debug.Log("test2");
    }
}

8.控制菜单项是否启用的功能(将MenuItem()的第二个参数设为true)

using UnityEditor;
using UnityEngine;

public class Tools
{
    [MenuItem("GameObject/my delete", true , 0)]
    static bool MyDeleteValidate()
    {
        if (Selection.objects.Length > 0)
            return true;
        else
            return false;

    }

    [MenuItem("GameObject/my delete", false, 0)]
    static void MyDelete()
    {
        foreach (Object o in Selection.objects)
        {
            Undo.DestroyObjectImmediate(o);//按Ctrl+Z可以撤销刚才的删除。推荐使用
            //GameObject.DestroyImmediate(o);按Ctrl+Z不可以撤销刚才的删除
        }
    }
}

              

9.关于ContextMenu和ContextMenuItem的使用

  • ContextMenu(需要UnityEditor命名空间)
using UnityEditor;
using UnityEngine;

public class Cube : MonoBehaviour {
    public float speed;

    [ContextMenu("setSpeed")]
    void Init(MenuCommand cmd)
    {
        speed = 200;
    }
}

 

  • ContextMenuItem(不需要UnityEditor命名空间)
using UnityEngine;

public class Cube : MonoBehaviour {
    [ContextMenuItem("AddSpeed","AddSpeed")]
    public float speed;

    void AddSpeed()
    {
        speed += 10;
    }
}

10.创建对话框

using UnityEditor;

public class EnemyChange : ScriptableWizard  {

    [MenuItem("myTools/CreateWizard")]
    static void CreateWizard()
    {
        DisplayWizard<EnemyChange>("统一修改敌人","修改");
    }
}

 

         点击myTools-CreateWizard,弹出“统一修改敌人”对话框:

11.兼容按钮点击统一修改字段

using UnityEngine;
using UnityEditor;

public class EnemyChange : ScriptableWizard  {

    [MenuItem("myTools/CreateWizard")]
    static void CreateWizard()
    {
        DisplayWizard<EnemyChange>("统一修改敌人","修改");
    }
    public int changeSpeed = 10;

    private void OnWizardCreate()//检测“修改”按钮的触发
    {
        Debug.Log("click");
        GameObject[] gos = Selection.gameObjects;
        foreach (GameObject go in gos)
        {
            gameobject_hp hp = go.GetComponent<gameobject_hp>();
            Undo.RecordObject(hp, "撤销更改");//按CTRL+Z可以返回上一步
            hp.Hp += 10;
        }
    }
}

       同时选中GameObjective-Cube和GameObjective-Sphere,点击【myTools】-【CreateWizard】-【修改】后,我们会发现它们的共同组件GameObjective-hp里的Hp属性从100变成了110。此时若再按Ctrl+z,则会从110变成100:

12.显示提示框的帮助信息和错误信息

using UnityEngine;
using UnityEditor;

public class EnemyChange : ScriptableWizard  {

    [MenuItem("myTools/CreateWizard")]
    static void CreateWizard()
    {
        DisplayWizard<EnemyChange>("统一修改敌人","修改");
    }
    public int changeSpeed = 10;

    private void OnWizardCreate()//检测“修改”按钮的触发
    {
        GameObject[] gos = Selection.gameObjects;
        foreach (GameObject go in gos)
        {
            gameobject_hp hp = go.GetComponent<gameobject_hp>();
            Undo.RecordObject(hp, "撤销更改");
            hp.Hp += 10;
        }
    }

    private void OnWizardUpdate()//弹出对话框和修改对话框中的属性字段时会被调用
    {
        errorString = null;
        helpString = null;
        if(Selection.gameObjects .Length > 0)
        {
            helpString = "您当前选择了" + Selection.gameObjects.Length + "物体";
        }else
        {
            errorString = "请至少选择一个物体";
        }
    }
    private void OnSelectionChange()
    {
        OnWizardUpdate();
    }
}

13.创建OtherButton按钮并监听按钮点击(OnWizardOtherButton())

using UnityEngine;
using UnityEditor;

public class EnemyChange : ScriptableWizard  {

    [MenuItem("myTools/CreateWizard")]
    static void CreateWizard()
    {
        DisplayWizard<EnemyChange>("统一修改敌人","修改并关闭","修改");
    }
    public int changeSpeed = 10;

    private void OnWizardCreate()//检测“修改并关闭”按钮的触发
    {
        GameObject[] gos = Selection.gameObjects;
        foreach (GameObject go in gos)
        {
            gameobject_hp hp = go.GetComponent<gameobject_hp>();
            Undo.RecordObject(hp, "撤销更改");
            hp.Hp += 10;
        }
    }
    private void OnWizardOtherButton()//检测“修改”按钮的触发
    {
        OnWizardCreate();
    }

    private void OnWizardUpdate()//弹出对话框和修改对话框中的属性字段时会被调用
    {
        errorString = null;
        helpString = null;
        if (Selection.gameObjects.Length > 0)
        {
            helpString = "您当前选择了" + Selection.gameObjects.Length + "物体";
        }
        else
        {
            errorString = "请至少选择一个物体";
        }
    }
    private void OnSelectionChange()
    {
        OnWizardUpdate();
    }
}

14.使用ShowNotification显示提示信息(ShowNotification())

using UnityEngine;
using UnityEditor;

public class EnemyChange : ScriptableWizard  {

    [MenuItem("myTools/CreateWizard")]
    static void CreateWizard()
    {
        DisplayWizard<EnemyChange>("统一修改敌人","修改并关闭","修改");
    }
    public int changeSpeed = 10;

    private void OnWizardCreate()//检测“修改并关闭”按钮的触发
    {
        GameObject[] gos = Selection.gameObjects;
        foreach (GameObject go in gos)
        {
            gameobject_hp hp = go.GetComponent<gameobject_hp>();
            Undo.RecordObject(hp, "撤销更改");
            hp.Hp += 10;

            ShowNotification(new GUIContent(Selection.gameObjects.Length + "个游戏物体的值被修改了"));
        }
    }
    private void OnWizardOtherButton()//检测“修改”按钮的触发
    {
        OnWizardCreate();
    }

    private void OnWizardUpdate()//弹出对话框和修改对话框中的属性字段时会被调用
    {
        errorString = null;
        helpString = null;
        if (Selection.gameObjects.Length > 0)
        {
            helpString = "您当前选择了" + Selection.gameObjects.Length + "物体";
        }
        else
        {
            errorString = "请至少选择一个物体";
        }
    }
    private void OnSelectionChange()
    {
        OnWizardUpdate();
    }
}

15.使用EditorPrefs函数保存数据

using UnityEngine;
using UnityEditor;

public class EnemyChange : ScriptableWizard  {

    [MenuItem("myTools/CreateWizard")]
    static void CreateWizard()
    {
        DisplayWizard<EnemyChange>("统一修改敌人","修改并关闭","修改");
    }
    public int changeSpeed = 10;
    private void OnEnable()
    {
       changeSpeed = EditorPrefs.GetInt("EditSpeed", changeSpeed);
    }
    private void OnWizardCreate()//检测“修改并关闭”按钮的触发
    {
        GameObject[] gos = Selection.gameObjects;
        foreach (GameObject go in gos)
        {
            gameobject_hp hp = go.GetComponent<gameobject_hp>();
            Undo.RecordObject(hp, "撤销更改");
            hp.Hp += 10;

            ShowNotification(new GUIContent(Selection.gameObjects.Length + "个游戏物体的值被修改了"));
        }
    }
    private void OnWizardOtherButton()//检测“修改”按钮的触发
    {
        OnWizardCreate();
    }

    private void OnWizardUpdate()//弹出对话框和修改对话框中的属性字段时会被调用
    {
        errorString = null;
        helpString = null;
        if (Selection.gameObjects.Length > 0)
        {
            helpString = "您当前选择了" + Selection.gameObjects.Length + "物体";
        }
        else
        {
            errorString = "请至少选择一个物体";
        }
        EditorPrefs.SetInt("EditSpeed", changeSpeed);
    }
    private void OnSelectionChange()
    {
        OnWizardUpdate();
    }
}

16.显示进度条( EditorUtility.DisplayProgressBar())

using UnityEngine;
using UnityEditor;

public class EnemyChange : ScriptableWizard  {

    [MenuItem("myTools/CreateWizard")]
    static void CreateWizard()
    {
        DisplayWizard<EnemyChange>("统一修改敌人","修改并关闭","修改");
    }
    public int changeSpeed = 10;
    private void OnEnable()
    {
       changeSpeed = EditorPrefs.GetInt("EditSpeed", changeSpeed);
    }
    private void OnWizardCreate()//检测“修改并关闭”按钮的触发
    {
        GameObject[] gos = Selection.gameObjects;
        int count = 0;
        EditorUtility.DisplayProgressBar("进度", "0/" + gos.Length + "完成修改值", 0);
        foreach (GameObject go in gos)
        {
            gameobject_hp hp = go.GetComponent<gameobject_hp>();
            Undo.RecordObject(hp, "撤销更改");
            hp.Hp += 10;

            count++;
            EditorUtility.DisplayProgressBar("进度", count +"/" + gos.Length + "完成修改值", (float)count / gos.Length);
        }
        EditorUtility.ClearProgressBar();
        ShowNotification(new GUIContent(Selection.gameObjects.Length + "个游戏物体的值被修改了"));
    }
    private void OnWizardOtherButton()//检测“修改”按钮的触发
    {
        OnWizardCreate();
    }

    private void OnWizardUpdate()//弹出对话框和修改对话框中的属性字段时会被调用
    {
        errorString = null;
        helpString = null;
        if (Selection.gameObjects.Length > 0)
        {
            helpString = "您当前选择了" + Selection.gameObjects.Length + "物体";
        }
        else
        {
            errorString = "请至少选择一个物体";
        }
        EditorPrefs.SetInt("EditSpeed", changeSpeed);
    }
    private void OnSelectionChange()
    {
        OnWizardUpdate();
    }
}

17.创建自定义窗口

using UnityEngine;
using UnityEditor;

public class MyWindow :EditorWindow  {

    [MenuItem ("Window/myWindow")]
    static void ShowMyWindow()
    {
        MyWindow window = EditorWindow.GetWindow<MyWindow>();
        window.Show();
    }
    private string name;
    private void OnGUI()
    {
        GUILayout.Label("这是我的窗口");
        name = GUILayout.TextField(name);
        if(GUILayout .Button("创建"))
        {
            GameObject go = new GameObject(name);
            Undo.RegisterCreatedObjectUndo(go, "create gameobject");
        }
    }
}

 

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值