Взглянем на LiteDB - noSql альтернативу для текущих стандартов хранения данных в игростроении.
Последние 10 лет noSql решения потихоньку просачиваются в базовый набор инструментов для разработки. Это и понятно, далеко не всегда мы нуждаемся в возможностях, предоставляемых реляционными базами данных, а прирост производительности при отказе от них никогда не бывает лишним. В статье о выборе метода хранения данных для Unity мы пришли к выводу, что промышленным стандартом де-факто является применение SQLite, который можно приспособить не только под реляционный вариант использования, но и в виде noSql решения. Альтернативы в виде чистых noSql решений не обладают такой популярностью и являются ярчайшими примерами проектов с открытым исходным кодом. Однако, как было отмечено ранее, если ваша душа жаждет приключений, а проект не претендует на захват мира, то почему бы не попробовать.
LiteDB
LiteDB - это встраиваемая noSql база данных написанная на .NET, что позволяет легко использовать её в проектах на последних версиях Unity. Это небольшой проект с маленьким автобусным фактором, однако он обладает всем необходимым для применения в качестве полноценной встроенной базы данных. Судя по всему, базы данных не являются большой проблемой в создании игр, поэтому можно выделить не так много проектов и LiteDB является самым заметным вариантом среди альтернатив SQLite, точнее, она хоть как-то заметна и по её применению можно найти хоть какую-то информацию. Например, одной из таких статей является запись в блоге Марка Ходберга(Mark Hedberg), в которой он делится личным опытом её применения. Вторая статья с нашего любимого хабра, в которой проводится сравнение производительности между LiteDb, SQLite и файлами.
За описанием внутреннего устройства базы данных можно проследовать в соответствующий раздел документации Data Structure.
Установка
Сходить на страницу пакета на nuget.org, скачать нужную вам версию по ссылке Download package, переименовать расширение скачанного файла в .zip, распаковать и скопировать подходящую для вашего Scripting Backend версию Dll в проект.
Так же необходимо создать файл link.xml с таким содержанием(спасибо TigerHix за gist)
Так как код реального проекта не очень приспособлен для открытого демонстрирования, была создана минимальная реализация, имитирующая реальное применение.
usingSystem.IO;usingSystem.Linq;usingLiteDB;usingUnityEngine;usingUnityEngine.UI;// POCO Объект для хранения данных
publicclassGameData{// Id необходимый для хранения объекта в базе данных
publicintId{get;set;}// Счётчик нажатий кнопки
publicintCounter{get;set;}}// Класс для работы с базой данных
publicclassDatabaseManager:MonoBehaviour{// Ссылка на текст счётчика
publicTexttext=null;// Параметры доступа к базе данных
privatestring_connectionString;privatestring_databaseName;// Start is called before the first frame update
voidStart(){// Настройка параметров доступа
_connectionString="Filename="+Path.Combine(Application.persistentDataPath,"database");_databaseName="gameData";// Отображение первоначальных данных
text.text=GetGameData().Counter.ToString();}// Клик кнопки увеличения счётчика
publicvoidIncreaseClick(){// Получение объекта из базы
GameDatagameData=GetGameData();// Увеличение счётчика
gameData.Counter+=1;// Сохранение объекта в базу
StoreGameData(gameData);// Обновление текста через получение объекта(исключительно в тестовых целях)
text.text=GetGameData().Counter.ToString();}// Клик кнопки очистки базы данных
publicvoidClearClick(){// Очистка базы данных
ClearData();// Обновление текста
text.text=GetGameData().Counter.ToString();}// Сохранение объекта в базу данных
privatevoidStoreGameData(GameDatagameData){// Соединение с базой данных
using(vardb=newLiteDatabase(_connectionString)){// Получение коллекции (или создание, если она не существует)
varcol=db.GetCollection<GameData>(_databaseName);// Добавление или обновление объекта
col.Upsert(gameData);}}// Получение объекта из базы данных
privateGameDataGetGameData(){// Соединение с базой данных
using(vardb=newLiteDatabase(_connectionString)){// Получение коллекции (или создание, если она не существует)
varcol=db.GetCollection<GameData>(_databaseName);// Создание нового объекта в случае его отсутствия в базе данных
if(col.Count()==0){GameDatagameData=newGameData();gameData.Counter=0;returngameData;}// Получение объекта из базы данных
varresult=col.FindAll();returnresult.First();}}// Очистка базы данных
privatevoidClearData(){// Соединение с базой данных
using(vardb=newLiteDatabase(_connectionString)){// Получение коллекции (или создание, если она не существует)
varcol=db.GetCollection<GameData>(_databaseName);// Очистка коллекции
col.DeleteAll();}}}
Результат
Оно просто работает =)
Минусы
Основной отрицательной стороной использования этой базы данных является отсутствие инструмента для просмотра её содержимого на платформах отличных от Windows, но этот вопрос решаем собственными силами.
Заключение
Стандартным методом хранения информации для проектов на Unity является SQLite, это просто база, от которой понятно что ожидать. Менять её на что то новомодное без серьёзных на то оснований нет смысла. Однако если вы начинаете новый проект, то вполне можно рассмотреть в качестве альтернативы LiteDB. Опыт использования этой базы в личном проекте не выявил какого-то негатива, так что можно попробовать применить её для более серьёзных проектов, о чём можно будет рассказать в следующий раз. Пока! =)