Système de stockage / chargement de données

Bonjour à tous!

Tous ceux qui ont commencé à créer des jeux sur Unity étaient probablement confrontés au dilemme de savoir comment enregistrer la progression du jeu. Aujourd'hui, je vais vous parler de ma méthode. Il n'est pas nouveau, mais tout à fait un homme qui travaille.

Si vous êtes intéressé, bienvenue au chat.

Quand j'ai réfléchi à la façon de sauvegarder les données, je suis arrivé à la conclusion qu'il serait pratique pour moi de sérialiser les données en JSON. Afin de ne pas clôturer un autre vélo, j'ai décidé d'utiliser la populaire bibliothèque Json.NET - Newtonsoft. De plus, il peut enregistrer des objets et leurs types.

Pour le moment, la classe d'accès aux données est statique, ce qui signifie que vous pouvez y accéder de n'importe où. Inconvénients - vous ne pouvez pas faire de sauvegarde séparée.

Analysons un peu le code:

public abstract class ISaveItem { public string Key { get; set; } } 

Puisqu'il est impossible d'écrire:

 Dictionary<string, SaveItem<T>> 

Nous encapsulerons SaveItem dans ISaveItem. De cette façon, nous pouvons créer un dictionnaire avec différents types de données.

 public class SaveItem<T> : ISaveItem { public T item; } private static Dictionary<string, ISaveItem> items; 

Si vous essayez de sérialiser Vector2 ou Vector3 ou Color ou d'autres types de données du moteur Unity, vous obtiendrez très probablement une erreur de boucle. Pour éviter ce problème dans Json.NET - Newtonsoft, il existe une solution: la création de convertisseurs. Analysons l'un d'eux.

Créez une classe et héritez de JsonConverter:

 public class Vector2Converter : JsonConverter 

Créez un constructeur et un champ privé:

 private readonly Type type; public Vector2Converter(Type type) { this.type = type; } 

Après avoir redéfini les méthodes:

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

La chose la plus importante dans la méthode WriteJson . C'est là que les données sont enregistrées.

Et maintenant, comment utiliser mon système de sauvegarde:

Pour sauvegarder les données que nous écrivons:

 int myInt = 33; SaveSystem.Set("MyInt", myInt); 

Pour lire les données que nous écrivons:

 var myInt = SaveSystem.Get<int>("MyInt"); 

En théorie, les structures de données complexes peuvent facilement être stockées et cela devrait fonctionner. Essayons d'enregistrer et de lire l'objet plus compliqué:

 [System.Serializable] public class Test { public string Name; public float FloatParam; } Test test = new Test() {Name = "TestValue1", FloatParam = 0.1f}; // SaveSystem.Set("MyTestClass", test); // var saveTest = SaveSystem.Get<Test>("MyTestClass"); Debug.Log(saveTest.Name); Debug.Log(saveTest.FloatParam); 

Comme vous pouvez le voir, tout fonctionne très bien.

Vous pouvez également modifier l'enregistrement, l'importation, l'exportation ou la suppression.



L'éditeur peut afficher des types ordinaires (int, float, string, etc.). Sont donc plus complexes.





Même les tableaux:



Merci de votre attention. Lien vers le projet sur GitHub .

Source: https://habr.com/ru/post/fr471258/


All Articles