Система сохранения/загрузки данных

Моя цель - предложение широкого ассортимента товаров и услуг на постоянно высоком качестве обслуживания по самым выгодным ценам.
Всем привет!

Наверное каждый, кто начал делать игры на Unity столкнулся с дилеммой как сохранить игровой прогресс. Сегодня я вам расскажу про мой способ. Он не новый, но вполне себе рабочий.

Если интересно, добро пожаловать под кат.

Когда я задумался над тем как мне сохранять данные, то пришел к выводу что мне будет удобно сериализировать данные в JSON. Чтобы не городить очередной велосипед я принял решение использовать популярную библиотеку Json.NET — Newtonsoft. Тем более она может сохранять объекты и их типы.

На данный момент класс доступа к данным статический, это значит что доступ к нему можно получить из любого места. Минусы — нельзя сделать раздельные сохранения.

Немного разберем код:

public abstract class ISaveItem
{
    public string Key { get; set; }
}

Так как нельзя написать:

Dictionary<string, SaveItem<T>>

Мы обернем SaveItem в ISaveItem. Тем самым мы сможем создать словарь с разными типами данных.

public class SaveItem<T> : ISaveItem
{
     public T item;
}

private static Dictionary<string, ISaveItem> items;

Если вы попробуете сериализовать Vector2 или Vector3 или Color или другие типы данных движка Unity, то скорее всего получите ошибку зацикливания. Чтобы избежать данную проблему в Json.NET — Newtonsoft есть для этого решение: создание конвертеров. Давайте разберем один из них.

Создаем класс и наследуемся от JsonConverter:

public class Vector2Converter : JsonConverter

Создаем конструктор и приватное поле:

private readonly Type type;
public Vector2Converter(Type type)
{
     this.type = type;
}

После переопределям методы:

public override bool CanConvert(Type objectType)
{
    return type == objectType;
}

public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
    return null;
}

public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
    if (value.GetType() == type)
    {
        var vector = (Vector2)value;
        writer.WriteStartObject();
        writer.WritePropertyName("X");
        writer.WriteValue(vector.x);
        writer.WritePropertyName("Y");
        writer.WriteValue(vector.y);
        writer.WriteEndObject();
    }
}

Самое главное в методе WriteJson. Тут происходит сохранение данных.

А теперь как пользоваться моей системой сохранений:

Чтобы сохранить данные пишем:

int myInt = 33;
SaveSystem.Set("MyInt", myInt);

Чтобы прочитать данные пишем:

var myInt = SaveSystem.Get<int>("MyInt");

В теории можно запросто сохраняться сложные структуры данных и это должно работать. Давайте попробуем сохранить и прочитать объект посложнее:

[System.Serializable]
public class Test
{
   public string Name;
   public float FloatParam;
}
    
Test test = new Test() {Name = "TestValue1", FloatParam = 0.1f};
    
//Сохраняем
SaveSystem.Set("MyTestClass", test);

//Читаем
var saveTest = SaveSystem.Get<Test>("MyTestClass");
Debug.Log(saveTest.Name);
Debug.Log(saveTest.FloatParam);

Как видим, все прекрасно работает.

Так же можно отредактировать сохранения, импортировать, экспортировать или удалить.



Редактор может показывать как обычные типы (int, float, string и т.д.). Так и более сложные.





Даже массивы:



Спасибо за внимание. Ссылка на проект в GitHub.
Источник: https://habr.com/ru/post/471258/


Интересные статьи

Интересные статьи

Сегодня решили обсудить тему информационной безопасности. Публикуем перевод статьи Kunal pandey, обнаруживаем уязвимости и работаем на опережение! Введение Кража персональных данных (PI...
Сегодня существует 100500 курсов по Data Science и давно известно, что больше всего денег в Data Science можно заработать именно курсами по Data Science (зачем копать, когда можно п...
Решение задачи распознавания изображений (OCR) сопряжено с различными сложностями. То картинку не получается распознать из-за нестандартной цветовой схемы или из-за искажений. То заказчик хочет р...
Символьные примитивы — это одно из новшеств стандарта ES6, которое принесло в JavaScript некоторые ценные возможности. Символы, представленные типом данных Symbol, особенно полезны при использова...
Реализация ORM в ядре D7 — очередная интересная, перспективная, но как обычно плохо документированная разработка от 1с-Битрикс :) Призвана она абстрагировать разработчика от механики работы с табл...