ConfigStore и ConfigEntry09 / 12

Читаем конфигурацию игры

Отделим загрузку JSON от его проверки и использования.

ConfigStore хранит конфигурации, подготовленные движком. Чтобы прочитать размеры поля, ему нужны ID файла и декодер. ConfigEntry объединяет ID и декодер, чтобы не передавать их каждый раз отдельно.

Фрагмент BlockPuzzleConfigEntries.Board из schemas.ts:

static readonly Board = new ConfigEntry(
  'json/configs/scenes/game/board.json',
  SchemaDecoder.object({
    width: SchemaDecoder.number({ integer: true, min: 1 }),
    height: SchemaDecoder.number({ integer: true, min: 1 }),
  }),
);

Получение проверенного значения в фабрике сервиса из scene.di.ts:

configs.get(
  BlockPuzzleConfigEntries.Board.fileId,
  BlockPuzzleConfigEntries.Board.decoder,
)

Здесь configs — ConfigStore, полученный через DI. Файл уже должен быть загружен и помещён в хранилище.

01
AssetManagerПолучает JSON из файла
02
bootstrapConfigBundlesРазмещает JSON в ConfigStore
03
ConfigEntryСвязывает ID и декодер
04
ConfigStore.getВозвращает проверенные размеры сервису
Загрузка и проверка — две разные обязанности.

assets.preload загружает ресурсы, а system.boot.configs.engineStartBundles объявляет, какие наборы конфигов подготовить для ConfigStore при старте. Для данных, нужных только конкретной сцене, есть sceneEnterBundles. Просто назвать набор configs недостаточно.

Настройки и каталоги

SettingsEntry описывает отдельный ключ внутри файла, а SettingsService.read(entry) проверяет его собственным декодером. Это чтение авторских настроек, не сохранение прогресса игрока.

DecodedConfigStore полезен, когда проект уже имеет карту типов по ID и общий resolver декодеров. Его getByEntry принимает ConfigEntry. Для одного файла прямого ConfigStore.get достаточно — так сделано и в игре.

Стили текста подключаются через layouts.textStylesConfigId и проверяются TextStylesConfigDecoder. Настройки звука имеют свой декодер. Компоненты получают готовые настройки, без повторного чтения и проверки JSON.

Источники ↗

Block Puzzle · scene.di.ts↗Конфигурации передаются в конструкторы сервисов.