Jump to content
UnitySpain
oscar363

Lista ordenable no se guarda

Recommended Posts

Pues resulta que he hecho un script de Editor/Inspector de unity para hacer que una lista, que puede modificarse desde el inspector, sea ordenable. Para esto hay muchos tutoriales en internet. El script funciona bien, adjunto una imagen del inspector.

El problema es que al cerrar Unity y volver a abrirlo, los cambios han desaparecido, no se guardan. Es decir, cualquier cambio que le haga en la lista (añadir, quitar o modificar valores) se mantiene hasta que cierre Unity. Cuando vuelvo a abrir los cambios han desaparecido... Os dejo aquí el código, a ver si me podéis ayudar:

[CustomEditor(typeof(Dialog))]
public class DialogEventInspector : Editor {

    private ReorderableList reorderableList;

    private float[] sizes;
    private float[] steps;
    private float[] spaces;

    private Dialog dialog
    {
        get
        {
            return target as Dialog;
        }
    }

    private void OnEnable()
    {
        reorderableList = new ReorderableList(dialog.DialogEvents, typeof(DialogEvent), true, true, true, true);

        // for rects in draw
        sizes = new float[] { 0.19f, 0.19f, 0.19f, 0.08f, 0.03f, 0.18f, 0.08f};
        steps = new float[sizes.Length];
        float sum = 0.03f;
        for(int i = 0; i<sizes.Length; ++i)
        {
            steps[i] = sum;
            sum += sizes[i];
 
        }
        spaces = new float[] { 0.5f, 0.8f, 0.85f, 0.55f, 0.23f, 0.4f, 0.45f};

        // Add listeners to draw events
        reorderableList.drawHeaderCallback += DrawHeader;
        reorderableList.drawElementCallback += DrawElement;

        reorderableList.onAddCallback += AddItem;
        reorderableList.onRemoveCallback += RemoveItem;
    }

    private void OnDisable()
    {
        // Make sure we don't get memory leaks etc.
        reorderableList.drawHeaderCallback -= DrawHeader;
        reorderableList.drawElementCallback -= DrawElement;

        reorderableList.onAddCallback -= AddItem;
        reorderableList.onRemoveCallback -= RemoveItem;
    }

    private void DrawHeader(Rect rect)
    {
        
        GUI.Label(rect, getSpaceOf(0, rect) + "Name" + getSpaceOf(1, rect) + "Type"+ getSpaceOf(2, rect) + "Item"+ getSpaceOf(3, rect)+"GT" + getSpaceOf(4, rect) + "N"+ getSpaceOf(5, rect) + "Text" + getSpaceOf(6, rect) + "Darken");
    }

    private string getSpaceOf(int i, Rect rect)
    {
        string space = "";
        int Spaces = (int)(rect.width / 20 * spaces[i]);
        for (int k = 0; k < Spaces; ++k)
            space += ' ';
        return space;
    }

    private void DrawElement(Rect rect, int index, bool active, bool focused)
    {
        DialogEvent item = dialog.DialogEvents[index];

        EditorGUI.BeginChangeCheck();

        EditorGUI.LabelField(new Rect(rect.x, rect.y, rect.width * 0.03f, rect.height), index.ToString());

        item.Name = EditorGUI.TextField(new Rect(rect.x + steps[0]*rect.width, rect.y, sizes[0]*rect.width, rect.height), item.Name);

        item.eventType = (DialogEvent.EventType) EditorGUI.EnumPopup(new Rect(rect.x + steps[1]*rect.width, rect.y, rect.width*sizes[1], rect.height), item.eventType);

        item.Item = (DialogResource) EditorGUI.ObjectField(new Rect(rect.x + steps[2]*rect.width, rect.y, rect.width*sizes[2], rect.height), item.Item, typeof(DialogResource), true);

        item.GradualTime = EditorGUI.FloatField(new Rect(rect.x + steps[3] * rect.width, rect.y, rect.width * sizes[3] *0.75f, rect.height), item.GradualTime);

        item.PassToNext = EditorGUI.Toggle(new Rect(rect.x + steps[4] * rect.width, rect.y, rect.width * sizes[2], rect.height), item.PassToNext);

        item.Text = (DialogText)EditorGUI.ObjectField(new Rect(rect.x + steps[5] * rect.width, rect.y, rect.width * sizes[5], rect.height), item.Text, typeof(DialogText), true);

        item.Darken = EditorGUI.Toggle(new Rect(rect.x + steps[6] * rect.width*1.02f, rect.y, rect.width * sizes[6], rect.height), item.Darken);

        if (EditorGUI.EndChangeCheck())
        {
            EditorUtility.SetDirty(target);
        }

    }

    private void AddItem(ReorderableList list)
    {
        dialog.DialogEvents.Add(new DialogEvent());

        EditorUtility.SetDirty(target);
    }

    private void RemoveItem(ReorderableList list)
    {
        dialog.DialogEvents.RemoveAt(list.index);

        EditorUtility.SetDirty(target);
    }

    public override void OnInspectorGUI()
    {
        serializedObject.Update();

        base.OnInspectorGUI();

        // Actually draw the list in the inspector
        reorderableList.DoLayoutList();

        serializedObject.ApplyModifiedProperties();
    }
}

 

 

revista.jpg

Edited by oscar363

Share this post


Link to post
Share on other sites

No parece un problema del CustomEditor. ¿De dónde salen los datos? ¿Es de un Asset de la carpeta Resources o un PlayerPrefs?

Me da que estás re-creando la lista en el script de Dialog....

Share this post


Link to post
Share on other sites

Ya lo había pensado, pero no. En Dialog no asigno jamás DialogEvents. Aparte, resulta que si hago algún cambio en las componentes del objeto, sí que me guarda la lista. Es decir, si hago algún cambio en la lista y luego al objeto le añado cualquier componente, un script, lo que sea. Al cerrar y abrir Unity sí se han guardado los cambios.

Así que de momento, hasta que averigüe que pasa, para guardar los cambios añado una componente cualquiera y luego se la quito.

Te enseñaría el código de Dialog, pero es largo y contiene muchas cosas más. Aun así si quieres verlo dímelo y te lo pongo. Pero Dialog solo accede a la lista, no la modifica.

 

Share this post


Link to post
Share on other sites

×
×
  • Create New...