טעינה וערכי ברירת מחדל
חלק מהיחידה ארכיטקטורת משחקים ב-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 תחזיר את ערכי האתחול של המחלקה.
אתגר
בינוניטענו את pet.json בבטחה עבור שחקנים חדשים ועבור שמירות ישנות.
- ב־
Start(), החליפו את שורת FromJson ב־if (File.Exists(path))וב־else. - אם יש קובץ, מלאו את חיית המחמד שב־Inspector:
JsonUtility.FromJsonOverwrite(File.ReadAllText(path), pet);, ואז הציגו ביומןWelcome back, Mochiמתוךpet.petName. - אם אין קובץ, הציגו ביומן
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
1רכיבים, לא היררכיות
רכיבים קטניםסקריפט בסיסי לאויברכיבים מופשטיםרכיבים שפועלים יחדחזרה: צריח מודולריחזרה: תותח כפול4נתונים שעברו סריאליזציה
מחלקות שניתנות לסריאליזציהרשימות ב־Inspectorטיפוסי Enum ב־Inspectorחזרה: טבלת שללהגרלת השלל2ממשקים ב-Unity
IDamageableממשקים ו-TryGetComponentGetComponentsסיכום: מקש אינטראקציהסיכום: הקרוב ביותר בטווח3אירועים
אירועי C# ב-Unityהרשמה ב-OnEnableשדות UnityEventאירועים מניעים את ממשק המשתמשחזרה: חלון קופץ להישגחזרה: טיימר החלון הקופץ6שמירה באמצעות JSON
JsonUtilityשמירת המשחקטעינה וערכי ברירת מחדלחזרה: משבצות שמירהבחירה ומחיקה של משבצתתרגלו בעצמכם: Unity אונליין