Hola a todos!
Probablemente, todos los que comenzaron a hacer juegos en Unity se enfrentaron al dilema de cómo guardar el progreso del juego. Hoy te contaré sobre mi método. No es nuevo, sino un hombre trabajador.
Si está interesado, bienvenido a cat.
Cuando pensé en cómo guardar datos, llegué a la conclusión de que sería conveniente para mí serializar datos en JSON. Para no cercar otra bicicleta, decidí usar la popular biblioteca Json.NET: Newtonsoft. Además, puede guardar objetos y sus tipos.
Por el momento, la clase de acceso a datos es estática, lo que significa que puede acceder a ella desde cualquier lugar. Contras: no puede guardar por separado.
Analicemos un poco el código:
public abstract class ISaveItem { public string Key { get; set; } }
Como es imposible escribir:
Dictionary<string, SaveItem<T>>
Envolveremos SaveItem en ISaveItem. De esta manera podemos crear un diccionario con diferentes tipos de datos.
public class SaveItem<T> : ISaveItem { public T item; } private static Dictionary<string, ISaveItem> items;
Si intenta serializar Vector2 o Vector3 o Color u otros tipos de datos del motor de Unity, lo más probable es que obtenga un error de bucle. Para evitar este problema en Json.NET - Newtonsoft hay una solución para esto: la creación de convertidores. Analicemos uno de ellos.
Crea una clase y hereda de JsonConverter:
public class Vector2Converter : JsonConverter
Crea un constructor y un campo privado:
private readonly Type type; public Vector2Converter(Type type) { this.type = type; }
Después de redefinir los métodos:
public override bool CanConvert(Type objectType) { return type == objectType; } public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) { return null; } public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) { if (value.GetType() == type) { var vector = (Vector2)value; writer.WriteStartObject(); writer.WritePropertyName("X"); writer.WriteValue(vector.x); writer.WritePropertyName("Y"); writer.WriteValue(vector.y); writer.WriteEndObject(); } }
Lo más importante en el método
WriteJson . Aquí es donde se guardan los datos.
Y ahora cómo usar mi sistema de guardar:
Para guardar los datos escribimos:
int myInt = 33; SaveSystem.Set("MyInt", myInt);
Para leer los datos escribimos:
var myInt = SaveSystem.Get<int>("MyInt");
En teoría, las estructuras de datos complejas se pueden almacenar fácilmente y esto debería funcionar. Intentemos guardar y leer el objeto más complicado:
[System.Serializable] public class Test { public string Name; public float FloatParam; } Test test = new Test() {Name = "TestValue1", FloatParam = 0.1f};
Como puede ver, todo funciona muy bien.
También puede editar guardar, importar, exportar o eliminar.

El editor puede mostrar como tipos ordinarios (int, float, string, etc.). Entonces son más complejos.


Incluso matrices:

Gracias por su atencion Enlace al proyecto en
GitHub .