簡體   English   中英

Unity:ScriptableObject 的自定義檢查器不起作用

[英]Unity: Custom Inspector for ScriptableObject not working

我為我的一些 ScriptableObject 創建了一個自定義檢查器。 檢查員似乎工作得很好。 如果檢查器中的值發生更改,則該值將在游戲中使用。 但是一旦我重新啟動 Unity,該值就會恢復到其舊值,因此更改不會應用於文件。 我已經通過查看文件進行了檢查。 這是我的自定義檢查器:

[CustomEditor(typeof(ScriptableObjects.OBJ))]
public class OBJEditor: UnityEditor.Editor {
    public override void OnInspectorGUI() {
        _ = DrawDefaultInspector();

        ScriptableObjects.OBJ obj = (ScriptableObjects.OBJ) target;
        obj.Offset = EditorGUILayout.Vector2Field("Offset", obj.Offset);

        ...

        EditorUtility.SetDirty(obj);
    }
}

我添加了行EditorUtility.SetDirty(bc); 因為我已經讀過這一行應該對文件應用更改。 ...代表其他一些與點上方的兩條線幾乎相同的線。

如何將更改保存到 ScriptableObject 文件。

根本不要通過target直接更改值!

手動處理設置臟和撤消/重做是復雜且不必要的!

始終使用內置的serializedObject並通過SerializedProperty

[CustomEditor(typeof(ScriptableObjects.OBJ))]
public class OBJEditor: UnityEditor.Editor 
{
    private SerializedProperty offset;

    private void OnEnable()
    {
        // Link the properties
        offset = serializedObject.FindProperty("Offset");
    }

    public override void OnInspectorGUI() 
    {
        DrawDefaultInspector();

        // Load the real class values into the serialized copy
        serializedObject.Update();

        // Automatically uses the according PropertyDrawer for the type
        EditorGUILayout.PropertyField(offset);

        ...

        // Write back changed values and evtl mark as dirty and handle undo/redo
        serializedObject.ApplyModifiedProperties();
    }
}

在檢查器的 OnEnable 方法上緩存您投射的“目標”被認為是最佳實踐。 你也有一個錯字,你設置了一個名為 'bc' 的對象變量,而你的目標變量是 'obj',你也在每次繪制調用時設置它,這會一直弄臟你的項目,最好弄臟它當事情真正發生變化時。

[CustomEditor(typeof(ScriptableObjects.OBJ))]
public class OBJEditor: UnityEditor.Editor 
{
    ScriptableObjects.OBJ obj = null;
    protected void OnEnable()
    {
        obj = (ScriptableObjects.OBJ)target;
    }
    public override void OnInspectorGUI() 
    {
        serializedObject.Update();

        _ = DrawDefaultInspector();

        EditorGUI.BeginChangeCheck();
        obj.Offset = EditorGUILayout.Vector2Field("Offset", obj.Offset);

        ...
        bool somethingChanged = EditorGUI.EndChangeCheck();
        if(somethingChanged)
        {
            EditorUtility.SetDirty(obj);
        }
        serializedObject.ApplyModifiedProperties();
    }
}

您需要將正確的對象傳遞給EditorUtility.SetDirty(); . 目前您正在傳遞bc但您需要傳遞obj ,因為這就是您在代碼中命名它的方式。 這會將您的 ScriptableObject 標記為臟,一旦您選擇File > Save Project ,它將被保存。

所以改變EditorUtility.SetDirty(bc); EditorUtility.SetDirty(obj);

我有同樣的問題,它需要我添加關鍵字

[CanEditMultipleObjects]

到類定義的頂部。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM