Guardar y cargar data de herramientas: json, scriptable objects, txt y csv
Clase 16 de 20 • Curso de Herramientas de Unity
Resumen
¿Qué es la serialización en Unity?
La serialización es un proceso crucial que permite transferir datos de la memoria de la computadora a un medio de almacenamiento más duradero, como un disco duro o una base de datos. En Unity, esta técnica se utiliza principalmente para guardar y recuperar datos de forma estructurada. Unity establece ciertas reglas para determinar qué tipos de datos pueden ser serializados. Los tipos públicos son serializables de manera predeterminada, mientras que los privados requieren el atributo SerializedField
. No se permite serializar datos estáticos, constantes o que solo se leen. Las listas pueden ser serializadas siempre y cuando contengan objetos que también sean serializables.
¿Qué tipos de datos se pueden serializar en Unity?
Unity permite la serialización de los siguientes tipos de datos:
- Tipos de datos primitivos y built-in de Unity como
Vector2
,Vector3
,Rect
, ySprite
. Structs
y clases personalizadas, que requieren una etiqueta para ser serializadas.- Arrays y listas, siempre y cuando contengan objetos serializables.
Para entender cómo se aplican estas reglas en la práctica, es conveniente explorar directamente en el editor de Unity.
¿Cómo serializar datos a un archivo JSON?
Para serializar datos a un archivo JSON, comenzamos creando una función que ejecutará el proceso. Esta función es privada para evitar que sea llamada externamente. El enfoque básico implica utilizar JSONUtility
, una clase en la librería de Unity, que facilita la conversión de objetos serializables a formato JSON.
Aquí un ejemplo de código para definir esta función:
private void SerializeToJSON()
{
string json = JSONUtility.ToJson(myObject, true);
string path = Application.dataPath + "/items.json";
File.WriteAllText(path, json);
AssetDatabase.Refresh();
}
¿Cómo llamar y ejecutar la función?
Para implementar y llamar la función de serialización, se puede usar un ContextMenu
en el editor que permita la ejecución rápida:
[ContextMenu("Save To JSON")]
private void SaveToJSON()
{
SerializeToJSON();
}
Así, al dar clic derecho en el objeto dentro del editor, la opción para guardar el JSON estará disponible rápidamente.
¿Cómo cargar datos desde un archivo JSON?
Para cargar datos desde un archivo JSON, es necesario verificar primero si la ruta del JSON existe. Luego, se puede utilizar File.ReadAllText
para cargar el archivo y convertir el string JSON de vuelta a un objeto mediante JSONUtility
.
[ContextMenu("Load From JSON")]
private void LoadFromJSON()
{
if (File.Exists(jsonPath))
{
string json = File.ReadAllText(jsonPath);
JSONUtility.FromJsonOverwrite(json, myObject);
}
}
¿Qué hacer si el objeto no es serializable?
En ocasiones, al serializar, puede haber objetos que no se añaden al archivo JSON. Esto ocurre cuando el objeto no sigue las reglas de serialización. Si una clase no es serializable, necesitarás etiquetarla con [System.Serializable]
.
Ejemplo de cómo hacer serializable una clase:
[System.Serializable]
public class CustomClass
{
[SerializeField] private int min;
[SerializeField] private int max;
public bool isActive;
}
Es vital asegurarse de que los campos privados tengan el atributo SerializeField
para incluirlos en el proceso de serialización.
¿Qué pasa si todavía no aparece en el JSON?
Si después de hacer las modificaciones mencionadas aún no se logra serializar, verifica que la visibilidad de la clase y sus miembros cumpla con los requisitos de serialización de Unity. Transforma los miembros necesarios en públicos o utiliza el atributo SerializeField
según corresponda.
Esta metodología no solo garantiza que la estructura de datos se transforma en JSON de manera efectiva, sino que también prepara el contenido para su reutilización en bases de datos u otras herramientas externas, maximizando la flexibilidad y reusabilidad del código.