Menu
CoddyTech

טעינה וערכי ברירת מחדל

חלק מהיחידה ארכיטקטורת משחקים ב-Unity במסלול ה-Unity של Coddy. שיעור 32 מתוך 64.

טעינה צריכה להתמודד עם שמירות שאינן קיימות או שאינן שלמות. משחק מרוצים שומר 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 בבטחה עבור שחקנים חדשים ועבור שמירות ישנות.

  1. ב־Start(), החליפו את שורת FromJson ב־if (File.Exists(path)) וב־else.
  2. אם יש קובץ, מלאו את חיית המחמד שב־Inspector: JsonUtility.FromJsonOverwrite(File.ReadAllText(path), pet);, ואז הציגו ביומן Welcome back, Mochi מתוך pet.petName.
  3. אם אין קובץ, הציגו ביומן A new pet: Biscuit באותו אופן.

לחצו על "שחק", האכילו את חיית המחמד, ואז לחצו על Stop ועל "שחק": תופיע הודעת ברוכים השבים. לאחר מכן לחצו על "בדיקה".

נסו בעצמכם

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

תרגלו בעצמכם: Unity אונליין