Найти в Дзене
Hyaena Games

Unity - удаленное обновление данных #2 (Json, JsonUtility)

Целевая аудитория: начинающие разработчики Теги: Unity, ScriptableObject, Json, JsonUtility Предыдущая статья: Unity - удаленное обновление данных (ScriptableObject) Вступление В продолжение предыдущей статьи, об удаленном обновлении данных, давайте разберемся что такое JSON, и как его использовать, ведь именно в этом формате, мы будем получать данные с сервера Firebase. JSON JSON (JavaScript Object Notation) - простой формат обмена данными, удобный для чтения и написания как человеком, так и компьютером. Он основан на подмножестве языка программирования JavaScript, определенного в стандарте ECMA-262 3rd Edition - December 1999. JSON - текстовый формат, полностью независимый от языка реализации, но он использует соглашения, знакомые программистам C-подобных языков, таких как C, C++, Java, JavaScript, Perl, Python и многих других. Эти свойства делают JSON идеальным языком обмена данными. JSON основан на двух структурах данных: Коллекция пар ключ/значение. В разных языках, эта концепция
Оглавление

Целевая аудитория: начинающие разработчики

Теги: Unity, ScriptableObject, Json, JsonUtility

Предыдущая статья: Unity - удаленное обновление данных (ScriptableObject)

Вступление

В продолжение предыдущей статьи, об удаленном обновлении данных, давайте разберемся что такое JSON, и как его использовать, ведь именно в этом формате, мы будем получать данные с сервера Firebase.

JSON

JSON (JavaScript Object Notation) - простой формат обмена данными, удобный для чтения и написания как человеком, так и компьютером. Он основан на подмножестве языка программирования JavaScript, определенного в стандарте ECMA-262 3rd Edition - December 1999. JSON - текстовый формат, полностью независимый от языка реализации, но он использует соглашения, знакомые программистам C-подобных языков, таких как C, C++, Java, JavaScript, Perl, Python и многих других. Эти свойства делают JSON идеальным языком обмена данными.
JSON основан на двух структурах данных:
Коллекция пар ключ/значение. В разных языках, эта концепция реализована как объект, запись, структура, словарь, хэш, именованный список или ассоциативный массив.
Упорядоченный список значений. В большинстве языков это реализовано как массив, вектор, список или последовательность.
Это универсальные структуры данных. Почти все современные языки программирования поддерживают их в какой-либо форме. Логично предположить, что формат данных, независимый от языка программирования, должен быть основан на этих структурах.
Источник

JsonUtility

Ссылка на официальную документацию.

Стандартный инструмент Unity для работы с JSON - сериализация и десериализация.

Имеет всего три метода, но нас интересует два:

FromJson - преобразовывает JSON в объект

ToJson - преобразовывает объект в JSON

Сериализация в JSON, пример

Давайте для примера, возьмем наш класс из прошлой статьи с данными об оружие, и сериализуем его в JSON, но для этого нам нужно внести следующие изменения. Класс который наследуется от ScriptableObject сериализовать через JsonUtility не получится, поэтому его данные нужно вынести в отдельный класс, а в ScriptableObject добавить переменную, которая будет их содержать. В итоге у нас получится следующие:

[System.Serializable]
public class WeaponData
{
public string Id;
public int Damage;
public float FireRate;
public float ReloadDuration;
public int AmmoCount;
}

[CreateAssetMenu(fileName = "WeaponData", menuName= "ScriptableObjects/WeaponData")]
[System.Serializable]
public class WeaponDataScriptableObject : ScriptableObject
{
public WeaponData WeaponData;
}

Так это будет выглядеть в инспекторе, после изменений. Почти никакой разницы нет
Так это будет выглядеть в инспекторе, после изменений. Почти никакой разницы нет

Также вы наверное могли заметить, что добавился атрибут [System.Serializable]. Он указывает на возможность сериализации класса.

И сам класс, который будет проводить сериализацию и выводить результат в консоль:

public class WeaponDataJsonConvertor : MonoBehaviour
{
public WeaponDataScriptableObject WeaponDataScriptableObject;

public void Start()
{
var json = JsonUtility.ToJson(WeaponDataScriptableObject.WeaponData);
Debug.LogError(json);
}
}
Настраиваем все перед запуском
Настраиваем все перед запуском

После запуска, получаем следующий результат в консоли:

{"Id":"AK47","Damage":100,"FireRate":0.1,"ReloadDuration":2.9,"AmmoCount":30}

При помощи сервиса https://jsonformatter.curiousconcept.com приведем JSON в более читаемый вид:

{
"Id":"AK-47",
"Damage":100,
"FireRate":0.1,
"ReloadDuration":2.9,
"AmmoCount":30
}

Отлично, мы конвертировали данные из ScriptableObject в JSON.

Десериализация из JSON, пример

Давайте теперь, сделаем обратную операцию - десериализуем наши данные из JSON в ScriptableObject. Для примера, возьмем JSON выше, и сохраним его в виде файла в проект. Файл можно назвать WeaponData.json. Напишем новый класс, который будет иметь ссылку на файл WeaponData.json и ScriptableObject в который мы хотим десериализовать данные:

public class WeaponDataFromJson : MonoBehaviour
{
public WeaponDataScriptableObject WeaponDataScriptableObject;
public TextAsset JsonFile;

public void Start()
{
WeaponDataScriptableObject.WeaponData = JsonUtility.FromJson<WeaponData>(JsonFile.text);
}
}

Снова все настроим
Снова все настроим
Для теста сбросим все данные в ScriptableObject
Для теста сбросим все данные в ScriptableObject
После запуска, все данные были установлены из JSON
После запуска, все данные были установлены из JSON

Итог

Мы научились конвертировать данные из ScriptableObject в JSON и обратно.

В следующей статье:

  • Добавим JSON на сервер Firebase
  • Напишем класс который будет получать JSON из Firebase и десериализовывать данные в нужные ScriptableObject

Спасибо за внимание, до встречи!

Следующая статья:
Unity - удаленное обновление данных (Firebase)