Unity编辑器扩展(二)

ScriptableWizard 创建对话框

首先创建EnemyChange 脚本让其继承自ScriptableWizard ,这个脚本是用来展示对话框的属性。


using UnityEditor;
//继承自可编程的对话框
public class EnemyChange : ScriptableWizard {
//创建对话框
    [MenuItem("Tools/Create Wizard", false, 20)]
    static void CreateWizard()
    {
     ScriptableWizard.DisplayWizard("统一修改敌人","Change Value");//第二个参数表示修改弹出窗口的后确定的按钮名称
    }
//显示属性
    public int ChangeHealthValue=10;
    public int ChangeFlashSpeedValue = 10;
}
Unity编辑器扩展(二)_第1张图片
Paste_Image.png
OnWizardCreate方法检测确定按钮的点击

下面我们来做一个游戏对象的血量值以及速度的批处理的操作按钮。

 //这个方法用来批量修改选择的游戏物体脚本里面的各种值,包括速度,血量等等
    //这个方法可检测确定按钮(Change Value)的点击
    private void OnWizardCreate()
    {
      GameObject[] enemyPrefabs= Selection.gameObjects;//获取到选择的的对象
        foreach (GameObject  go in enemyPrefabs)
        {
            CompleteProject.EnemyHealth hp =go.GetComponent();//获取选择对象的EnemyHealth脚本
            Undo.RecordObject(hp, "Change health and speed");//可在修改参数之前作保存,并可在修改之后用Ctrl+z撤销参数的修改
            hp.startingHealth += ChangeHealthValue;//让选择预置物EnemyHealth脚本里面的参数startingHealth自增ChangeHealthValue的值
            hp.sinkSpeed += ChangeSinkSpeedValue;
        }
    }
Unity编辑器扩展(二)_第2张图片
Paste_Image.png

最后可以看到增加到了需要的值


Unity编辑器扩展(二)_第3张图片
Paste_Image.png
OnWizardUpdate与OnSelectionChange方法

那么我们如何来制作当我们选择一个游戏对象的时候的提示信息与没有选择的时候的错误信息呢,这里就要用到两个方法了。

    //当前字段值修改的时候会被调用,弹出对话框的时候也会被调用
    private void OnWizardUpdate()
    {
        errorString = null;//提示信息
        helpString = null;//错误信息
        if (Selection.gameObjects.Length>0) {//当选择的数量大于0的时候
            helpString = "您当前选择了" + Selection.gameObjects.Length + "个敌人";//提示选择了多少个对象
        } else {
            errorString = "请至少选择一个敌人";
        }
    }
    //当选择的Selection发生改变的时候就会触发OnSelectionChange方法
    private void OnSelectionChange()
    {
        OnWizardUpdate();
    }
Unity编辑器扩展(二)_第4张图片
Paste_Image.png

当我们没有选择任何一个游戏对象的时候会提示一个错误信息


Unity编辑器扩展(二)_第5张图片
Paste_Image.png
创建Other Butten按钮

创建Other Butten,只需要在 ScriptableWizard.DisplayWizard("统一修改敌人","Change Value");的后面加上第三个参数就可以添加一个Other Butten的按钮。这个按钮点击后对话框也不会自动关闭.

 [MenuItem("Tools/Create Wizard", false, 20)]
    static void CreateWizard()
    {
        ScriptableWizard.DisplayWizard("统一修改敌人","Change Value","Change");
    }

然后我们再去实现这个按钮的方法

//这个方法是实现OtherButton的方法
  private void OnWizardOtherButton()
    {
        OnWizardCreate();
    }
Unity编辑器扩展(二)_第6张图片
Paste_Image.png

每点击一次EnemyHealth里面的值都会相应的增加

使用ShowNotification显示提示信息

直接在OnWizardCreate方法里面增加显示提示的方法。


Unity编辑器扩展(二)_第7张图片
Paste_Image.png

然后我们点击Change按钮后会提示


Unity编辑器扩展(二)_第8张图片
Paste_Image.png
EditorPrefs.SetInt()保存对话框修改后的值

首先先保存两个字段

    const string ChangeStartHealthValueKey= "EnemyChange.ChangeStartHealthValueKey";
      const string ChangeStartSinkSpeedValueKey = "EnemyChange.ChangeStartSinkSpeedValueKey";

然后在OnWizardUpdate()方法里面写入 EditorPrefs.SetInt()方法让它每次设置值的时候保存这两个值。


Unity编辑器扩展(二)_第9张图片
Paste_Image.png

当值保存后,我们需要在每次打开窗口的时候将设置的值赋值上去.写一个OnEnable方法当窗口打开的时候调用。

  private void OnEnable()
    {
        //当窗口被创建出来的时候被调用
        ChangeHealthValue= EditorPrefs.GetInt(ChangeStartHealthValueKey, ChangeHealthValue);//第一个参数是保存的值,第二个参数是当没修改的时候默认的值
        ChangeSinkSpeedValue= EditorPrefs.GetInt(ChangeStartSinkSpeedValueKey, ChangeSinkSpeedValue);
    }

修改值后第二次打开窗口发现修改的值被保留了下来


Unity编辑器扩展(二)_第10张图片
Paste_Image.png
显示进度条

这个EditorUtility工具类里面有很多编辑方法。


Unity编辑器扩展(二)_第11张图片
go

Unity编辑器扩展(二)_第12张图片
Paste_Image.png

只需要在OnWizardCreate()方法中添加显示进度条的方法就行了,最后完成后我们调用隐藏的方法这样就完成了


Unity编辑器扩展(二)_第13张图片
Paste_Image.png

Unity编辑器扩展(二)_第14张图片
Paste_Image.png
创建自定义窗口(功能窗口)

继承自EditorWindow类的功能窗口

using UnityEngine;
using UnityEditor;

public class MyWindow :  EditorWindow{

    [MenuItem("Tools/Show Mywindow",false,50)]
    static void ShowMyWindow() {
     MyWindow window= EditorWindow.GetWindow();//创建一个功能窗口
        window.Show();//显示功能窗口
    }
    private string name="";
    private void OnGUI()
    {
        GUILayout.Label("窗口");
     name=   GUILayout.TextField(name);
        if (GUILayout.Button("点击我")) {
            GameObject go = new GameObject(name);
            Debug.Log("创建了一个空的游戏对象");
            Undo.RegisterCreatedObjectUndo(go,"Creat gameobject");//将创建的操作记录记录上这样可以撤回已经创建的对象
                }
    }
}

输入名字创建一个了一空的游戏对象。这样简单的功能窗口就出来了。想更了解可以去看官网EditorWindow类的API


Unity编辑器扩展(二)_第15张图片
Paste_Image.png

你可能感兴趣的:(Unity编辑器扩展(二))