main() blog

プログラムやゲーム、旅、愛する家族について綴っていきます。

【UE5】DeveloperSettingsを使ってみよう!(C++編)

概要

UEの「プロジェクト設定」や「エディタ設定」にプロジェクトの独自のパラメータを追加する方法についてです。

ゲームの初期値の設定や、デバッグ時などの設定などをプロジェクト設定で行うことができるようになります。

たとえば

  • プロジェクト独自のグラフィクスの設定をプロジェクト設定で行えるようにする
  • アセットの読み込みを行う際などにC++のソースにパスをハードコーディングせずに、設定したアセットのパスで読み込みを行うようにする
  • ゲーム起動のモードなどをプロジェクト設定で行えるようにする

などの用途が考えられます。

また、設定した値はConfig/DefaultGame.iniなどのiniファイルに保存されます。

動作環境

UnrealEngine 5.4.4

実装

UDeveloperSettingsを継承したクラスを作成し、設定を行いたい項目をUPROPERTYマクロを使用して変数を宣言することで、エディタの「プロジェクト設定」などに設定項目が追加されます。
作成されたヘッダーファイルに以下の項目を追加します。

UCLASS(config = Game, defaultconfig)
class TESTPROJECT_API UHogeDeveloperSettings : public UDeveloperSettings
{
    GENERATED_BODY()
    
public:
    UPROPERTY(EditAnywhere, Config)
    bool SettingBool;

    UPROPERTY(EditAnywhere, Config)
    int SettingInt;

    UPROPERTY(EditAnywhere, Config)
    float SettingFloat;

    UPROPERTY(EditAnywhere, Config)
    FVector SettingVector;

    UPROPERTY(EditAnywhere, Config)
    FString SettingString;

    UPROPERTY(EditAnywhere, Config)
    TSoftObjectPtr<UDataTable> SettingDataTable;
};

クラスの定義でUCLASS(config=Game, defaultconfig)と定義しているので、プロジェクト設定のゲームのカテゴリに追加の指定となります。
defaultconfigとしているのでDefaultGame.iniに保存する指定となります。
また、変数(項目)のUPROPERTのConfigの指定でiniファイルへの保存の指定となります。
ビルド後にエディタを起動し、プロジェクト設定に追加した項目が反映されていることが確認できます。
表示項目はクラス名がそのまま設定されています。

設定を変更するとDefautlGame.iniに以下の項目が保存されていることが確認できます。

[/Script/TestProject.HogeDeveloperSettings]
SettingBool=True

configの設定をEngine、Editorなどと指定することでカテゴリの指定、保存するiniファイルを設定できます。

UCLASSでDisplayNameを使用することで表示名を指定することができます。

UCLASS(config = Game, defaultconfig, meta = (DisplayName = "テスト設定"))
class TESTPROJECT_API UHogeDeveloperSettings : public UDeveloperSettings
{
    GENERATED_BODY()

UDeveloperSettingsの以下の関数を使用することで、カテゴリやセクション名なども設定できます。

UCLASS(config = Game, defaultconfig, meta = (DisplayName = "テスト設定"))
class TESTPROJECT_API UHogeDeveloperSettings : public UDeveloperSettings
{
    GENERATED_BODY()
    
public:
    /** Gets the settings container name for the settings, either Project or Editor */
    virtual FName GetContainerName() const override;
    /** Gets the category for the settings, some high level grouping like, Editor, Engine, Game...etc. */
    virtual FName GetCategoryName() const override;
    /** The unique name for your section of settings, uses the class's FName. */
    virtual FName GetSectionName() const override;

#if WITH_EDITOR
    /** Gets the section text, uses the classes DisplayName by default. */
    virtual FText GetSectionText() const override;
    /** Gets the description for the section, uses the classes ToolTip by default. */
    virtual FText GetSectionDescription() const override;
#endif

GetCategoryName()、GetSectionText()、GetSectionDescription()の設定が表示名に反映されます。

#define LOCTEXT_NAMESPACE "HogeDeveloperSettings"

FName UHogeDeveloperSettings::GetContainerName() const
{
    return Super::GetContainerName();
}
FName UHogeDeveloperSettings::GetCategoryName() const
{
    FText CategoryText = LOCTEXT("TestCategory", "テストカテゴリ");

    return FName(*CategoryText.ToString());
}
FName UHogeDeveloperSettings::GetSectionName() const
{
    return Super::GetSectionName();
}

#if WITH_EDITOR
FText UHogeDeveloperSettings::GetSectionText() const
{
    return LOCTEXT("TestSection", "テストセクション");
}
FText UHogeDeveloperSettings::GetSectionDescription() const
{
    return LOCTEXT("TestSectionDesc", "テストセクション説明");
}
#endif

#undef LOCTEXT_NAMESPACE

カテゴリを指定することでゲームやエンジン、エディタなどと同じ階層に追加されるようになります。
カテゴリの中がセクション名が適用されて表示されます。

参照方法

設定された値にC++でアクセスするには以下の静的関数を使用します。

 const UHogeDeveloperSettings* Settings = GetDefault<UHogeDeveloperSettings>();

    if (Settings)
    {
        UE_LOG(LogTemp, Log, TEXT("HogeDeveloperSettings:"));
        UE_LOG(LogTemp, Log, TEXT("  SettingBool: %s"), Settings->SettingBool ? TEXT("true") : TEXT("false"));
        UE_LOG(LogTemp, Log, TEXT("  SettingInt: %d"), Settings->SettingInt);
        UE_LOG(LogTemp, Log, TEXT("  SettingFloat: %f"), Settings->SettingFloat);
        UE_LOG(LogTemp, Log, TEXT("  SettingVector: %s"), *Settings->SettingVector.ToString());
        UE_LOG(LogTemp, Log, TEXT("  SettingString: %s"), *Settings->SettingString);
        if (Settings->SettingDataTable.IsValid())
        {
            UE_LOG(LogTemp, Log, TEXT("  SettingDataTable: %s"), *Settings->SettingDataTable->GetName());
        }
        else
        {
            UE_LOG(LogTemp, Log, TEXT("  SettingDataTable: nullptr"));
        }
    }

値を設定して実行時に参照してみます。

以下の様なログで反映されていることが確認できます。

[2025.12.16-01.58.45:177][231]LogTemp: HogeDeveloperSettings:
[2025.12.16-01.58.45:559][231]LogTemp:   SettingBool: true
[2025.12.16-01.58.45:853][231]LogTemp:   SettingInt: 10
[2025.12.16-01.58.46:244][231]LogTemp:   SettingFloat: 100.500000
[2025.12.16-01.58.46:542][231]LogTemp:   SettingVector: X=10.000 Y=20.000 Z=30.000
[2025.12.16-01.58.46:894][231]LogTemp:   SettingString: TEST
[2025.12.16-01.58.49:823][231]LogTemp:   SettingDataTable: nullptr

試しにWin64版のパッケージを作成して実行したところ、同様に設定が反映されていることが確認できます。

参考

historia.co.jp