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

Posted Aili_Xiao

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Unity获取脚本的CustomEditor(自定义编辑)数据相关的知识,希望对你有一定的参考价值。

在此之前,粗略的介绍下 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: CustomEditorUnity is the ultimate game development platform. Use Unity to build high-quality 3D and 2D games, deploy them across mobile, desktop, VR/AR, consoles or the Web, and connect with loyal and enthusiastic players and customers.https://docs.unity3d.com/530/Documentation/ScriptReference/CustomEditor.html

2).Unity - Scripting API: CustomEditor.CustomEditorUnity is the ultimate game development platform. Use Unity to build high-quality 3D and 2D games, deploy them across mobile, desktop, VR/AR, consoles or the Web, and connect with loyal and enthusiastic players and customers.https://docs.unity3d.com/530/Documentation/ScriptReference/CustomEditor-ctor.html

以上是关于Unity获取脚本的CustomEditor(自定义编辑)数据的主要内容,如果未能解决你的问题,请参考以下文章

如何自定义unity的inspector面板

unity android assetbundle 无法再ios中显示怎么办

unity3d 资源打包加密

删除 BoxCollider 时的 Unity3D MissingReferenceException

Unity游戏开发之怎么在代码里面引用到Inspector里面显示的值

unity URP内置shader lit解析