unity posicion playerprefs pasar para obtener objeto guardar escenas entre datos data aprender c# serialization unity3d

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); }