[转] unity编辑器扩展

      unity编辑器功能虽然已经很强大了,但是每个人的需要不同,所以,往往我们需要自定义编辑器,使得我们需要频繁的操作能够使用快捷按钮直接执行,这样会方便很多。今天就为大家讲解下编辑器扩展的基本使用方法,大家学习后可能根据实际情况扩展编辑器。

1在工具栏中创建一个按钮

代码:

[MenuItem("Tools/Test",false,1)]
static void Test()
{
    Debug.Log("test");  
}

注意:

MenuItem中第一个参数:需要创建选项在工具栏中的路径,此路径的父目录可以是Unity中已存在的,也可以自己直接同子目录一起创建,例如创建“MyApp/FPS”路径。

MenuItem中第二个参数:用于菜单项是否启用,后面会详细介绍。

MenuItem中第三个参数:该选项的优先级,默认为1000,越小优先级越大,选项越靠前。若需分块显示选项,则相邻两块之间的优先级必须相差11.

2分别在Hierarchy,Project中创建一个选项

在Hierarchy面板创建选项的代码:

[MenuItem("GameObject/Test",false,1)]
static void Test1()
{
    Debug.Log("test");
}

在Project面板创建选项的代码:

[MenuItem("Assets/Test")]
static void Test4()
{
    Debug.Log("test4");
}

注意:红色标记的为固定的,不能修改

3在组件中右击创建一个选项,并通过该选项修改该组件下面的字段的值

在组件中右击创建一个选项代码:

[MenuItem("CONTEXT/PlayerHealth/InitHealth")]
static void Test5()
{
    Debug.Log("init");
}

说明:
MenuItem中第二个参数:组件名

MenuItem中第三个参数:选项名

修改该组件下面的字段的值的代码:

[MenuItem("CONTEXT/Rigidbody/Clear")]
static void ClearMassAndGravity(MenuCommand cmd)
{
    Rigidbody rgd = cmd.context as Rigidbody;
    rgd.mass = 0;
    rgd.useGravity = false;
}

上述代码的功能为:将Rigidbody组件下面的质量修改为0,不使用重力

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

代码:

[MenuItem("Tools/GetChance", false, 1)]
static void GetChance()
{
    if (Selection.gameObjects.Length > 0)
    {
        Debug.Log(Selection.activeGameObject.name);  
        Debug.Log(Selection.gameObjects.Length);
    }
    else
    {
        Debug.Log("请选择至少一个游戏物体");
    }  
}

说明:
Selection.gameObjects.Length:选中游戏对象的个数

Selection.activeGameObject.name:第一个选择的游戏对象的名字。

5删除游戏对象并具有撤回功能

代码:

[MenuItem("Tools/Delete",false,1)]
static void Delete()
{
        GameObject[] go = Selection.gameObjects;
        foreach (GameObject g in go)
        {
            //GameObject.DestroyImmediate(g);
            Undo.DestroyObjectImmediate(g);
        }   
}

注意:
如果使用注释语句删除游戏对象,则不能撤回,不推荐使用。

Undo使得具有撤回功能,Ctrl+z(系统默认的撤回操作)

6给选项添加快捷键,控制菜单是否启用

代码:

[MenuItem("Tools/Delete ", true, 1)]
static bool DeleteVadidate()
{
        if (Selection.gameObjects.Length > 0) return true;
        else return false;
}
[MenuItem("Tools/Delete %d",false,1)]
static void Delete()
{
        GameObject[] go = Selection.gameObjects;
        foreach (GameObject g in go)
        {
            //GameObject.DestroyImmediate(g);
            Undo.DestroyObjectImmediate(g);
        }   
}

注意:Tools/Delete与%d之间有一个空格。添加快捷键时:%代表Ctrl,#代表Shift,&代表Alt,_加符号则代表快捷键为该符号

上述添加的绿色代码实现了控制菜单项是否启用。

7创建对话框,检测按钮的点击,点击按钮后提示信息,保存设置的数据,显示点击按钮后的处理的进度条信息

代码:

using UnityEditor;
using UnityEngine;

public class ChangeValue : ScriptableWizard {
                          
    public int health = 10;
    public int speed = 23;
   
    [MenuItem("Tools/CreateWizard")]
    static void CreateWizard()
    {
        ScriptableWizard.DisplayWizard<ChangeValue>("这是自己创建的标题", "按钮1的名字","按钮2的名字");
    }
    void OnWizardCreate()
    {
        ShowNotification(new GUIContent(Selection.gameObjects.Length + "多个游戏物体被改变"));//显示提示信息
        GameObject[] gameObject = Selection.gameObjects;
        EditorUtility.DisplayProgressBar("这是进度条的标题", "进度信息", 0);
        int count = 0;
        foreach (GameObject go in gameObject)
        {
            count++;
            CompleteProject.PlayerHealth ph = go.GetComponent<CompleteProject.PlayerHealth>();
            Undo.RecordObject(ph,"ph");//对点击事件的撤销功能
            ph.startingHealth += health;
            ph.flashSpeed += speed;
            EditorUtility.DisplayProgressBar("这是进度条标题", "进度信息", count / Selection.gameObjects.Length);
        }
        EditorUtility.ClearProgressBar();
    }
    void OnWizardOtherButton()
    {
        OnWizardCreate();
    }
    const string healtKey = "health";
    const string speedKey = "speed";
    void OnEnable()
    {
        health = EditorPrefs.GetInt(healtKey, health);
        speed = EditorPrefs.GetInt(speedKey, speed);   
    }
    void OnWizardUpdate()
    {
        string helpString = null;
        string errorString = null;
        if (Selection.gameObjects.Length > 0)
        {
            helpString = "您当前选择了" + Selection.gameObjects.Length + "个游戏物体";

        }
        else
        {
            errorString = "请选择至少一个游戏物体";
        }
        EditorPrefs.SetInt(healtKey, health);
        EditorPrefs.SetInt(speedKey, speed);           
    }
    void OnSelectionChange()
    {
        OnWizardUpdate();
    }
}

说明:
使用ScriptableWizard.DisplayWizard创建对话框<类名>(“对话框名标题”,“按钮1”,“按钮2”),当参数不设置按钮1是,则默认按钮名字为Create。按钮2根据实际情况决定是否需要。

使用Undo.RecordObject对点击事件的撤销功能,第一个参数为需要保存的值,第二为该值保存后的名字。

使用ShowNotification显示提示信息

使用EditorPrefs保存数据
使用EditorUtility.DisplayProgressBar显示进度条

8创建自定义窗口

代码:

using UnityEngine;
using UnityEditor;

public class MyWidow : EditorWindow
{
    [MenuItem("Window/Show MyWindow")]
    static void ShowMyWindow()
    {
        MyWidow myWindow = EditorWindow.GetWindow<MyWidow>();//创建自定义窗口
        myWindow.Show();//显示创建的自定义窗口
    }
    private string name = "";
    void OnGUI()
    {
        GUILayout.Label("这是我的自定义窗口");
        name = GUILayout.TextField(name);
        if (GUILayout.Button("创建"))
        {
            GameObject go = new GameObject(name);
            Undo.RegisterCreatedObjectUndo(go, "create gameObject");//允许撤回
        }
    } 
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值