Datenspeicher- / Ladesystem

Hallo allerseits!

Wahrscheinlich war jeder, der anfing, Spiele auf Unity zu machen, mit dem Dilemma konfrontiert, wie man den Spielfortschritt rettet. Heute werde ich Ihnen von meiner Methode erzählen. Er ist nicht neu, aber ein ziemlich arbeitender Mann.

Bei Interesse herzlich willkommen bei cat.

Als ich darüber nachdachte, wie Daten gespeichert werden sollen, kam ich zu dem Schluss, dass es für mich praktisch wäre, Daten in JSON zu serialisieren. Um kein weiteres Fahrrad einzäunen, habe ich mich für die beliebte Json.NET-Bibliothek Newtonsoft entschieden. Darüber hinaus können Objekte und ihre Typen gespeichert werden.

Im Moment ist die Datenzugriffsklasse statisch, was bedeutet, dass Sie von überall darauf zugreifen können. Nachteile - Sie können nicht separat speichern.

Lassen Sie uns den Code ein wenig analysieren:

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

Da ist es unmöglich zu schreiben:

 Dictionary<string, SaveItem<T>> 

Wir werden SaveItem in ISaveItem verpacken. Auf diese Weise können wir ein Wörterbuch mit verschiedenen Datentypen erstellen.

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

Wenn Sie versuchen, Vector2 oder Vector3 oder Color oder andere Datentypen der Unity-Engine zu serialisieren, wird höchstwahrscheinlich ein Schleifenfehler angezeigt. Um dieses Problem in Json.NET - Newtonsoft zu vermeiden, gibt es dafür eine Lösung: die Erstellung von Konvertern. Lassen Sie uns einen von ihnen analysieren.

Erstellen Sie eine Klasse und erben Sie von JsonConverter:

 public class Vector2Converter : JsonConverter 

Erstellen Sie einen Konstruktor und ein privates Feld:

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

Nach der Neudefinition der Methoden:

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

Das Wichtigste bei der WriteJson- Methode. Hier werden Daten gespeichert.

Und jetzt, wie ich mein Speichersystem benutze:

Um die Daten zu speichern, schreiben wir:

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

Um die Daten zu lesen, die wir schreiben:

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

Theoretisch können komplexe Datenstrukturen leicht gespeichert werden, und dies sollte funktionieren. Versuchen wir, das Objekt komplizierter zu speichern und zu lesen:

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

Wie Sie sehen können, funktioniert alles super.

Sie können auch das Speichern, Importieren, Exportieren oder Löschen bearbeiten.



Der Editor kann als normale Typen (int, float, string usw.) anzeigen. Sind also komplexer.





Sogar Arrays:



Vielen Dank für Ihre Aufmerksamkeit. Link zum Projekt auf GitHub .

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


All Articles