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