c# - posicion - unity playerprefs webgl
Guardar/cargar datos en Unity (1)
He estado jugando con guardar y cargar en Unity en el que guardo una clase serializada en un archivo. Tengo una clase serializable:
[Serializable]
class Save
{
public List<int> ID = new List<int>();
public List<int> Amounts = new List<int>();
}
y guárdelo en un archivo A-OK. Puedo cargarlo sin errores, pero si quisiera agregar más tarde:
[Serializable]
class Save
{
public List<int> ID = new List<int>();
public List<int> Amounts = new List<int>();
public int extra = 0;
}
y ejecuto mis scripts, me da un error de deserialización que entiendo completamente cuando lanzo el archivo deserializado a mi nueva clase ''Guardado'', la nueva variable que agregué no existe y me da el error.
Encontré este error cuando estaba arreglando un activo en la tienda y sé que una solución puede ser simplemente cambiar el nombre del archivo para que se cree un nuevo archivo, pero no solo quiero borrar el contenido de lo que se guardó antes.
Entonces, mi pregunta es, si quisiera agregar más variables a mi clase serializada, ¿cómo podría detectar y adaptarme a las versiones anteriores si la gente actualizara el activo?
¡Gracias!
Este problema se conoce cuando se usa el serializador C #.
Convierta los datos a Json con
JsonUtility
luego guárdelos con
PlayerPrefs
.
Al cargar, cargue con
PlayerPrefs
luego convierta el json a clase con
JsonUtility
.
Clase de ejemplo para guardar:
[Serializable]
public class Save
{
public List<int> ID = new List<int>();
public List<int> Amounts = new List<int>();
public int extra = 0;
public float highScore = 0;
}
Guardar datos :
void Save()
{
Save saveData = new Save();
saveData.extra = 99;
saveData.highScore = 40;
//Convert to Json
string jsonData = JsonUtility.ToJson(saveData);
//Save Json string
PlayerPrefs.SetString("MySettings", jsonData);
PlayerPrefs.Save();
}
Datos de carga :
void Load()
{
//Load saved Json
string jsonData = PlayerPrefs.GetString("MySettings");
//Convert to Class
Save loadedData = JsonUtility.FromJson<Save>(jsonData);
//Display saved data
Debug.Log("Extra: " + loadedData.extra);
Debug.Log("High Score: " + loadedData.highScore);
for (int i = 0; i < loadedData.ID.Count; i++)
{
Debug.Log("ID: " + loadedData.ID[i]);
}
for (int i = 0; i < loadedData.Amounts.Count; i++)
{
Debug.Log("Amounts: " + loadedData.Amounts[i]);
}
}
Diferencia entre
JsonUtility.FromJson
y
JsonUtility.FromJsonOverwrite
:
A.
JsonUtility.FromJson
crea un nuevo objeto a partir de Json y lo devuelve.
Asigna memoria.
string jsonData = PlayerPrefs.GetString("MySettings");
//Convert to Class. FromJson creates new Save instance
Save loadedData = JsonUtility.FromJson<Save>(jsonData);
B.
JsonUtility.FromJsonOverwrite
no
crea un nuevo objeto.
No tiene nada que ver con agregar más tipos de datos a su clase.
Simplemente sobrescribe los datos que se le pasan.
Es bueno para la conservación de la memoria y menos GC.
La única vez que asignará memoria si tiene campos como
array
,
string
y
List
.
Ejemplo de dónde se debe utilizar
JsonUtility.FromJsonOverwrite
es cuando se realiza una transferencia de datos constante con Json.
Mejorará el rendimiento.
//Create Save instance **once** in the Start or Awake function
Save loadedData = null;
void Start()
{
//loadedData instance is created once
loadedData = new Save();
}
void Load()
{
string jsonData = PlayerPrefs.GetString("MySettings");
//Convert to Class but don''t create new Save Object. Re-use loadedData and overwrite old data in it
JsonUtility.FromJsonOverwrite(jsonData, loadedData);
Debug.Log("High Score: " + loadedData.highScore);
}