- Ты знаешь SQL?
- Нет
- …
Создание статьи по настройке SQLite в Unity определённо является достойной целью для любого уважающего себя блогера, но тут почему-то получился обзор предлагаемых комьюнити и сторонними продуктами способов хранения информации. Предполагается, что изложенные в статье технологии можно использовать для размышления об архитектуре проекта, а инструкции по настройке любой схемы описанной далее можно без проблем найти в интернете.
Зачем хранить данные в игре должно быть очевидно, поэтому опишем этот момент кратко.
Игра представляет из себя изменение исходных данных с какой-либо целью.
Сообщество довольно часто постулирует - путь Unity по созданию исходных данных это подготовка наборов префабов(Prefab), скриптуемых объектов(ScriptableObject), сцен и инструментов для управления ими в редакторе, а конфиги в других видах не нужны.
Изменения в префабах, скриптуемых объектах и самих сценах нельзя сохранить, после перезагрузки сцены всё вернётся в изначальное состояние, соответственно любые состояния, которые нужно сохранить требуют какого-нибудь хранения данных. Пример: игра в которой блендер со стола можно положить в инвентарь требует сохранение отсутствия блендер на столе и присутствия его в инвентаре.
Ну а раз любая игра будет требовать сохранения чего-либо посмотрим на предоставляемые движком возможности для решения этого вопроса.
Единственным готовым к использованию способом хранения данных являются PlayerPrefs. Это довольно популярный вариант решения в ответах сообщества на вопрос про хранение чего-либо.
Плюсы:
Минусы:
В результате название говорит само за себя, это инструмент для хранения настроек и другой не особо большой и важной информации.
Остальные методы требуют сериализации, так что быстренько пробежимся по доступным вариантам:
Очевидный способ, просто реализовать, проблемы начинаются с большим количеством файлов, падает как управляемость, так и производительность.
Единственным кандидатом будет:
В Asset Store есть другие варианты, включающие в названии акроним SQL, но очень уж они похожи на обёртки над тем же SQLite. Для облегчения жизни есть ORM решения, например, sqlite-net. Так что если есть необходимость в реляционной базе данных, то смысла искать что-то ещё особо нет.
Благодатная тема последнего десятилетия и благодаря этому можно выделить больше одного решения:
На текущий момент выбор NoSql решений фактически стал стандартом и с трудом можно придумать оправдание не пользоваться ими. Понятно что самым популярным решением тут выглядит SQLite, а остальные не имеют и сотой доли её популярности.
В последнее время часто мелькает упоминание Realm.io и подобных решений, которые позволяют настроить синхронизацию локальной и внешней баз данных, снимая большу́ю часть работы с разработчиков. К сожалению, сам Realm.io хоть и заявляет о поддержке .Net Standard 2.0, но завестись под Unity последних версий не особо то и желает, так что остаётся ждать, когда их новый владелец в лице MongoDb обратит своё внимание на игровую индустрию.
Альтернативы, на которые стоит обратить внимание:
Конечно же, это решения enterprise уровня и задач, для тех кто делает очередной Hearthstone и понимает, зачем оно нужно.
С одной стороны, данная статья не должна была дать серебряную пулю, чтобы убить все проекты. С другой стороны, выбор вариантов, которые предлагаются комьюнити не так уж широк и всё по старинке решается на уровне binary/json + file/sqlite. А такое прохладное отношение комьюнити к хранению данных, видимо, объясняется наличием более других узких мест в проектах. Однако если ваша душа жаждет приключений, то можно попробовать LiteDb и FlatBuffers. Я определённо протестирую их, но это будет уже совсем другая статья. Пока! =)
Update: про LiteDB так же можно прочитать нашу новую статью LiteDB и Unity.