unity编辑器扩展《二》

unity编辑器扩展《二》
**本篇是接着上篇博客继续的,如果看不懂的宝宝们,可以去参考第一篇哦**

标题编辑器常用的几种添加方式

7. 给菜单栏自定义的按钮添加快捷键
例子:定义了点击S的快捷方式

 [MenuItem("GameObject/Select _s",false,12)]
    static void Selects()
    {
        Debug.Log("我是Select方法");
    }

注意: 添加快捷键的时候在路径后面一定要加空格 单个定义快捷键的时候前面要加_ <>font>

这里是使用的组合快捷键

 [MenuItem("GameObject/Test %q", true, 12)]
  static void Tests()
  {
            Debug.Log("我是Test方法");
   }

注意: Ctrl在这里用%表示,Shift用# ,Alt用&

在这里插入图片描述
8. 控制菜单栏按钮是否启用

 [MenuItem("GameObject/Test %q", true, 12)]
    static bool Test()
    {
        if (Selection.objects.Length > 0)
        {
            return true;
        }
        else
        {
            return false;
        }
    }
   
    [MenuItem("GameObject/Test %q", false, 12)]
    static void Tests()
    {
        Debug.Log("我是Test方法");
    }

注意:两个方法必须同时写,并且,两个的菜单栏路径必需相同。

在这里插入图片描述
9. 关于ContextMenu和ContextMenuItem两个方法的使用
这是我写的一个测试的脚本,凑合看一下吧!!!

public class Test : MonoBehaviour
{
    //参数一:按钮的名字
    //参数二:方法的名字,方法必须真实存在的
    [ContextMenuItem("Add Time","AddTime")]
    public int Time = 0;
    public Color color=Color.blue;

    public GameObject go;

    public string str = "Test";


    void AddTime()
    {
        Time += 1;
    }

    [ContextMenu("ChangeColor")]
    void ChangeColor()
    {
        color=Color.cyan;
    }
}

这个介绍的是ContextMenuItem的使用方法
在这里插入图片描述

这个示意图介绍的是ContextMenu的使用。
在这里插入图片描述

10. 关于如何创建对话框(系统对话框)

public class DialogBox :ScriptableWizard
{
//定义一些字段,在窗口中显示
public int List = 0;
public string name = "";

[MenuItem("Test/Dialog")]
static void Dialog()
{
    //创建一个对话框,
    //第一个参数是对话框的名字,第二个是对话框默认按钮的名字,默认名字为Create,第三个参数是其他按钮的名字
    //第二个参数中的按钮既可以实现方法,同时也会把对话框关闭,并且实现按钮的方法名是固定的(OnWizardCreate()),
    //第三个参数创建的按钮只会实现里面的代码块,不会使按钮关闭,实现按钮的方法名也是固定的。(OnWizardOtherButton())
    ScriptableWizard.DisplayWizard<DialogBox>("第一个对话框","ChangeNameAndClose","ChangeName");
}
/// <summary>
/// 对话框按钮实现的固定方法(第一个按钮的实现方法)
/// </summary>
void OnWizardCreate()
{
    //这里使用Selection.gameObjects是因为它不仅可以修改场景中的颗粒,也可以修改预设物。
    //Selection。Objects只能修改场景中的颗粒。
    foreach (GameObject go in Selection.gameObjects)
    {
        //添加了撤销的功能
        Undo.RecordObject(go,"repeal");
        go.name = name+List;
        List++;
    }
}
/// <summary>
/// 允许在用户单击其他按钮时提供操作。固定方法(第二个按钮的实现方法)
/// </summary>
void OnWizardOtherButton()
{
    OnWizardCreate();
}

注意:新创建的脚本要继承ScriptableWizard这个类,这个类是创建对话框的类

在这里插入图片描述

11. 在窗体上显示提示框的帮助信息

 /// <summary>
/// 当窗口打开或者修改窗口中某些字段的值时会调用
/// </summary>
void OnWizardUpdate()                    //自带方法
{

    //helpString:允许您设置向导的帮助文本
    //errorString:允许您设置向导的错误提示文本
    helpString = "";
    errorString = "";
    if (Selection.gameObjects.Length > 0)
    {
        helpString = "你选择了" + Selection.gameObjects.Length + "个物体";
    }
    else
    {
        errorString = "请至少选择一个物体";
    }
}
//当选择物体发生更改时调用,用这个方法保证窗口中的提示信息会随着操作而刷新。
void OnSelectionChange()  //自带方法
{
    OnWizardUpdate();
}

在这里插入图片描述
还有一种提示方式,在执行操作后显示你的操作的提示信息,为了提醒你操作完成

只需在你要执行的方法后加上 ShowNotification()方法,填上你要提示的信息即可

 //这个方法主要是为了提示你的操作,为了方便提醒自己
    ShowNotification(new GUIContent("你修改了"+Selection.gameObjects.Length+"个物体"));

在这里插入图片描述
12. 保存你在窗口上输入的数据,不用每次打开窗口都要重新拖拽,输入

主要使用 EditorPrefs.SetInt/SetString()方法等进行存档 EditorPrefs.GetInt/GetString();进行读档。下面是一个简单的例子。

 [MenuItem("Test/Dialog")]
static void Dialog()
{      
    ScriptableWizard.DisplayWizard<DialogBox>("第一个对话框","ChangeNameAndClose","ChangeName");
}
void OnEnable()
{
    name = EditorPrefs.GetString("Name");
    List = EditorPrefs.GetInt("List");
}
/// <summary>
/// 对话框按钮实现的固定方法
/// </summary>
void OnWizardCreate()
{
    foreach (GameObject go in Selection.gameObjects)
    {
        //添加了撤销的功能
        Undo.RecordObject(go,"repeal");
        go.name = name+List;
        List++;
    }
    //主要是为了方便记录,记录你上次输入的值
    EditorPrefs.SetString("Name",name);
    EditorPrefs.SetInt("List",List);
}

12. 当你要修改大批量的物体时,怎样显示进度条
只需要调用系统封装的方法即可

第一个参数是进度条的名字。 第二个参数是可以是你对于进度执行多少的一个提示信息。 第三个参数,是你要执行的总量.(例如修改颗粒的个数)

  EditorUtility.DisplayProgressBar("修改进度", "修改了"+Selection.gameObjects.Length+ "/"+ List  , List/Selection.gameObjects.Length);

运行之后你会发现进度条走完了之后不会消失,在这句话后面加上,这句代码就会在执行完之后自动销毁进度条。

 EditorUtility.ClearProgressBar();
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值