• Unity编辑器


    新博客:https://yinl.fun
    欢迎关注,同步更新

    Unity编辑器

    这篇文章主要总结一下最近工作时写的一些编辑器,总结了三种常用的编辑器编写方式:

    Inspector Editor

    利用CustomEditor特性挂接Script来实现Inspector界面显示

    InspectorEditorImage

    首先我们给出对应的Script代码,主要是为了提供Inspector面板的参数而用

    public class SampleEditorScript : MonoBehaviour
    {
        public int sliderNum = 0;
        public int intNum = 0;
        public float floatNum = 0f;
        public string str = "";
        public Vector2 pos = Vector2.zero;
    }
    

    之后写对应的Editor文件

    // 脚本为前面编写的数据脚本
    [CustomEditor(typeof(SampleEditorScript))]
    // [CanEditMultipleObjects] 多对象编辑
    public class SampleEditor : Editor
    {
        SerializedProperty sliderNum;
        SerializedProperty intNum;
        SerializedProperty floatNum;
        SerializedProperty str;
        SerializedProperty pos;
    
        void OnEnable()
        {
            // 将值传给对应的SerializedProperty
            sliderNum = serializedObject.FindProperty("sliderNum");
            intNum = serializedObject.FindProperty("intNum");
            floatNum = serializedObject.FindProperty("floatNum");
            str = serializedObject.FindProperty("str");
            pos = serializedObject.FindProperty("pos");
        }
    
        /// <summary>
        /// 绘制Inspector窗口
        /// </summary>
        public override void OnInspectorGUI()
        {
            // 每次绘制insperctor面板的时候都应该更新一下serializedObjectd的数据
            serializedObject.Update();
    
            // 除PropertyField函数外,正常函数也封装了传入SerializedProperty的用法
            EditorGUILayout.IntSlider(sliderNum, 0, 100, new GUIContent("Slider"));
            ProgressBar(sliderNum.intValue / 100.0f, "Slider Num");
    
            // PropertyField好处为自动识别类型
            EditorGUILayout.PropertyField(intNum, new GUIContent("Int Num"));
            EditorGUILayout.PropertyField(floatNum, new GUIContent("Float Num"));
            EditorGUILayout.PropertyField(str, new GUIContent("string"));
            EditorGUILayout.PropertyField(pos, new GUIContent("Vector2"));
    
            // 将数据更改应用于serializedObject
            serializedObject.ApplyModifiedProperties();
        }
    
        /// <summary>
        /// 绘制Scene窗口
        /// </summary>
        void OnSceneGUI()
        {
            // 绘制的线为红色
            Handles.color = Color.red;
            // 在点(0,0,0)到(1,1,1)画一条红线
            Handles.DrawLine(Vector3.zero, Vector3.one);
        }
    
        /// <summary>
        /// 自定义进度条
        /// </summary>
        /// <param name="value">进度条值</param>
        /// <param name="label">进度条名字</param>
        void ProgressBar(float value, string label)
        {
            // 为文本框绘制一个进度条
            Rect rect = GUILayoutUtility.GetRect(18, 18, "TextField");
            EditorGUI.ProgressBar(rect, value, label);
            EditorGUILayout.Space();
        }
    }
    

    EditorWindow

    创建一个编辑器视窗,视窗可以内嵌到Unity编辑器中

    EditorWindowImage

    public class SampleEditorWindow : EditorWindow
    {
        private int intNum = 0;
        private float floatNum = 0f;
        private string str = "";
        private Vector2 SVPos;
    
        /// <summary>
        /// 菜单栏响应函数
        /// </summary>
        [MenuItem("EditorTools/SampleEditorWindow")]
        static void Init()
        {
            // 初始化窗口并显示
            SampleEditorWindow window = (SampleEditorWindow)GetWindow(typeof(SampleEditorWindow));
            window.Show();
        }
    
        /// <summary>
        /// 界面绘制函数
        /// </summary>
    	  void OnGUI()
    	  {
            // 绘制可用EditorGUILayout、GUILayout所提供的函数等
    
            // 竖直排版
            EditorGUILayout.BeginHorizontal();
            // 滑动组件
            SVPos = EditorGUILayout.BeginScrollView(SVPos);
            // int输入框
            intNum = EditorGUILayout.IntField("Int Num", intNum);
            // float输入框
            floatNum = EditorGUILayout.FloatField("Float Num", floatNum);
            // string输入框
            str = EditorGUILayout.TextField("string", str);
            // 等等...
            EditorGUILayout.EndScrollView();
            EditorGUILayout.EndHorizontal();
        }
    }
    

    ScriptableWizard

    创建一个编辑器导航视窗

    ScriptableWizardImage

    public class SampleScriptableWizard : ScriptableWizard
    {
        public int intNum = 0;
        public float floatNum = 0f;
        public string str = "";
    
        [MenuItem("EditorTools/SampleScriptableWizard")]
        static void Init()
        {
            ScriptableWizard.DisplayWizard<SampleScriptableWizard>("Wizard界面", "Wizard按钮", "Wizard另一个按钮");
        }
    
        /// <summary>
        /// 界面的刷新
        /// </summary>
        void OnWizardUpdate()
        {
            helpString = "这是一条提示语句";
        }
    
    	  /// <summary>
    	  /// 按钮执行功能
    	  /// </summary>
        void OnWizardCreate()
        {
            Debug.Log("点击按钮");
        }
    
        void OnWizardOtherButton()
        {
            Debug.Log("点击另一个按钮");
        }
    }
    
  • 相关阅读:
    kuberbetes1.17.3二进制安装
    jvm启动cpu和负载高分析
    kubeadm安装的k8s集群证书过期处理
    Mongodb 相关链接
    perl 之 正则表达式 (简)
    ssh-copy-id 拷贝用户秘钥
    unicode & utf-8
    Python之路,Day3
    Python Day2 (二)
    find xargs 简单组合使用
  • 原文地址:https://www.cnblogs.com/SHOR/p/9465178.html
Copyright © 2020-2023  润新知