مرحبا بالجميع!
ربما واجه كل من بدأ صنع الألعاب على 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};
كما ترون ، كل شيء يعمل بشكل رائع.
يمكنك أيضًا تعديل الحفظ أو الاستيراد أو التصدير أو الحذف.

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


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

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