Настройки проекта: чтение, применение и сохранение
Отличить конфигурацию от состояния игры и сохранить нужные данные.
ProjectSettings хранит конфигурацию проекта из project.reckfell. Значение в этой конфигурации и текущее состояние работающей игры могут различаться. Настройки игрока и сохранённый прогресс храните отдельно: сохранение данных.
Найти и изменить настройку
Откройте Project → Project Settings → General. Найдите параметр через Filter Settings; если его нет в обычном списке, включите Advanced Settings. Полное имя для C# имеет вид application/run/max_fps: подписи категорий интерфейса могут быть локализованы, программный ключ менять нельзя.
Изменение в редакторе сохраняется в project.reckfell. Не редактируйте этот файл одновременно редактором и внешним инструментом: одно сохранение может затереть другое. Изменения настроек запуска проверяйте новым запуском проекта, а не только по значению в инспекторе.
Прочитать свою настройку безопасно
В project.reckfell можно определить игровое значение:
[game]
starting_lives=3В коде полный ключ — game/starting_lives. Сохраните этот помощник в ProjectOptions.cs C#-проекта Reckfell 1.0.0:
using Reckfell;
using System;
public static class ProjectOptions
{
public static int StartingLives
{
get
{
Variant value = ProjectSettings.GetSetting("game/starting_lives", 3);
return value.VariantType == Variant.Type.Int
? (int)Math.Clamp(value.AsInt64(), 1, 99)
: 3;
}
}
public static void ApplyFpsLimit(int fps) => Engine.MaxFps = Math.Max(0, fps);
}ProjectOptions.StartingLives возвращает число жизней. Если ключ отсутствует или вместо целого записана строка, используется 3. Целое ограничивается диапазоном 1–99 до преобразования в C# int, включая значения вне диапазона Int32.
GetSetting(name, defaultValue) не создаёт отсутствующий ключ и не исправляет его тип. Для проверки существования используйте HasSetting; для значения с активными feature tags — GetSettingWithOverride, как в руководстве по меткам.
Конфигурация и состояние игры
ProjectSettings.SetSetting("application/run/max_fps", 144) меняет запись настройки. В проверенном процессе текущий Engine.MaxFps остался прежним. Для изменения ограничения во время игры вызовите ProjectOptions.ApplyFpsLimit(60) и читайте состояние из Engine.MaxFps.
Помощник трактует 0 и отрицательные значения как отсутствие лимита. Это не обещание конкретной частоты кадров: V-Sync, производительность и другие ограничения остаются. Изменение Engine.MaxFps не переписывает значение в ProjectSettings.
Не переносите правило одного параметра на все остальные. Многие настройки применяются только при запуске, другие имеют собственный API времени выполнения. Смотрите описание конкретного параметра и проверяйте именно поведение игры.
Сохранение из кода
| Действие | Что меняется |
|---|---|
SetSetting(name, value) | Значение в памяти текущего процесса. Само по себе не записывает файл. |
SetSetting(name, default) | Удаляет ключ: здесь default имеет тип Variant и означает Nil. Это не сброс к исходному значению. |
SetInitialValue(name, value) | Устанавливает исходное значение уже существующей настройки; не заменяет текущее. Значения, равные исходным, пропускаются при сохранении. |
Save() | Сохраняет конфигурацию в project.reckfell. Подходит для инструментов редактора, а не для обычного меню настроек игрока. |
SaveCustom(path) | Сохраняет конфигурацию по указанному пути и возвращает Error. Не ограничивается одним вашим ключом. |
Для текстового файла SaveCustom принимает окончание .reckfell или override.cfg; для двоичного — .binary. Произвольный .json этим методом не поддерживается. Успех проверяется сравнением с Error.Ok. Запись другого файла не загружает его автоматически обратно в текущий процесс.
Для пользовательских настроек выбирайте отдельный ConfigFile в user://, чтобы не переписывать конфигурацию всего проекта. asset:// используется в проверке как каталог отдельного тестового проекта; в экспортированной игре не рассчитывайте на его доступность для записи.
Диагностика
- Значение прочитано, но игра не изменилась: найдите соответствующий API времени выполнения или перезапустите проект.
- После перезапуска изменение исчезло: менялась только память; проверьте путь записи и код ошибки.
- Настройка не попала в файл: проверьте её исходное значение; равные исходным значения пропускаются.
- Возвращается неверный тип: проверьте исходный
Variant, не полагайтесь на преобразование строки в число.
Проверено в установленном движке: помощник, отсутствующий ключ и тип, границы целого, удаление Nil, различие записи и текущего FPS, сохранение в отдельный текстовый файл с повторным чтением через ConfigFile. Действия мышью в редакторе, применение всех настроек, автоматическая загрузка override.cfg, экспорт и восстановление после перезапуска отдельно не проверены.