نظام تخزين / تحميل البيانات

مرحبا بالجميع!

ربما واجه كل من بدأ صنع الألعاب على Unity معضلة كيفية حفظ تقدم اللعبة. اليوم سوف أخبرك عن طريقتي. إنه ليس جديدًا ، لكنه رجل عامل.

إذا كانت مهتمة ، مرحبا بكم في القط.

عندما فكرت في كيفية حفظ البيانات ، توصلت إلى استنتاج أنه سيكون من المناسب بالنسبة لي إجراء تسلسل للبيانات في JSON. لكي لا أقوم بسياج دراجة أخرى ، قررت استخدام مكتبة Json.NET الشهيرة - Newtonsoft. علاوة على ذلك ، يمكن أن ينقذ الكائنات وأنواعها.

في الوقت الحالي ، فئة الوصول إلى البيانات ثابتة ، مما يعني أنه يمكنك الوصول إليها من أي مكان. سلبيات - لا يمكنك جعل حفظ منفصلة.

لنحلل الكود قليلاً:

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

لأنه من المستحيل أن تكتب:

 Dictionary<string, SaveItem<T>> 

نحن سوف التفاف SaveItem في ISaveItem. وبهذه الطريقة يمكننا إنشاء قاموس مع أنواع مختلفة من البيانات.

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

إذا حاولت إجراء تسلسل لـ Vector2 أو Vector3 أو Color أو أنواع بيانات أخرى من محرك Unity ، فستتلقى على الأرجح خطأ في الحلقة. لتجنب هذه المشكلة في Json.NET - Newtonsoft ، يوجد حل لذلك: إنشاء محولات. دعنا نحلل واحد منهم.

قم بإنشاء فصل وترث من JsonConverter:

 public class Vector2Converter : JsonConverter 

إنشاء مُنشئ وحقل خاص:

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

بعد إعادة تعريف الأساليب:

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

الشيء الأكثر أهمية في أسلوب WriteJson . هذا هو المكان الذي يتم حفظ البيانات فيه.

والآن كيفية استخدام نظام الحفظ الخاص بي:

لحفظ البيانات التي نكتبها:

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

لقراءة البيانات التي نكتبها:

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

من الناحية النظرية ، يمكن بسهولة تخزين هياكل البيانات المعقدة وهذا يجب أن يعمل. دعونا نحاول حفظ وقراءة الكائن أكثر تعقيدًا:

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

كما ترون ، كل شيء يعمل بشكل رائع.

يمكنك أيضًا تعديل الحفظ أو الاستيراد أو التصدير أو الحذف.



يمكن للمحرر أن يظهر على هيئة أنواع عادية (int ، float ، string ، إلخ). لذلك هي أكثر تعقيدا.





حتى المصفوفات:



شكرا لاهتمامكم رابط للمشروع على جيثب .

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


All Articles