Menu
CoddyTech
flag Ar iconالعربيةdown icon

التحميل والقيم الافتراضية

جزء من قسم هندسة الألعاب في 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 القيم الابتدائية للصنف.

challenge icon

التحدي

متوسط

يحمّل الحيوان الأليف الافتراضي 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;
    }
}
quiz iconاختبر نفسك

يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.

جميع دروس هندسة الألعاب في Unity