UE4:引数でコンフィグファイルを上書きする

UE4の起動させるときのコマンドラインにて、パラメーターを上書きすることができます。書式としては以下の通り。

-ini:inifile1:[section1]:parameter=value1,[section2]:parameter2=value2,...
  • inifile の名前はコンフィグファイルのベース名のみです。 DefaultEngine.ini なら Engine とします
  • section はコンフィグファイル内のセクション名です。 [/Script/Engine.Engine] といった具合です
  • その後に、parameter=value1 というようにパラメーターを書きます。
  • 1つのコマンドライン引数にて、コンフィグファイル1つに対して、複数のパラメーター設定が可能です。

注意点

  • Saver か Sipping ビルドでは使用できません。(機能がOFFにされます)
  • スペースが使えません。コマンドライン引数自体が分れてしまいます。またコマンドライン引数を""で囲ったとしても、パラメーター解釈の最初でスペースが終端として認識されます。なので、スペースが入るような名前の設定などは出来ません。
  • "(ダブルクォーテーション)は使えません。パラメーター解釈の最初に削除されます。
  • ,(カンマ)が使えません。カンマは複数のパラメータを書く時のセパレーターとして書式解釈の一番最初で判別されます。つまり、次のような複数の値を使うタイプは設定できません。
LightingOnlyBrightness=(R=0.3,G=0.3,B=0.3,A=1.0)
SmoothedFrameRateRange=(LowerBound=(Type="ERangeBoundTypes::Inclusive",Value=5))

コマンドラインでは単純な値を入れるだけの設定なら可能ですが、構造体の設定などには向きません。ただし、構造体の一部の値を変える事は可能です。次の例では SmoothedFrameRateRange の UpperBound の Value を 30 に書き換えています。

SmoothedFrameRateRange=(UpperBound=(Value=30))

ただ、これも1つの値なら可能ですが、1構造体の複数の内容を書き換えができませんでした。 今回試したのは可変フレームレートの上限と下限を設定する方法ですが、以下の2つの方法でも適用されるのは1つのみでした。

,(カンマ)で区切って複数を指定。前半(UpperBound)のみ設定。

-ini:Engine:[/Script/UnrealEd.EditorEngine]:SmoothedFrameRateRange=(UpperBound=(Value=30)),[/Script/UnrealEd.EditorEngine]:SmoothedFrameRateRange=(LowerBound=
(Value=20))

複数の -iniで指定。後半(LowerBound)のみ設定。

-ini:Engine:[/Script/UnrealEd.EditorEngine]:SmoothedFrameRateRange=(UpperBound=(Value=30)) -ini:[/Script/UnrealEd.EditorEngine]:SmoothedFrameRateRange=(LowerBound=(Value=20))

コマンドラインの -ini 指定解釈のプログラム

以下の関数内で処理されます。コメントを見ると書式の説明も書いています。

void FConfigFile::OverrideFromCommandline(FConfigFile* File, const FString& Filename)
{
#if ALLOW_INI_OVERRIDE_FROM_COMMANDLINE
    FString Settings;
    // look for this filename on the commandline in the format:
    //     -ini:IniName:[Section1]:Key1=Value1,[Section2]:Key2=Value2
    // for example:
    //     -ini:Engine:[/Script/Engine.Engine]:bSmoothFrameRate=False,[TextureStreaming]:PoolSize=100
    //         (will update the cache after the final combined engine.ini)
    if (FParse::Value(FCommandLine::Get(), *FString::Printf(TEXT("%s%s"), *CommandlineOverrideSpecifiers::IniSwitchIdentifier, *FPaths::GetBaseFilename(Filename)), Settings, false))
        :

キャッシュされたコンフィグファイル毎に、この関数が呼び出されます。次のような流れてキャッシュされたコンフィグファイルに追加されます。

  1. コマンドラインの引数内に"-ini:inifile" が無かったら終了。あったら「その後の文字列」を取得。
  2. 「その後の文字列」を、,(カンマ)で分離。複数の「パラメーター文字列」として分ける
  3. 「パラメーター文字列」を、=(イコール)で分離。SectionAndKey と、Value に分かれる。
  4. Section、Key、Value の文字列を取得。それをコンフィグファイルに追加する。

解釈時のセパレーターはテーブル化されているので、この部分を変えれば、,(カンマ)を式に入れる等のカスタマイズは可能です(おすすめはしませんが)

/** A collection of identifiers which will help us parse the commandline opions. */
namespace CommandlineOverrideSpecifiers
{
    // -ini:IniName:[Section1]:Key1=Value1,[Section2]:Key2=Value2
    FString IniSwitchIdentifier     = TEXT("-ini:");
    FString IniNameEndIdentifier    = TEXT(":[");
    FString SectionStartIdentifier  = TEXT("[");
    FString PropertyStartIdentifier = TEXT("]:");
    FString PropertySeperator       = TEXT(",");
}