Unity 自定义编辑器预制件显示修改后的值

Unity custom editor prefab show modified values

我有一个预制件,其中包含带有自定义编辑器的脚本。然后在场景中修改预制件,包括脚本本身。

我想要的是将脚本的修改变量加粗,如下所示:

但是,在预制件之外修改的变量看起来就像任何其他(未更改的)变量一样。 我试过使用 Undo.RecordObjectEditorUtility.SetDirty 但没有成功。 也许这里有一些我错过的东西,比如我应该叫什么或行的顺序?

我搜索和测试脚本已经好几个小时了,但没有成功,如果有人能告诉我我做错了什么,那就太好了。

编辑器脚本如下所示:

using UnityEditor;
using UnityEngine;
using UnityEditor.SceneManagement;
using UnityEngine.SceneManagement;

[CustomEditor (typeof (MyScript))]
[CanEditMultipleObjects]
public class MyScriptEditor : Editor {

    SerializedProperty usePanel, [...], equalHints;

    protected virtual void OnEnable () {
        setvars ();
    }
    void setvars () {
        usePanel = serializedObject.FindProperty ("usePanel");
        // ...and more variables...
        equalHints = serializedObject.FindProperty ("equalHints");
        MyScript s = (MyScript) target;
        Undo.RecordObject (s, "test");
    }

    public override void OnInspectorGUI () {
        if (usePanel.Equals (null)) setvars ();
        MyScript s = (MyScript) target;
        if (GUI.changed) {
            EditorUtility.SetDirty (s); // <--- this was one of my attempts
            EditorSceneManager.MarkSceneDirty (SceneManager.GetActiveScene ());
        }

        usePanel.boolValue = EditorGUILayout.Toggle ("Use Panel", usePanel.boolValue);
        // some more lines of code here
        if (equalHints.boolValue) {
            // do some stuff
        }
        this.serializedObject.ApplyModifiedProperties ();
    }
}

不如直接用一个PropertyField like

[CustomEditor (typeof (MyScript))]
[CanEditMultipleObjects]
public class MyScriptEditor : Editor 
{
    SerializedProperty usePanel /*, ... */, equalHints;

    protected virtual void OnEnable () 
    {
        setvars ();
    }

    void setvars () 
    {
        usePanel = serializedObject.FindProperty("usePanel");
        // ...and more variables...
        equalHints = serializedObject.FindProperty("equalHints");
    }

    public override void OnInspectorGUI () 
    {
        // don't forget this one
        // this gets the current values into the serialized properties
        serializedObject.Update();

        EditorGUILayout.PropertyField(usePanel);

        EditorGUILayout.PropertyField(equalHints);

        if (equalHints.boolValue) 
        {
            // do some stuff
        }

        serializedObject.ApplyModifiedProperties();
    }
}

这样 属性 个字段

  • 只需根据您的字段类型使用正确的抽屉
  • 自动处理脏标记(从而节省 undo/redo)。您无需处理所有脏标记和重做跟踪