Конфигурация игрового проекта
Руководство показывает, как embedding project должен создавать .fomain,
resource packs и именованные sub-configs. Точная runtime model описана в
Конфигурация и источники данных, а
актуальные имена встроенных settings приведены в
generated settings reference.
Проверенные исходные пути
Source/Common/Settings.hSource/Common/Settings.cppSource/Common/Settings.incSource/Frontend/ApplicationInit.cppSource/Tests/Test_Settings.cppBuildTools/cmake/stages/ScriptsAndBaking.cmakeExamples/MinimalProject/CMakeLists.txtExamples/MinimalProject/FOnlineStarter.fomainExamples/MinimalMultiplayer/CMakeLists.txtExamples/MinimalMultiplayer/FOnlineMinimalMultiplayer.fomain
Начните с исполняемого baseline
Для первого headless-запуска используйте структуру MinimalProject, для client/server игры: MinimalMultiplayer. Сохраняйте игровой репозиторий корнем CMake и явно задавайте master config:
include(Engine/BuildTools/Init.cmake)
SetOption(FO_MAIN_CONFIG "MyGame.fomain")
SetOption(FO_DEV_NAME "MYGAME")
SetOption(FO_NICE_NAME "My Game")
FO_MAIN_CONFIG является configure-time project option. Содержимое .fomain
задает runtime и baking settings. Не переносите product values в defaults
движка только ради отказа от сопровождения project file.
Порядок приоритетов
Для unpackaged application settings применяются в таком порядке:
- defaults из
Source/Common/Settings.inc; - выбранный
.fomain, найденный через-ApplyConfigили подъем по каталогам доFO_MAIN_CONFIG; - каждый явно выбранный
-ApplySubConfigв порядке command line; - local config установленного клиента в writable cache, если он существует;
- обычные command-line setting overrides;
- platform/build auto-settings.
В packaged applications внешний .fomain заменяется generated internal
config с фиксированной движком patch area размером 20000 bytes. У packaged
build нет таблицы sub-config: -ApplySubConfig отвергается, а нужный вариант
следует выбрать при сборке пакета. Root-значения
game settings также передаются в metadata, а internal config содержит только
deltas выбранного sub-config, включая явные false или empty overrides. Command
line всё равно применяется после local config. Более поздние слои
переопределяют ранние scalar settings.
Metadata применяется только после создания BaseEngine. Если project code
читает объявленный game setting в ApplicationInitHook или более раннем startup
path, добавьте его fully qualified name в Baking.BootstrapGameSettings.
Config baker запишет такой setting полностью в каждый internal config и
отклонит неизвестное имя или опечатку. Не включайте обычные runtime settings:
они принадлежат metadata, а расход фиксированной patch area на них может
сорвать packaging.
В authored files и operational commands используйте fully qualified names,
например Server.DbStorage. Parser принимает короткие имена встроенных
settings, но qualified names делают ownership и review однозначными.
Корневые settings
Записывайте по одному намеренному значению в строке:
Common.GameName = My Game
Common.GameVersion = 0.1.0
Network.ServerPort = 4000
Network.WebSocketPort = 4001
Server.DbStorage = Memory
ServerNetwork.DisableNetworking = False
Baking.BakeLanguages = engl russ
Baking.BakeOutput = Baking
Baking.ServerResources = ServerResources
Baking.ClientResources = Resources
Baking.PlatformBinaries = PlatformBinaries
Baking.CacheResources = Cache
ManagedScript.Assemblies = MyGame
ManagedScript.ProjectName = MyGame
ManagedScript.TargetFramework = net10.0
ManagedScript.MsBuild = dotnet msbuild
ManagedScript.Dirs = Engine/Source/Scripting/Managed/CoreScripts Scripts
ManagedScript.Analyzers = Engine/Source/Scripting/Managed/Analyzers/FOnline.Analyzers.csproj
Неизвестные имена становятся project custom settings и доступны через
GetCustomSetting / FindCustomSetting. Это намеренное поведение для
game-owned configuration, но опечатка в имени built-in setting поэтому может
выглядеть допустимой. Добавляйте focused project test для каждого content ID,
port/profile, prototype name, path или custom setting, влияющего на startup или
gameplay.
Значения с начальным + накапливаются вместо замены. Strings добавляются через
пробел, vectors получают новые elements, числовые значения складываются,
booleans используют logical OR, а enums: bitwise OR. Используйте это осознанно
и проверяйте итоговое значение, не предполагая list-only behavior.
$ENV{NAME} и $FILE{path} разрешаются при чтении authored config, в том числе
во время baking, поэтому конкретные значения могут попасть в generated internal
configs. $TARGET_ENV{NAME} и $TARGET_FILE{path} остаются directives во время
baking и разрешаются только тогда, когда их читает target application; текущий
packager не предоставляет общий resolver target directives. Не храните
credentials в tracked config, используйте target forms для runtime secrets и
следуйте Security and Secrets для command-line,
logging, signing, CI, rotation и artifact boundaries.
Определение resource packs
Resource pack выбирает inputs, bakers и runtime recipients:
[ResourcePack]
Name = Protos
InputDirs = Content Maps
IncludePatterns = **
ExcludePatterns = **/Draft/**
Bakers = Proto
[ResourcePack]
Name = Maps
InputDirs = Maps
IncludePatterns = **/*.fomap
Bakers = Map
[ResourcePack]
Name = ServerScripts
InputDirs = Scripts
IncludePatterns = **/*.fos
Bakers = AngelScript
ServerOnly = True
[ResourcePack]
Name = ManagedScripts
InputDirs = Engine/Source/Scripting/Managed/CoreScripts Scripts
IncludePatterns = *
Bakers = Managed
Выбирайте backend явно. Pack AngelScript запекает модули .fos через AngelScriptBaker; pack Managed компилирует настроенные top-level исходники .cs и generated API в target-specific assemblies. Managed pack должен включать Engine CoreScripts и проектные исходники из ManagedScript.Dirs; согласуйте с той же сборкой настройки assemblies, analyzers, extra sources/references и generated directory. Полный контракт backend описан в Скриптах Managed C#.
Допустимые fields:
| Field | Значение |
|---|---|
Name |
Обязательная identity pack и generated resource entry |
ConfigDir |
Вычисляемый каталог владеющего config для разрешения относительных inputs; в секции не задаётся |
InputDirs |
Разделенные пробелами каталоги относительно owning config |
InputFiles |
Разделенные пробелами explicit files, также относительно config |
IncludePatterns |
Необязательный input glob allowlist |
ExcludePatterns |
Необязательный input glob denylist |
Bakers |
Разделенные пробелами имена bakers |
ServerOnly |
Создать только server resource entry |
ClientOnly |
Создать только client resource entry |
MapperOnly |
Создать только mapper resource entry |
Не более одного side-only flag может быть true. Без flags pack поставляется
server и client. Mapper-only packs отделены. RecursiveInput встречается в
старых project files, но не является текущим field ResourcePackInfo;
рекурсию задавайте через IncludePatterns = **.
Разделяйте packs, если различаются ownership, release cadence, side visibility или update policy. Не используйте pack order как скрытую систему gameplay overrides: duplicate resource identities требуют явной project policy и test.
Добавление именованных sub-configs
Sub-configs являются reviewed overlays для launch mode:
[SubConfig]
Name = LocalDev
Server.DbStorage = Memory
ServerNetwork.DisableNetworking = False
Render.RenderDebug = True
[SubConfig]
Name = TutorialSmoke
Parent = LocalDev
Tutorial.Automation = True
Render.HeadlessWindow = True
Render.NullRenderer = True
Audio.DisableAudio = True
Имена Parent должны ссылаться на более ранние sub-config sections. Несколько
parents применяются слева направо: поздние parents переопределяют ранние по key,
затем побеждает дочерняя section. Launch может передать несколько
-ApplySubConfig, они применяются в command-line order.
Используйте -ApplySubConfig NONE для generation/baking commands, которые
должны читать только master config. BuildTools делает это для
CompileAngelScript, CompileManagedScripts, BakeResources и ForceBakeResources.
Держите sub-configs узкими:
- environment modes выбирают infrastructure и diagnostics;
- tests выбирают deterministic fixtures и headless behavior;
- scenes выбирают startup content;
- release modes выбирают product-safe settings;
- secrets не находятся в sub-configs.
Проверка изменения конфигурации
- Повторите configure embedding project, если изменились CMake options или main config path.
- Выполните
CompileAngelScriptи/илиCompileManagedScriptsдля каждого включённого backend, чьи script inputs, generated API, analyzers или metadata изменились. - Выполните
BakeResources; используйтеForceBakeResourcesпосле изменения pack membership, baker selection, include/exclude patterns, language sets или migration rules. - Запустите самый узкий sub-config, использующий измененный setting.
- Проверьте startup logs на
Apply config,Apply sub config, unknown/missing files, skipped languages, missing bakers и side resource entries. - Выполните project test, разрешающий custom settings и content-backed references.
- Один раз выполните build/package, если изменилась internal config или composition runtime resource entries.
Два примера движка служат исполняемыми configuration fixtures:
(cd Examples/MinimalProject && python3 validate.py)
(cd Examples/MinimalMultiplayer && python3 validate.py)
В Windows используйте варианты с win64-.
Частые ошибки
| Симптом | Причина | Восстановление |
|---|---|---|
Config file not found |
Неверный working directory, FO_MAIN_CONFIG или -ApplyConfig path |
Передайте явный config path или запускайте ниже project root |
Sub config not found |
Опечатка в имени или section не загружена | Проверьте порядок/имя section и примененный master config |
Parent sub config not found |
Parent расположен позже или отсутствует | Переместите parent перед child или исправьте имя |
Resource pack name not specified |
Отсутствует Name |
Добавьте уникальное pack name |
| Сторона получает неожиданный pack | Side-only flag отсутствует или неверен | Разделите packs и проверьте generated resource entries |
| Incremental bake сохраняет старый output | Изменился pack membership или baker | Выполните ForceBakeResources и удаляйте только документированные disposable outputs |
| Built-in setting выглядит проигнорированным | Победил более поздний sub-config/local config/CLI/auto layer | Проверьте полную precedence chain |
| Опечатка незаметно стала custom setting | Unknown names намеренно принадлежат проекту | Добавьте settings/content validation test |
Дисциплина обновлений
При обновлении Engine или embedding project проверяйте изменения
Settings.inc, Settings.cpp, ApplicationInit.cpp, BuildTools project
options, baking stages и диапазона project .fomain. В том же change обновляйте
руководство, project config, tests и generated references, если изменились
precedence, fields, defaults, pack routing или launch profiles.