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;
}Задание
СреднеКонструктор команды позволяет игрокам делиться командой в виде кода. При нажатии пробела команда должна выводиться в виде 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;
}
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Архитектура игр в Unity
1Компоненты, а не иерархии
Небольшие компонентыБазовый скрипт врагаАбстрактные компонентыСовместная работа компонентовПовторение: модульная турель4Сериализованные данные
Сериализуемые классыСписки в InspectorПеречисления в InspectorПовторение: таблица лута2Интерфейсы в Unity
IDamageableИнтерфейсы и TryGetComponentGetComponentsПовторение: клавиша взаимодействия5ScriptableObjects
Ресурсы данныхХарактеристики оружияОбщие настройкиВолны как данныеПовторение: база предметов