0

我为我的一些 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 文件的更改。

4

4 回答 4

1

根本不要直接更改值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();
    }
}
于 2019-09-15T12:36:20.373 回答
0

在检查器的 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();
    }
}
于 2019-09-15T08:15:33.673 回答
0

您需要传递正确的对象以标记为脏到EditorUtility.SetDirty();. 目前您正在通过,bc但您需要通过obj,因为这就是您在代码中命名它的方式。这会将您的 ScriptableObject 标记为脏,一旦您选择 File > Save Project,它将被保存。

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

于 2019-09-15T08:19:42.010 回答
0

我有同样的问题,它需要我添加关键字

[CanEditMultipleObjects]

到类定义的顶部。

于 2021-06-01T04:33:49.557 回答