Целевая аудитория: начинающие разработчики
Теги: Unity, ScriptableObject, Json, JsonUtility, Firebase
Вступление
Удаленное обновление данных - частая задача, которую необходимо решать в разных проектах, т.к многие хотят иметь возможность обновлять конфигурацию без обновления самого приложения. Это может быть что угодно:
- конфигурация магазина
- специальные предложения
- доступные события
- конфигурация предметов, персонажей
- игровой баланс
- и т.п
Также это дает возможность, проводить A/B тестирование над игровыми данными, что позволит улучшить ваши параметры монетизации, ретеншена и других метрик. И еще раз, для этого ненужно обновлять само приложение!
В качестве back-end сервиса для хранения конфигов мы будем использовать Firebase. Хранить данные будем в формате JSON. Напишем клиентскую часть, которую можно будет использовать в абсолютно любых проектах. Цикл статей будет состоять из трех частей:
- ScriptableObject
- формат JSON, сериализация и десериализация при помощи JsonUtility
- клиентская часть для работы с Firebase
Но перед тем, как приступить к реализации удаленного обновления данных, давайте разберемся как вообще можно их хранить.
ScriptableObject
Ссылка на официальную документацию.
ScriptableObject - это контейнер данных, который находится в проекте в виде отдельного файла, который мы можем настраивать через Inspector. Для создания своего ScriptableObject нам необходимо создать класс, который наследуется от ScriptableObject и содержит поля тех данных, для которых он и будет являться контейнером, например:
using UnityEngine;
[CreateAssetMenu(fileName = "WeaponData", menuName= "ScriptableObjects/WeaponData")]
public class WeaponData : ScriptableObject
{
public string Id;
public int Damage;
public float FireRate;
public float ReloadDuration;
public int AmmoCount;
}
Атрибут CreateAssetMenu позволяет нам создавать ассет нашего ScriptableObject при помощи контекстного меню в окне Project:
Дальше мы можем использовать данные нашего ScriptableObject, в условном классе оружия:
public class Weapon : MonoBehaviour
{
[SerializeField] private WeaponData _weaponData;
..
}
Нам потребуется только добавить этот класс на префаб оружия, и перетащить в поле WeaponData наш ранее созданный ScriptableObject.
И здесь есть уже несколько очевидных плюсов:
- конфигурация оружия отделена от класса самого оружия
- данные для каждого оружия находятся в одном экземпляре
Давайте разберем последний пункт подробней и рассмотрим два примера:
Неправильный: Данные оружия находятся в классе Weapon без использования ScriptableObject:
public class Weapon : MonoBehaviour
{
public string Id;
public int Damage;
public float FireRate;
public float ReloadDuration;
public int AmmoCount;
..
}
В таком случае, если на сцене у нас находится 10.000 одинаковых оружий, мы также будем иметь 10.000 копий этих данных в памяти.
Правильный: Данные оружия хранятся в выше созданном ScriptableObject, и у всех оружий есть ссылка на него. В таком случае, если на сцене у нас находится 10.000 одинаковых оружий, в памяти мы будем иметь одну копию конфигурационных данных.
Итог
- узнали о ScriptableObject
- научились писать и создавать ScriptableObject
- узнали о плюсах и вариантах использования ScriptableObject
В следующей статье:
- разберемся с форматом json
- научимся сериализовывать ScriptableObject в json и обратно
- разберем несколько интересных примеров и варианты использования
Следующая статья: Unity - удаленное обновление данных (Json, JsonUtility)