Привет, Хабр!

Четыре месяца я разрабатываю пошаговый футбольный менеджер Kickoff Island. Игра строится вокруг уникальных игроков, команд и тактик. Кстати, уникальность игроков больше всего добавляет мне и трудностей, так как прорисовка их всех, а еще и покадровая анимация в Aseprite, тот еще геморрой. В какой‑то момент передо мной встал, казалось бы, простой, но важный вопрос: как хранить всех этих футболистов, их характеристики, таланты и состояния?

Казалось бы, выбор огромен: MySQL, SQLite,.tres‑файлы, JSON... Я перебрал несколько вариантов, и сейчас расскажу, почему остановился на JSON — и почему это оказалось не компромиссом, а лучшим решением для инди‑разработки.

Сгенерировано ИИ
Сгенерировано ИИ

Почему не MySQL и не SQLite

Реляционные базы данных я отбросил почти сразу. Да, они хороши для сложных запросов и связей между таблицами, но в моей игре:

  • Всего несколько десятков игроков и столько же команд.

  • Нет сложных JOIN‑запросов (мне не нужно агрегировать данные по десяти таблицам).

  • База не растет, и не будет расти, до миллионов записей.

Все вышеперечисленное, кстати, не является издержками игры, а сознательный выбор в пользу её сюжетности и механик, отличающихся от классического футбольного менеджера. В принципе, игра вполне могла бы стать RPG, но один я бы это точно не потянул.

Итак, держать полноценный SQL‑сервер или даже SQLite‑файл для 30–50 игроков — это как стрелять из пушки по воробьям: усложняет код, добавляет лишние зависимости и требует дополнительных библиотек.

К тому же, с JSON можно открыть файл в блокноте, найти нужного игрока и быстро исправить ему характеристику, не запуская редактор баз данных.

Почему не.tres (ресурсы Godot)

Следующим кандидатом были.tres‑файлы — родные ресурсы моего любимого движка Godot. Да, у них есть плюсы: встроенная валидация типов, быстрая загрузка, интеграция с редактором.

Но меня они не устроили по нескольким причинам:

Проблема

Почему это важно

Бинарный формат

Нельзя открыть.tres в обычном текстовом редакторе и быстро поправить ошибку. Приходится лезть в редактор Godot.

Привязка к движку

Если я захочу сделать веб‑админку для управления составом команды — я не смогу прочитать.tres‑файл без Godot.

Миграции

При изменении структуры класса игрока (например, я добавил новое поле «скорость») мне пришлось бы переписывать все ресурсы вручную.

Гибкость

В моей игре игроки генерируются динамически. Создавать новый.tres‑ресурс для каждого новичка — слишком тяжеловесно.

Почему я выбрал JSON

JSON стал победителем по нескольким причинам:

1. Человекочитаемость

Файл players.json открывается в любом текстовом редакторе:

{
	"id": 1,
	"general": {
		"first_name": "Тест",
		"last_name": "Автозагрузка",
		"age": 16,
		"team": "1"
	},
	"stats": {
		"pass": 50,
		"tackle": 50,
		"shot": 50
	},
	"talent_id": 1,
	"talent_level": 0
}

2. Простота интеграции с Godot

В Godot есть встроенный класс JSON. Парсинг происходит в пару строк:

var json = JSON.new()
var error = json.parse(file.get_as_text())
var data = json.get_data()

3. Универсальность

Можно использовать JSON на сервере, в веб‑интерфейсе, в мобильном приложении. Это не привязывает меня к Godot.

4. Простота миграции

Добавив новое поле «is_injured», можно просто написать скрипт, который пройдется по всем игрокам и добавит это поле. С.tres‑файлами это было бы огромной головной болью.

Как это работает в Kickoff Island

В игре данные хранятся в двух основных JSON‑файлах (но есть и другие, например, переписка с родственниками и игроками команды по телефону):

  • players.json — список всех игроков с их характеристиками, талантами, состоянием и командами.

  • teams.json — список команд с названиями, статистикой.

Есть также файл — formation.json, который хранит расстановку игроков на поле. Это позволяет гибко менять тактику, не затрагивая основные данные.

Все данные загружаются через синглтон DatabaseManager.gd, который работает с JSON‑файлами, обеспечивая чтение, запись и синхронизацию данных.

Вывод

Выбор формата хранения — это не вопрос «что круче», а вопрос «что проще и удобнее для конкретно моей задачи».

Для небольшое количество данных JSON оказался идеальным выбором. Он не требует установки дополнительных библиотек, не привязывает меня к движку и позволяет быстро вносить изменения, что максимально подходит для моего проекта и для меня лично, так как я не такой уж специалист по БД.

Если вам интересно, как я делаю пошаговый футбольный менеджер с пиксельной графикой и тактическими матчами, заглядывайте в сообщество VK.

Комментарии (7)


  1. Zx2001
    27.08.2026 20:33

    Ллм слоп - не по содержанию, которое интересно, а по стилю. Зачем авторы как будто спецом портят текст и прячут часто неплохую идею/мысли/инфу за слоп?


    1. Plus3s Автор
      27.08.2026 20:33

      Перед вами мой сознательный текст о моем сознательном выборе. Мне что, надо было душу вам тронуть, чтобы заслужить поощрение? Или вернуться к наскальной живописи? Я просто охреневаю от охотников за привидениями здесь.


      1. crama
        27.08.2026 20:33

        Это ж твоя 9-я статья. Первый раз вахтеров встречаешь?


        1. Plus3s Автор
          27.08.2026 20:33

          Ну раньше как-то так ещё не было. Получается, что недовольные всегда есть и они рядом. Тут 100 раз подумаешь, прежде чем писать 10-ю статью.


  1. HemulGM
    27.08.2026 20:33

    JSON

    1. Нет никакой защиты

    2. Нет гибкости и масштабируемости (сегодня 20 человек, через год 200)

    3. Для поиска и работы ты вынужден держать всё в ОЗУ

    SQLite был бы идеальным выбором:

    1. Это самая простая бд, файловая, не требующая установки

    2. Быстрый поиск

    3. Есть легковесные редакторы бд для быстрой правки

    4. Миграция - проработанный механизм

    5. Если нужно будет, легко заменить на крупную бд без необходимости вообще вносить правки в коде

    Как итог: хранить в json чуть проще, чем SQLite, но это не стоит того


    1. Plus3s Автор
      27.08.2026 20:33

      1. Скорость в доли секунды не важна, когда у тебя в базе всего несколько десятков строк.

      2. Когда в базе несколько десятков строк, я нахожу нужную практически сразу же (быстрее, чем через какой-либо поиск)

      3. Ну, в общем-то смотри первые два пункта

      4. Отлично. Буду иметь в виду, если понадобится

      5. Вообще никогда не нужно будет

        Вопрос: а зачем оно мне, если меня абсолютно всё устраивает? В данном случае, если вы не поняли, преимущество в простоте.


      1. stvoid
        27.08.2026 20:33

        Поддерживаю ваш выбор за простоту. Если нет явной необходимости и понимания что вот, пора тащить новую зависимость, то и не нужно. В вашем кейсе даже sqlite будет оверинжиниригом. Но если вдруг настанет момент сильно расширяться, то я бы тоже предпочел этот вариант.