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

Задание

Средне

Конструктор команды позволяет игрокам делиться командой в виде кода. При нажатии пробела команда должна выводиться в виде JSON, а LoadCode(string code) должен считывать код. Сейчас при нажатии пробела выводится 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: добавь Knight (сила 8, ловкость 3) и Archer (сила 4, ловкость 9). Нажми Play, затем пробел, прочитай код в Console и нажми Check.

Попробуйте сами

using UnityEngine;

[System.Serializable]
public class CharacterBuild
{
    public string hero;
    public int Strength { get; set; }
    private int agility;
}
quiz iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

Все уроки раздела Архитектура игр в Unity