JsonUtility
Часть раздела Архитектура игр в Unity путешествия по Unity на Coddy. Урок 30 из 64.
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-кода.
- В
CharacterBuildсделай силу полем:public int strength;, аagilityпометь атрибутом[SerializeField]. - Ниже напиши класс
Teamс атрибутом[System.Serializable]и полемpublic List<CharacterBuild> heroes;. ВTeamCodeсоздай списокpublic Team team;и выведи его JSON в журнал. LoadCodeзагружаетcodeвteamи выводит в журналLoaded 3 heroes.
Нажми «Играть» и нажми пробел: команда отобразится в виде JSON. Затем нажми «Проверить».
Попробуйте сами
using System.Collections.Generic;
using UnityEngine;
[System.Serializable]
public class CharacterBuild
{
public string hero;
public int Strength { get; set; }
private int agility;
}
Все уроки раздела Архитектура игр в Unity
1Компоненты, а не иерархии
Небольшие компонентыБазовый скрипт врагаАбстрактные компонентыКомпоненты работают вместеПовторение: модульная турельПовторение: спаренная пушка4Сериализованные данные
Сериализуемые классыСписки в инспектореПеречисления в инспектореПовторение: таблица добычиПовторение: определяем добычу2Интерфейсы в Unity
IDamageableИнтерфейсы и TryGetComponentGetComponentsПовторение: клавиша взаимодействияПовторение: ближайший в пределах досягаемости5ScriptableObjects
Ресурсы данныхХарактеристики оружияОбщие настройкиСохраняем ветерВолны как данныеПовторение: база предметовПовторение: покупка в магазинеПотренируйтесь самостоятельно: Песочница Unity