Префаб пользовательского редактора Unity показывает измененные значения - PullRequest
0 голосов
/ 08 мая 2020

У меня есть префаб, содержащий скрипт с настраиваемым редактором. Затем префаб изменяется в сцене, включая сам скрипт.

Я хочу, чтобы измененные переменные скрипта были выделены жирным шрифтом, например: bold variable

Но вместо этого переменная, измененная вне префаба, выглядит так же, как и любые другие (неизмененные) переменные. Я пробовал использовать Undo.RecordObject и EditorUtility.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 ();
    }
}

1 Ответ

1 голос
/ 08 мая 2020

Скорее напрямую используйте PropertyField например

[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();
    }
}

Таким образом, поля свойств

  • просто используйте правильный ящик в соответствии с ваш тип поля
  • автоматически обрабатывает маркировку как грязную (и тем самым сохраняет и отменяет / повторяет). Нет необходимости обрабатывать всю эту грязную маркировку и отслеживание повторений
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...