свойства не сериализуемы !
те, которые вы никогда не должны изменять в скриптах редактора, поскольку они не сериализуются => никогда не сохраняются и всегда будут иметь значение по умолчанию.
будет не работать, если это свойство как
public bool GetLockState
{
get { return doorLockState; }
set { doorLockState = value; }
}
зачем вообще использовать это, если ваш doorLockState
равен public
?
Проблема в том, что измененное поле doorLockState
не помечается как "грязное".
Однако вы должны не использовать EditorUtility.SetDirty
, как предложено другим ответом из-за:
Начиная с версии 5.3, с введением Multi-Scene Editing, эта функция больше не должна использоваться для изменения объектов в сценах . Вместо этого вы должны использовать Undo.RecordObject
до внесения изменений в объект. Это пометит Сцену объекта как dirty и предоставит запись отмены в редакторе. '
Вместо этого в скрипте редактора вы должны изменить значение doorLockState
.
Если это где private
, вам нужно было бы добавить [SerializeField]
[SerializeField] private bool doorLockState;
Но в вашем случае, похоже, оно равно public
, поэтому оно автоматически сериализуется.
Чем всегда используйте правильные SerializedProperty и PropertyField вместо прямой манипуляции значениями в сценариях редактора!
Вначале все выглядит сложнее, но он обрабатывает такие вещи, как Undo / Redo и помечает вещи как «грязные» (таким образом, сохраняя изменения) автоматически, так что вам не нужно больше ни о чем заботиться:
[CustomEditor(typeof(DoorsLockManager))]
public class DoorsLockManagerEditor : Editor
{
private SerializedProperty _doors;
private void OnEnable()
{
_doors = serializedObject.FindProperty("Doors");
}
public override void OnInspectorGUI()
{
base.OnInspectorGUI();
for (int i = 0; i < _doors.arraySize; i++)
{
var door = _doors.GetArrayElementAtIndex(i);
// if door == null the script itself has an error since it can't even find the SerializedProperty
if (door == null)
{
EditorGUILayout.HelpBox("There was an error in the editor script!\nPlease check the log", MessageType.Error);
Debug.LogError("Couldn't get door property", target);
return;
}
if (door.objectReferenceValue == null) continue;
// FindPropertyRelative seems not to work for MonoBehaviour classes
// so we have to use this hack around
var serializedDoor = new SerializedObject(door.objectReferenceValue);
// If it's public no worry anyway
// If it's private still works since we made it a SerializeField
var lockState = serializedDoor.FindProperty("doorLockState");
// Fetch current values into the serialized "copy"
serializedDoor.Update();
if (lockState == null)
{
EditorGUILayout.HelpBox("There was an error in the editor script!\nPlease check the log", MessageType.Error);
Debug.LogError("Couldn't get lockState property", target);
return;
}
// for the PropertyField there is
// no return value since it automatically uses
// the correct drawer for the according property
// and directly changes it's value
EditorGUILayout.PropertyField(lockState, new GUIContent("Door " + i + " Lockstate"));
// or alternatively
//lockState.boolValue = EditorGUILayout.Toggle("Door " + i + " Lockstate", lockState.boolValue);
// Write back changes, mark as dirty if changed
// and add a Undo history entry
serializedDoor.ApplyModifiedProperties();
}
}
}

(Конечно, значение обновляется только OnInspectorGUI
, поэтому, если у вас открыто несколько вкладок Инспектора, оно обновляется только при наведении)