美文网首页UnityEditor
Unity编辑器扩展(二)

Unity编辑器扩展(二)

作者: _凉笙 | 来源:发表于2017-08-03 16:23 被阅读114次
    ScriptableWizard 创建对话框

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

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

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

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

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


    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();
        }
    
    Paste_Image.png

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


    Paste_Image.png
    创建Other Butten按钮

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

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

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

    //这个方法是实现OtherButton的方法
      private void OnWizardOtherButton()
        {
            OnWizardCreate();
        }
    
    Paste_Image.png

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

    使用ShowNotification显示提示信息

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


    Paste_Image.png

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


    Paste_Image.png
    EditorPrefs.SetInt()保存对话框修改后的值

    首先先保存两个字段

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

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


    Paste_Image.png

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

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

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


    Paste_Image.png
    显示进度条

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


    go
    Paste_Image.png

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


    Paste_Image.png
    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<MyWindow>();//创建一个功能窗口
            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


    Paste_Image.png

    相关文章

      网友评论

        本文标题:Unity编辑器扩展(二)

        本文链接:https://www.haomeiwen.com/subject/avfplxtx.html