التحميل والقيم الافتراضية
جزء من قسم هندسة الألعاب في Unity في رحلة Unity على Coddy. الدرس 26 من 50.
يجب أن يتعامل التحميل مع ملفات الحفظ غير الموجودة أو غير المكتملة. تحفظ لعبة سباق بيانات RaceSave؛ وقد أضاف الإصدار 2 من اللعبة musicVolume:
[System.Serializable]
public class RaceSave
{
public int trophies;
public string car = "Rookie Kart";
public float musicVolume = 0.8f;
}RaceSave save;
if (File.Exists(path))
{
save = JsonUtility.FromJson<RaceSave>(File.ReadAllText(path));
}
else
{
save = new RaceSave();
}لا يملك اللاعب الجديد ملفًا، واستدعاء File.ReadAllText على ملف غير موجود يؤدي إلى رمي FileNotFoundException، لذا تحقّق أولًا من File.Exists وابدأ باستخدام new RaceSave(): 0 كأس، وRookie Kart، ومستوى صوت 0.8، وهي القيم الابتدائية للحقول. يحتوي ملف الإصدار 1 لدى لاعب قديم على {"trophies":3,"car":"Red Racer"}. ينشئ FromJson كائن RaceSave جديدًا، ما يؤدي إلى تشغيل القيم الابتدائية للحقول، ثم يعيّن المفاتيح الموجودة في JSON فقط، لذا تكون قيمة musicVolume هي 0.8. يتم تجاهل أي مفتاح ليس له حقل في الصنف. لذلك، يمكن لإصدار جديد من اللعبة قراءة ملفات الحفظ القديمة، ما دام لكل حقل جديد قيمة ابتدائية معقولة.
تملأ JsonUtility.FromJsonOverwrite(json, obj) كائنًا موجودًا بالفعل بدلًا من إنشاء كائن، وتترك كل حقل غير موجود في JSON كما هو. لا يستطيع FromJson إنشاء MonoBehaviour أو ScriptableObject (تُصدر Unity الخطأ Cannot deserialize JSON to new instances of type 'RaceSettings.')، لذا يُحمَّل أصل الإعدادات عن طريق استبدال محتواه: JsonUtility.FromJsonOverwrite(json, settings);. كما يحافظ الاستبدال على القيم الموجودة أصلًا في الكائن، مثل القيم التي عيّنها له Inspector، بينما يعيد FromJson القيم الابتدائية للصنف.
التحدي
متوسطيحمّل الحيوان الأليف الافتراضي pet.json عند بدء اللعبة، ويؤدي الضغط على Space إلى إطعام الحيوان الأليف وحفظه. يحدث التحميل بشكل خاطئ بطريقتين:
- لا يملك اللاعب الجديد ملف
pet.json، ويتوقف Start مع استثناء FileNotFoundException. عند عدم وجود ملف، أبقِ الحيوان الأليف على الإعدادات التي عيّنها Inspector (Biscuit، الجوع 30، السعادة 80، وBall) وسجّلA new pet: Biscuit. - كان الإصدار 1 من اللعبة يحفظ
petNameوhungerفقط؛ وأُضيفhappinessوtoysفي الإصدار 2 (راجع PetSave.cs). عند تحميل حفظ قديم باستخدام FromJson، يحصل على القيمة 50 في الصنف ولا يحصل على ألعاب، بدلًا من قيم Inspector. حمّل ملفًا موجودًا إلىpetباستخدامJsonUtility.FromJsonOverwrite، بحيث تحتفظ أي قيمة لا يتضمنها الملف بقيمة Inspector، وسجّل رسالة الترحيب بالاسم المحمّل، مثلWelcome back, Mochi.
اضغط على تشغيل وأطعم الحيوان الأليف، ثم اضغط على إيقاف وتشغيل مرة أخرى، ثم اضغط على تحقّق.
جرّب بنفسك
using System.IO;
using UnityEngine;
using UnityEngine.InputSystem;
using TMPro;
public class PetCare : MonoBehaviour
{
public PetSave pet;
public TMP_Text petText;
private string path;
void Start()
{
path = Path.Combine(Application.persistentDataPath, "pet.json");
pet = JsonUtility.FromJson<PetSave>(File.ReadAllText(path));
Show();
}
void Update()
{
if (Keyboard.current.spaceKey.wasPressedThisFrame)
{
pet.hunger = Mathf.Max(pet.hunger - 10, 0);
pet.happiness = Mathf.Min(pet.happiness + 5, 100);
File.WriteAllText(path, JsonUtility.ToJson(pet));
Show();
}
}
void Show()
{
petText.text = pet.petName + ": hunger " + pet.hunger + ", happiness " + pet.happiness;
}
}
يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس هندسة الألعاب في Unity
1المكوّنات لا التسلسلات الهرمية
مكوّنات صغيرةسكربت أساسي للعدومكوّنات مجرّدةتعمل المكوّنات معًامراجعة: برج دفاعي معياري4البيانات المتسلسلة
الأصناف القابلة للتسلسلالقوائم في Inspectorالتعدادات في Inspectorمراجعة: جدول الغنائم10مشروع: الناجي في الساحة
البطلأنواع الأعداء