zoukankan      html  css  js  c++  java
  • 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("点击另一个按钮");
        }
    }
    
  • 相关阅读:
    属性序列化自定义与字母表排序-JSON框架Jackson精解第3篇
    URL及日期等特殊数据格式处理-JSON框架Jackson精解第2篇
    JSON数据处理框架Jackson精解第一篇-序列化与反序列化核心用法
    开源项目-跨项目及操作系统的通用代码生成器,解放您的双手
    图解并发与并行-分别从CPU和线程的角度理解
    8成以上的java线程状态图都画错了,看看这个-图解java并发第二篇
    面霸告诉你这些技术面试的非技术性经验,让你的面试成功率显著提升
    List集合对象去重及按属性去重的8种方法-java基础总结系列第六篇
    图解进程线程、互斥锁与信号量-看完不懂你来打我
    总结java中文件拷贝剪切的5种方式-JAVA IO基础总结第五篇
  • 原文地址:https://www.cnblogs.com/SHOR/p/9465178.html
Copyright © 2011-2022 走看看