2 подписчика

Unity - удаленное обновление данных #1 (ScriptableObject)

Технологии
Больше по теме
Целевая аудитория: начинающие разработчики Теги: Unity, ScriptableObject, Json, JsonUtility, Firebase Вступление Удаленное обновление данных - частая задача, которую необходимо решать в разных...

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

Теги: 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 через контекстное меню
Создание ScriptableObject через контекстное меню
Созданный и настроенный ScriptableObject
Созданный и настроенный ScriptableObject

Дальше мы можем использовать данные нашего 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)