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: {}، كما أن قيمتي strength وagility للأبطال لا تظهران حتى في Inspector.
- في
CharacterBuild، اجعل strength وagility قيمتين محفوظتين: استبدل الخاصيةStrengthبحقل عامstrength، وأبقِagilityخاصًا مع وضع العلامة[SerializeField]عليه. - تُكتب القائمة وحدها بالشكل
{}. أسفل CharacterBuild، اكتب فئة[System.Serializable]باسمTeamتتضمن حقلًا عامًا واحدًا هوheroesمن النوعList<CharacterBuild>. فيTeamCode، استبدل قائمةheroesبحقل عامteamمن النوع Team، واعرضTeam code:متبوعًا ببيانات JSON الخاصة بـteam. - في
LoadCode، اقرأ الرمز إلىteamباستخدام JsonUtility، واعرض عدد الأبطال الذين يحتوي عليهم، بالشكلLoaded 3 heroes.
يملأ Inspector الحقل team بفارس (strength 8، agility 3) ورامٍ (strength 4، agility 9). اضغط على Play ثم اضغط Space، واقرأ الرمز في Console، ثم اضغط Check.
جرّب بنفسك
using UnityEngine;
[System.Serializable]
public class CharacterBuild
{
public string hero;
public int Strength { get; set; }
private int agility;
}
يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس هندسة الألعاب في Unity
1المكوّنات لا التسلسلات الهرمية
مكوّنات صغيرةسكربت أساسي للعدومكوّنات مجرّدةتعمل المكوّنات معًامراجعة: برج دفاعي معياري4البيانات المتسلسلة
الأصناف القابلة للتسلسلالقوائم في Inspectorالتعدادات في Inspectorمراجعة: جدول الغنائم10مشروع: الناجي في الساحة
البطلأنواع الأعداء