Menu
CoddyTech

JsonUtility

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

JSON הוא טקסט שמכיל את הערכים של אובייקט, ולכן אפשר לתעד אותו ביומן, לשלוח אותו או לכתוב אותו לקובץ. JsonUtility.ToJson(obj) ממירה אובייקט ל־JSON, ו־JsonUtility.FromJson<T>(json) יוצרת ממנו T חדש. JsonUtility פועלת לפי אותם כללים כמו ה־Inspector, ולכן היא עובדת עם מחלקה מסוג [System.Serializable]:

[System.Serializable]
public class PlayerProfile
{
    public string playerName = "Ana";
    public int level = 7;
    public List<string> badges = new List<string> { "Explorer", "Sharpshooter" };
    [SerializeField] private float hoursPlayed = 12.5f;
    private int secretCode = 1234;
    public int Rank { get; set; } = 3;
}
string json = JsonUtility.ToJson(new PlayerProfile());
// {"playerName":"Ana","level":7,"badges":["Explorer","Sharpshooter"],"hoursPlayed":12.5}
PlayerProfile copy = JsonUtility.FromJson<PlayerProfile>(json);

secretCode ו־Rank חסרים. JsonUtility כותבת שדות ציבוריים ושדות פרטיים שמסומנים ב־[SerializeField], ורק אותם: לא מאפיינים, לא שדות סטטיים ולא שדות פרטיים רגילים. גם שדה מסוג Dictionary מדולג, וכך גם שדה שהמחלקה שלו אינה מסוג [System.Serializable]. אלה גם השדות שה־Inspector משמיט. JsonUtility.ToJson(obj, true) כותבת את אותו JSON בפריסה על פני כמה שורות, כך שקל יותר לקרוא אותו.

רשימה בתוך מחלקה נכתבת, כפי שקורה עם badges. רשימה בפני עצמה לא נכתבת: JsonUtility זקוקה לאובייקט ברמה העליונה, ולכן JsonUtility.ToJson(scores) עבור List<int> שמכילה את 10, 20 ו־30 מחזירה {}. יש לשים את הרשימה במחלקה ולהמיר אותה; ScoreBoard שמכילה את אותה הרשימה נכתבת כך: {"scores":[10,20,30]}:

[System.Serializable]
public class ScoreBoard
{
    public List<int> scores;
}
challenge icon

אתגר

בינוני

בונה הקבוצות מאפשר לשחקנים לשתף קבוצה בתור קוד. לחיצה על Space אמורה להציג את הקבוצה בפורמט JSON, ו־LoadCode(string code) אמורה לקרוא קוד. כרגע לחיצה על Space מציגה Team code: {}, וערכי הכוח והזריזות של הגיבורים אפילו לא מופיעים ב־Inspector.

  • ב־CharacterBuild, הפוך את הכוח והזריזות לערכים שמורים: החלף את המאפיין Strength בשדה ציבורי strength, והשאר את agility פרטי אך סמן אותו ב־[SerializeField].
  • רשימה בפני עצמה נכתבת בתור {}. מתחת ל־CharacterBuild, כתוב מחלקה Team עם [System.Serializable] ושדה ציבורי אחד בשם heroes, מסוג List<CharacterBuild>. בתוך TeamCode, החלף את רשימת heroes בשדה ציבורי team מסוג Team, והצג את Team code: ואחריו את ה־JSON של team.
  • ב־LoadCode, קרא את הקוד לתוך team באמצעות JsonUtility, והצג כמה גיבורים יש בו, בפורמט Loaded 3 heroes.

ה־Inspector ממלא את team באביר (כוח 8, זריזות 3) ובקשת (כוח 4, זריזות 9). לחץ על Play ואז על Space, קרא את הקוד בחלון Console, ולאחר מכן לחץ על Check.

נסו בעצמכם

using UnityEngine;

[System.Serializable]
public class CharacterBuild
{
    public string hero;
    public int Strength { get; set; }
    private int agility;
}
quiz iconבחנו את עצמכם

השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.

כל השיעורים ביחידה ארכיטקטורת משחקים ב-Unity