unity script score savedata puntaje playerprefs hacer guardar datos con como c# unity3d savestate

c# - script - ¿Cuál es la mejor manera de guardar el estado del juego?



unity playerprefs (1)

Pero escuché que de esta manera tiene algunos problemas y no es adecuado para guardar.

Está bien. En algunos dispositivos, hay problemas con BinaryFormatter . Empeora cuando actualiza o cambia la clase. Su configuración anterior podría perderse ya que las clases ya no coinciden. A veces, obtienes una excepción al leer los datos guardados debido a esto.

Además, en iOS, debe agregar Environment.SetEnvironmentVariable("MONO_REFLECTION_SERIALIZER", "yes"); o tendrá problemas con BinaryFormatter .

La mejor manera de ahorrar es con PlayerPrefs y Json . Puedes aprender cómo hacerlo here .

En mi caso, el formato de guardado debe ser una matriz de bytes

En este caso, puede convertirlo a json y luego convertir la string json a una matriz de byte . Luego puede usar File.WriteAllBytes y File.ReadAllBytes para guardar y leer la matriz de bytes.

Aquí hay una clase genérica que se puede usar para guardar datos. Casi igual que here pero no usa PlayerPrefs . Utiliza el archivo para guardar los datos json.

Clase DataSaver :

public class DataSaver { //Save Data public static void saveData<T>(T dataToSave, string dataFileName) { string tempPath = Path.Combine(Application.persistentDataPath, "data"); tempPath = Path.Combine(tempPath, dataFileName + ".txt"); //Convert To Json then to bytes string jsonData = JsonUtility.ToJson(dataToSave, true); byte[] jsonByte = Encoding.ASCII.GetBytes(jsonData); //Create Directory if it does not exist if (!Directory.Exists(Path.GetDirectoryName(tempPath))) { Directory.CreateDirectory(Path.GetDirectoryName(tempPath)); } //Debug.Log(path); try { File.WriteAllBytes(tempPath, jsonByte); Debug.Log("Saved Data to: " + tempPath.Replace("/", "//")); } catch (Exception e) { Debug.LogWarning("Failed To PlayerInfo Data to: " + tempPath.Replace("/", "//")); Debug.LogWarning("Error: " + e.Message); } } //Load Data public static T loadData<T>(string dataFileName) { string tempPath = Path.Combine(Application.persistentDataPath, "data"); tempPath = Path.Combine(tempPath, dataFileName + ".txt"); //Exit if Directory or File does not exist if (!Directory.Exists(Path.GetDirectoryName(tempPath))) { Debug.LogWarning("Directory does not exist"); return default(T); } if (!File.Exists(tempPath)) { Debug.Log("File does not exist"); return default(T); } //Load saved Json byte[] jsonByte = null; try { jsonByte = File.ReadAllBytes(tempPath); Debug.Log("Loaded Data from: " + tempPath.Replace("/", "//")); } catch (Exception e) { Debug.LogWarning("Failed To Load Data from: " + tempPath.Replace("/", "//")); Debug.LogWarning("Error: " + e.Message); } //Convert to json string string jsonData = Encoding.ASCII.GetString(jsonByte); //Convert to Object object resultValue = JsonUtility.FromJson<T>(jsonData); return (T)Convert.ChangeType(resultValue, typeof(T)); } public static bool deleteData(string dataFileName) { bool success = false; //Load Data string tempPath = Path.Combine(Application.persistentDataPath, "data"); tempPath = Path.Combine(tempPath, dataFileName + ".txt"); //Exit if Directory or File does not exist if (!Directory.Exists(Path.GetDirectoryName(tempPath))) { Debug.LogWarning("Directory does not exist"); return false; } if (!File.Exists(tempPath)) { Debug.Log("File does not exist"); return false; } try { File.Delete(tempPath); Debug.Log("Data deleted from: " + tempPath.Replace("/", "//")); success = true; } catch (Exception e) { Debug.LogWarning("Failed To Delete Data: " + e.Message); } return success; } }

USO

Clase de ejemplo para guardar :

[Serializable] public class PlayerInfo { public List<int> ID = new List<int>(); public List<int> Amounts = new List<int>(); public int life = 0; public float highScore = 0; }

Guardar datos:

PlayerInfo saveData = new PlayerInfo(); saveData.life = 99; saveData.highScore = 40; //Save data from PlayerInfo to a file named players DataSaver.saveData(saveData, "players");

Cargar datos:

PlayerInfo loadedData = DataSaver.loadData<PlayerInfo>("players"); if (loadedData == null) { return; } //Display loaded Data Debug.Log("Life: " + loadedData.life); 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]); }

Borrar datos:

DataSaver.deleteData("players");

Encuentro la mejor manera de guardar los datos del juego en el motor de juego Unity3D.
Al principio, serializo objetos usando BinaryFormatter .

Pero escuché que de esta manera tiene algunos problemas y no es adecuado para guardar.
Entonces, ¿cuál es la mejor forma recomendada para guardar el estado del juego?

En mi caso, el formato de guardado debe ser una matriz de bytes.