Sistem penyimpanan / pemuatan data

Halo semuanya!

Mungkin semua orang yang mulai membuat game di Unity dihadapkan pada dilema bagaimana cara menyimpan kemajuan game. Hari ini saya akan memberi tahu Anda tentang metode saya. Dia bukan orang baru, tetapi cukup pekerja.

Jika tertarik, selamat datang di kucing.

Ketika saya berpikir tentang cara menyimpan data, saya sampai pada kesimpulan bahwa akan lebih mudah bagi saya untuk membuat serialisasi data di JSON. Agar tidak membuat sepeda lain, saya memutuskan untuk menggunakan perpustakaan Json.NET yang populer - Newtonsoft. Apalagi bisa menyimpan objek dan tipenya.

Saat ini, kelas akses data bersifat statis, yang berarti Anda dapat mengaksesnya dari mana saja. Kontra - Anda tidak dapat membuat simpanan terpisah.

Mari kita sedikit menganalisis kode:

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

Karena tidak mungkin untuk menulis:

 Dictionary<string, SaveItem<T>> 

Kami akan membungkus SaveItem di ISaveItem. Dengan cara ini kita dapat membuat kamus dengan berbagai jenis data.

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

Jika Anda mencoba membuat serialisasi Vector2 atau Vector3 atau Warna atau tipe data lain dari mesin Unity, Anda kemungkinan besar akan mendapatkan kesalahan looping. Untuk menghindari masalah ini di Json.NET - Newtonsoft ada solusi untuk ini: pembuatan konverter. Mari kita analisis salah satunya.

Buat kelas dan mewarisi dari JsonConverter:

 public class Vector2Converter : JsonConverter 

Buat bidang konstruktor dan pribadi:

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

Setelah mendefinisikan kembali metode:

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

Hal terpenting dalam metode WriteJson . Di sinilah data disimpan.

Dan sekarang bagaimana cara menggunakan sistem simpan saya:

Untuk menyimpan data yang kami tulis:

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

Untuk membaca data yang kami tulis:

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

Secara teori, struktur data yang kompleks dapat dengan mudah disimpan dan ini harus bekerja. Mari kita coba untuk menyimpan dan membaca objek yang lebih rumit:

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

Seperti yang Anda lihat, semuanya bekerja dengan baik.

Anda juga dapat mengedit simpan, impor, ekspor, atau hapus.



Editor dapat ditampilkan sebagai tipe biasa (int, float, string, dll.). Jadi lebih kompleks.





Array genap:



Terima kasih atas perhatian anda Tautan ke proyek di GitHub .

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


All Articles