在此之前,粗略的介绍下 CustomEditor(自定义编辑)。
Unity对于我们创建的Mono脚本提供了属性面板的展示和修改。默认情况下,Inspector面板中会显示当前脚本类的公开字段(public field),这些字段会被序列化并储存在挂载的预制上。而有些情况下我们需要自定义展示和修改面板数据展示,这时候就用到了Unity提供的CustomEditor。
CustomEditor特性:允许我们自定义当前脚本组件的Inspector检视面板。
使用方法:
public CustomEditor(Type inspectedType);
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
转载至:https://www.cnblogs.com/CLXiao-1029/p/16596308.html
注意:本文归作者所有,未经作者允许,不得转载