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; /// <summary> /// 测试代码 /// </summary> public class TestData : MonoBehaviour {     [Range(0,1)]     public float speed; }   //TestDataEditor.cs using UnityEditor;  /// <summary> /// 测试代码,自定义面板数据显示 /// </summary> [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;  /// <summary> /// 测试代码 /// </summary> public class TestData : MonoBehaviour {     [Range(0,1)]     public float speed;      /// <summary> /// 根据使用场景调用方法     /// </summary> 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

商匡云商
Logo
注册新帐户
对比商品
  • 合计 (0)
对比
0
购物车