美文网首页
Unity编辑器扩展

Unity编辑器扩展

作者: 呆然猫 | 来源:发表于2019-07-31 10:46 被阅读0次

    菜单栏扩展

    1. 创建一个Editor文件夹
    2. 在文件夹下创建c#脚本
    3. 脚本引用Unity.Editor
    4. 创建一个静态方法
    5. 在方法上下[MenuItem("菜单栏名/扩展按钮名)"]后面还可以跟两个参数,第一个isValidateFuntion(后面有介绍),第二个是级别,默认为1000,级别相差11就会有分割线
      例:
    using UnityEditor;
    using UnityEngine;
    public class Tools{
        [MenuItem("Tools/print")]
        static void print()
        {
            Debug.Log("This is a text");
        }
    }
    

    组件的右键菜单栏

    [MenuItem("CONTEXT/组件名/扩展按钮名)"]能添加任意组件的扩展按钮
    [ContextMenu("···")]直接添加所打开脚本的扩展按钮

    组件的属性右键菜单栏

    [ContextMenuItem("按钮名","方法名")]加在属性前,且方法必须存在

    MenuCommand

    MenuCommand有一个context变量,能够获取当前的组件对象,即MenuCommand.context为当前组件对象,将对象转换为当前组件就可以使用了

    Selection用来获取当前选取的游戏物体

    变量activityGameObject,获取Inspector面板上的游戏物体或者第一个选取的游戏物体
    变量objects,获取Hierarchy层级面板或者Project面板等上的所选取的游戏物体集合

    编写可以撤销的通过扩展按钮进行的删除操作

    不使用GameObject.DestroyImmediate(X);而是使用Undo.DestroyObjectImmediate(X);

    菜单项添加快捷键

    [MenuItem("菜单栏名/扩展按钮名 _t)"]快捷键就是T
    %=ctrl #=shift &=alt
    [MenuItem("菜单栏名/扩展按钮名 %q)"]快捷键就是ctrl+q

    isValidateFuntion

    表示是否为控制扩展按钮是否启用的方法
    例:

    using UnityEditor;
    using UnityEngine;
    public class Tools{
        [MenuItem("Tools/print"),false,12]
        static void Print()
        {
            Debug.Log("This is a text");
        }
        [MenuItem("Tools/print"),false,12]//除第二个参数,其他与上面保持一致
        static bool CtroPrint()    //方法名不相同,注意返回值为bool类型
        {
            if(Selection.objects.Length>0)    //选中了物体则启用,没有则不启用
             return true;
            else
            return false;  
        }
    }
    

    创建对话框,动态修改脚本字段

    例:

    using UnityEditor;
    public class ChangeHealth : ScriptableWizard {
        [MenuItem("Tools/CreateWizard")]
        static void CreateWizard()
        {
            //第一个参数是对话框的名字,第二个是对话框按钮的名字,默认为Create
            //第三个参数为第二个对话框按钮的名字,最多两个按钮
            //第一个执行完点击事件方法后就会自动关闭对话框,第二个不会关闭对话框
            ScriptableWizard.DisplayWizard<ChangeHealth>("修改血量", "change and close","change");
        }
        public int Health;
        private void OnEnable()             //对话框初始化时调用,相当于Awake
        {
            Health = 0;
        }
        private void OnWizardCreate()
        {
            GameObject[] roles = Selection.gameObjects;
            foreach (GameObject go in roles)
            {
                CompleteProject.EnemyHealth hp = go.GetComponent<CompleteProject.EnemyHealth>();
                Undo.RecordObject(hp, "Undo Health");
                hp.startingHealth += Health;
            }
            ShowNotification(new GUIContent("血量改变了"));//提示框信息
        }
        private void OnWizardOtherButton()
        {
            OnWizardCreate();
        }
        private void OnWizardUpdate()               //对话框变化使自动调用改方法,包括创建对话框,不包括关闭对话框
        {
            helpString = null;errorString = null;
            if (Selection.gameObjects.Length > 0)
            {
                helpString = "当前选择了" + Selection.gameObjects.Length + "个物体";        //提示信息
            }
            else
                errorString = "当前没有选择!";            //错误信息
        }
        private void OnSelectionChange()                //选择改变时调用
        {
            OnWizardUpdate();
        }
    }
    

    编辑器模式下数据保存

    使用EditorPrefs保存数据,相较于PlayerPrefs,这个不会被打包

    进度条的创建

    创建使用EditorUtility.DisplayProgressBar(进度条名,进度名,进度);
    进度加载完不会清除,要清除使用EditorUtility.ClearProgressBar();

    创建自定义窗口

    例:

    using UnityEngine;
    using UnityEditor;
    
    public class MyWindow : EditorWindow {
    
        [MenuItem("Tools/mywindow")]
        static void ShowMyWindow()
        {
            MyWindow myWindow = EditorWindow.GetWindow<MyWindow>();
            myWindow.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");
            }
        }
    }
    

    相关文章

      网友评论

          本文标题:Unity编辑器扩展

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