Читаем конфигурацию игры
Отделим загрузку 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. Файл уже должен быть загружен и помещён в хранилище.
assets.preload загружает ресурсы, а system.boot.configs.engineStartBundles объявляет, какие наборы конфигов подготовить для ConfigStore при старте. Для данных, нужных только конкретной сцене, есть sceneEnterBundles. Просто назвать набор configs недостаточно.
Настройки и каталоги
SettingsEntry описывает отдельный ключ внутри файла, а SettingsService.read(entry) проверяет его собственным декодером. Это чтение авторских настроек, не сохранение прогресса игрока.
DecodedConfigStore полезен, когда проект уже имеет карту типов по ID и общий resolver декодеров. Его getByEntry принимает ConfigEntry. Для одного файла прямого ConfigStore.get достаточно — так сделано и в игре.
Стили текста подключаются через layouts.textStylesConfigId и проверяются TextStylesConfigDecoder. Настройки звука имеют свой декодер. Компоненты получают готовые настройки, без повторного чтения и проверки JSON.