• Unity获取脚本的CustomEditor(自定义编辑)数据


    在此之前,粗略的介绍下 CustomEditor(自定义编辑)。

    Unity对于我们创建的Mono脚本提供了属性面板的展示和修改。默认情况下,Inspector面板中会显示当前脚本类的公开字段(public field),这些字段会被序列化并储存在挂载的预制上。而有些情况下我们需要自定义展示和修改面板数据展示,这时候就用到了Unity提供的CustomEditor。

    CustomEditor特性:允许我们自定义当前脚本组件的Inspector检视面板。

    使用方法:

    1 public CustomEditor(Type inspectedType);
    2 public CustomEditor(Type inspectedType, bool editorForChildClasses);

    参数介绍:

    inspectedType:指定自定义那个类型的面板数据

    editorForChildClasses :是否子类使用同样的自定义面板,默认不使用

    使用示例片段:

    复制代码
    //TestData.cs
    
    using UnityEngine;
    /// 
    /// 测试代码
    /// 
    public class TestData : MonoBehaviour
    {
        [Range(0,1)]
        public float speed;
    }
    
    
    //TestDataEditor.cs
    
    using UnityEditor;
    
    /// 
    /// 测试代码,自定义面板数据显示
    /// 
    [CustomEditor(typeof(TestData))]
    public class TestDataEditor : Editor
    {
        private SerializedProperty _speed;
        TestData _target;
    
        private void OnEnable()
        {
            ///方式一
            _speed = serializedObject.FindProperty("speed");
    
            ///方式二
            //_target = (TestData)target;
        }
    
        public override void OnInspectorGUI()
        {
            //将_speed数据修改加入监听
            EditorGUI.BeginChangeCheck();
    
            /// 方式一
            serializedObject.Update();
            EditorGUILayout.PropertyField(_speed);
            serializedObject.ApplyModifiedProperties();
    
            ///方式二
            //_target.speed = EditorGUILayout.FloatField("速度", _target.speed);
    
            //_speed数据修改结束监听,并在发生修改时,做“脏”标记
            if (EditorGUI.EndChangeCheck())
            {
                EditorUtility.SetDirty(target);
            }
        }
    }
    复制代码

    在开发过程中,为了给其他同学提供一些便利,通过自定义显示面板数据是很常见的一件事。但这会导致我们有时直接获取的当前组件数据时,发现不是面板上序列化储存的值。出现这种原因是因为Editor这边直接执行了ApplyModifiedProperties,这时候我们可以通过序列化对象获取想要的数据。

    复制代码
    using UnityEngine;
    using UnityEditor;
    
    /// 
    /// 测试代码
    /// 
    public class TestData : MonoBehaviour
    {
        [Range(0,1)]
        public float speed;
    
        /// 
        /// 根据使用场景调用方法
        /// 
        private void TestFunc()
        {
            //序列化当前对象
            SerializedObject obj = new SerializedObject(this);
            //查找想要的数据
            var _speed = obj.FindProperty("speed");
            //进行日志输出或GUI绘制
            Debug.LogError($"原始数据:{speed},序列化后的数据:{_speed}");
        }
    }
    复制代码

    总结:我们要想在编辑器这边获取CustomEditor(自定义编辑)类的序列化数据时,只需要将当前类对象序列化即可。

    资料查找:

    1).Unity - Scripting API: CustomEditor

    2).Unity - Scripting API: CustomEditor.CustomEditor

  • 相关阅读:
    语法基础(判断语句)
    css基本介绍
    基于探针的分布式追踪工具
    XML解析
    智能优化算法:白鲸优化算法-附代码
    OpenCV(三十二):轮廓检测
    Echarts 实现 设备运行状态图(甘特图) 工业大数据展示
    HTML初识-概念和基本知识
    VUE前端工程化-3
    MySQL是如何保证主从一致的
  • 原文地址:https://www.cnblogs.com/CLXiao-1029/p/16596308.html