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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章