Configuré un script de editor muy simple en Unity 2020.2.1f1 que, al presionar un botón Inspector, debería cambiar el valor de un parámetro específico a un valor establecido en el código.
public override void OnInspectorGUI() { DrawDefaultInspector(); StateObject s = (StateObject)target; if (s.objID == 0) { if (GUILayout.Button("Generate Object ID")) { GenerateID(s); } } } public void GenerateID(StateObject s) { s.objID = DateTimeOffset.Now.ToUnixTimeSeconds(); }Todo esto funciona como se supone que debe hacerlo. Presiono el botón, aparece el número correcto en el campo y estoy feliz. Sin embargo, una vez que cambio al modo de reproducción, el valor se restablece al valor predeterminado prefabricado y permanece así incluso cuando desactivo el modo de reproducción.
¿Me estoy perdiendo alguna función ApplyChange o algo así?
(EDITAR: Esto funciona, pero no es tan bueno como la respuesta aceptada).
Bueno, sí, de hecho, me falta algún tipo de función ApplyChange.
No sé cómo me lo perdí, pero estaba buscando esto:
EditorUtility.SetDirty(target);Entonces, en mi script, solo editaría la función GenerateID:
public void GenerateID(StateObject s) { s.objID = DateTimeOffset.Now.ToUnixTimeSeconds(); EditorUtility.SetDirty(s); }Y lo estoy publicando aquí en caso de que alguien se encuentre con el mismo problema, de esa manera, con suerte, no tendrán que pasar tanto tiempo buscando una solución antes de recordar que SetDirty existe.
En mi opinión, es mejor que mezclar los accesos directos desde los scripts del Editor y luego marcar manualmente las cosas sucias en lugar de pasar por SerializedProperty y dejar que el Inspector se encargue de todo (también el marcado sucio y guardar cambios, manejar deshacer/rehacer, etc.)
SerializedProperty id; private void OnEnable() { id = serializedObject.FindProperty("objID"); } public override void OnInspectorGUI() { DrawDefaultInspector(); // Loads the actual values into the serialized properties // See https://docs.unity3d.com/ScriptReference/SerializedObject.Update.html serializedObject.Update(); if (id.intValue == 0) { if (GUILayout.Button("Generate Object ID")) { id.intValue = DateTimeOffset.Now.ToUnixTimeSeconds(); } } // Writes back modified properties into the actual class // Handles all marking dirty, undo/redo, etc // See https://docs.unity3d.com/ScriptReference/SerializedObject.ApplyModifiedProperties.html serializedObject.ApplyModifiedProperties(); }