【UE4】iniファイルの読み込み優先度やコンフィグについてあれこれ

コンフィグの概要

UE4エディターでは、Editor Preferences, Project Settings から各コンフィグを設定できます。

f:id:shuntaendo:20200903141133p:plain:w200

コンフィグは全てINIファイルとして保存されます。


独自設定の追加

デフォルトで用意されている項目だけではなく、自作した設定も追加することが可能です。

追加方法については以下の記事に詳しく書かれています。
historia.co.jp

qiita.com

実際に追加するとこんな感じです。
それっぽいパラメータにしてますが特に意味はないです。

void RegisterSettings()
{
	#if WITH_EDITOR
	if (ISettingsModule* SettingsModule = FModuleManager::GetModulePtr<ISettingsModule>("Settings"))
	{
		ISettingsSectionPtr SettingsSection = SettingsModule->RegisterSettings("Project", "MySettingCategory", "MySetting",
			LOCTEXT("MySettingName", "MySetting"),
			LOCTEXT("MySettingDescription", "MyConfiguration"),
			GetMutableDefault<UMySetting>());

		if (SettingsSection.IsValid())
		{
			SettingsSection->OnModified().BindRaw(this, &FMySettingModule::HandleSettingsSaved);
		}
	}
	#endif
}

void UnregisterSettings()
{
	#if WITH_EDITOR
	if (ISettingsModule* SettingsModule = FModuleManager::GetModulePtr<ISettingsModule>("Settings"))
	{
		SettingsModule->UnregisterSettings("Project", "MySettingCategory", "MySetting");
	}
	#endif
}
#pragma once

#include "CoreMinimal.h"
#include "Settings/EditorSettings.h"
#include "MySetting.generated.h"

UCLASS(config = Project)
class UMySetting : public UObject
{
	GENERATED_UCLASS_BODY()

public:
	UPROPERTY(EditAnywhere, config, Category = "Battle")
	bool AutoBattle;

	UPROPERTY(EditAnywhere, config, Category = "Battle")
	float DamageMultiplier;

	UPROPERTY(EditAnywhere, config, Category = "Event")
	bool AutoSkip;
};

f:id:shuntaendo:20200903143312p:plain:w500

Editor Preferences に登録したい場合は RegisterSettings() の ContainerName を "Editor" に。Project Settings に登録したい場合は "Project" にします。
ContainerName を変えると保存先も変わります。(〇〇Editor.ini, 〇〇Game.ini など)


コンフィグの値を取得

BP

BPでは [Get Class Defaults] ノードでコンフィグのクラスを指定して取得できます。
BPで値を扱うのでコンフィグの各 UPROPERTY に"BlueprintReadOnly" か "BlueprintReadWrite" のメタ指定子を追加する必要があります。

f:id:shuntaendo:20200903154421p:plain

C++

C++ でも同じように GetDefault<>() で取得できます。

const UMySetting* setting = GetDefault<UMySetting>();
bool bSkip = setting->AutoSkip;

.

コンフィグの値を設定

おそらくBPからは標準機能ではできないと思いますのでC++だけ。

C++

UMySetting* setting = GetMutableDefault<UMySetting>();
setting->AutoSkip = true;
setting->SaveConfig();

.

iniファイルの読み込み優先度

読み込み順は以下のようになっています。

1.C:/Users/[UserName]/AppData/Local/Unreal Engine/Engine/Config/UserGame.ini
2.[ProjectDirectory]/Saved/Config/[Platform]/〇〇.ini
3.[ProjectDirectory]/Config/[Platform]/[Platform]〇〇.ini
4.[ProjectDirectory]/Config/Default〇〇.ini
5.Engine/Config/[Platform]/[Platform]〇〇.ini
6.Engine/Config/Base〇〇.ini
7.Engine/Config/Base.ini

上から順に読み込まれ、該当するセクションがなければ1つ下の iniファイルが読み込まれます。

UCLASS() に追加するメタ指定子によって書き込まれる場所が変わります。

指定子 場所
指定子無し 2 - Saved/Config/
defaultconfig 4 - Config/Default〇〇.ini
globaluserconfig 1 - Config/UserGame.ini

.

ユーザーごとのローカル設定

上記で作った例のようにデバッグ用のイベントスキップ機能があるとして、プログラマ以外でも誰でも使えるがバージョン管理外としたい、ユーザーごとに設定を保持してる形にしたい、というようなケースがあると思います。

その場合は読み込み順の2番目の Saved 以下に書き込む形と良いです。
一般的に Saved フォルダはバージョン管理外にするため、ユーザーごとのローカル設定を作れると思います。

また、この設定はパッケージ後のアプリケーションに影響しないため、よりローカル設定に適していると思います。
(読み込み順下位の iniファイルに該当セクションがある場合はそちらが参照されます。)


プロジェクト間で設定を共有

一部の設定はプロジェクト間で共有されます。

同じエンジン

読み込み順5以下の Engine フォルダ以下の iniファイルは同じエンジンであればプロジェクト間で共有されます。

同じユーザー

読み込み順1の GlobalUserConfig はその名の通りPCにログインしているユーザーが変わらなければ、どのプロジェクトでも設定が共有されます。

ですので、3年前にこのような記事を書いておいてなんですが、複数プロジェクトで同じカスタムエンジンを使っていたり相当な理由がない限りおすすめしません。



以上になります。
コンフィグ周りはまだまだわからないことも多いので間違っている点や本記事にない情報などあればコメント等で教えていただけたらと思います。では(・・)/


UE Version : 4.25.3-13942748