Menu
CoddyTech
flag Ar iconالعربيةdown icon

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: {}، كما أن قيمتي 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;
}
quiz iconاختبر نفسك

يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.

جميع دروس هندسة الألعاب في Unity