【UE4 C++】 Config Settings配置文件(.ini)
简介
常见存储路径
- \Engine\Config\
- \Engine\Saved\Config\ (运行后生成)
- [ProjectName]\Config\
- [ProjectName]\Saved\Config (运行后生成)
- 打包文件
- Development/Debug
打包目录\项目名称\Saved\Config\WindowsNoEditor
- Shipping
C:\Users\用户名\AppData\Local\项目名称\Saved\Config\WindowsNoEditor
- Development/Debug
常见配置文件
- DefaultEditor.ini
- DefaultEngine.ini
- DefaultGame.ini
- DefaultInput.ini
格式
-
文件格式: 文件名.ini
-
文本格式,分段和键-值对
[配置标题Section] key1 = value1 key2 = value2 -ConsoleKeys=Tilde +ConsoleKeys=Tilde Bindings=(Name="Q",Command="Foo") .Bindings=(Name="Q",Command="Bar") ; 这是一条注释
指定可配置变量 UCLASS()、UPROPERTY()
简单使用
-
Config=Game 默认路径为
[ProjectName]\Saved\Config\Windows\Game.ini
-
注意配置文件的 section 设置
[/Script/ModuleName.ExampleClass]
-
SaveConfig(CPF_Config, *ConfPath);
可以用于将变量值存到配置文件中 -
ReloadConfig(NULL, *ConfPath)
可以从配置文件中读取值,实时 -
LoadConfig() 可以从配置文件中读取值
UCLASS(Config=Game) class TIPS_API AConfigActor : public AActor { // 省略 UPROPERTY(Config, BlueprintReadWrite) float Examplefloat; UPROPERTY(Config, BlueprintReadWrite) TArray<FString> ExampleArray; };
void AConfigActor::BeginPlay() { Super::BeginPlay(); if (GConfig) { GConfig->Flush(true, GGameIni); //刷新缓存 LoadConfig(AConfigActor::StaticClass(), *GGameIni); //ReloadConfig(this->GetClass(), *ConfigPath); //SaveConfig(); } }
-
测试时,派生蓝图类,section 设为类路径也可以
-
蓝图中添加的变量也可以使用配置文件,需要勾选 Config Variable,鼠标悬浮会提示,需要自己到对应路径手动添加
使用时发现只在启动 Editor 生效,package game 模式下不生效。[/Game/CPPFunction/DataDrive/BP_ConfigActor.BP_ConfigActor_C] ExampleArray=1 ExampleArray=2 ExampleArray=20 ConfigVector=(X=10.000000,Y=20.000000,Z=30.000000)
自定义配置文件
-
创建 UDeveloperSettings 派生类
-
支持 ProjectSettings 修改
-
生成路径为
[ProjectName]\Config\DefaultGame.ini
UCLASS(Config = DataDrivenSettings, defaultconfig) class TIPS_API UDataDrivenSettings : public UDeveloperSettings { GENERATED_BODY() public: /** Gets the settings container name for the settings, either Project or Editor */ virtual FName GetContainerName() const override { return TEXT("Project"); } /** Gets the category for the settings, some high level grouping like, Editor, Engine, Game...etc. */ virtual FName GetCategoryName() const override { return TEXT("DataDrivenSettings"); } /** The unique name for your section of settings, uses the class's FName. */ virtual FName GetSectionName() const override { return TEXT("DataDrivenSettings"); } public: UPROPERTY(Config, EditAnywhere, BlueprintReadWrite) FString PlayerName="Default"; UPROPERTY(Config, EditAnywhere, BlueprintReadWrite) float PlayerHealth = 100.0f; };
直接读写配置文件
-
GConfig 类型为 FConfigCacheIni* ,下面为 FConfigCacheIni 的一些方法,更详细的接口可以查看文章尾部的附录
void LoadFile( const FString& InFilename, const FConfigFile* Fallback = NULL, const TCHAR* PlatformString = NULL ); void SetFile( const FString& InFilename, const FConfigFile* NewConfigFile ); void UnloadFile( const FString& Filename ); void Detach( const FString& Filename ); bool GetString( const TCHAR* Section, const TCHAR* Key, FString& Value, const FString& Filename ); bool GetText( const TCHAR* Section, const TCHAR* Key, FText& Value, const FString& Filename ); bool GetSection( const TCHAR* Section, TArray<FString>& Result, const FString& Filename ); bool DoesSectionExist(const TCHAR* Section, const FString& Filename); void SetString( const TCHAR* Section, const TCHAR* Key, const TCHAR* Value, const FString& Filename ); void SetText( const TCHAR* Section, const TCHAR* Key, const FText& Value, const FString& Filename ); bool RemoveKey( const TCHAR* Section, const TCHAR* Key, const FString& Filename ); bool EmptySection( const TCHAR* Section, const FString& Filename ); bool EmptySectionsMatchingString( const TCHAR* SectionString, const FString& Filename ); FString GetStr(const TCHAR * Section, const TCHAR * Key, const FString & Filename); bool GetInt(const TCHAR * Section, const TCHAR * Key, int32 & Value, const FString & Filename); bool GetFloat(const TCHAR * Section, const TCHAR * Key, float& Value, const FString & Filename); bool GetDouble(const TCHAR * Section, const TCHAR * Key, double& Value, const FString & Filename); bool GetBool(const TCHAR * Section, const TCHAR * Key, bool& Value, const FString & Filename); int32 GetArray(const TCHAR * Section, const TCHAR * Key, TArray<FString>&out_Arr, const FString & Filename);
读取
读取系统自带的配置属性
[/Script/EngineSettings.GameMapsSettings]
GameDefaultMap=/Game/CPPFunction/MultiThread/Map_multithread.Map_multithread
EditorStartupMap=/Game/CPPFunction/MultiThread/Map_multithread.Map_multithread
if (GConfig)
{
FString GameDefaultMap;
bool success = GConfig->GetString(TEXT("/Script/EngineSettings.GameMapsSettings"), TEXT("GameDefaultMap"), GameDefaultMap, GEngineIni);
if (success)
{
UE_LOG(LogTemp, Warning, TEXT(" GameDefaultMap: %s"), *GameDefaultMap);
return true;
}
}
return false;
// >> LogTemp: Warning: GameDefaultMap: /Game/CPPFunction/MultiThread/Map_multithread.Map_multithread
读取自定义配置属性
[DarkSoul]
Name=Frank
DeadTimes=100
if (GConfig)
{
FString Name;
int32 DeadTimes;
bool success = GConfig->GetString(TEXT("DarkSoul"), TEXT("Name"), Name, GGameIni);
success &= GConfig->GetInt(TEXT("DarkSoul"), TEXT("DeadTimes"), DeadTimes, GGameIni);
if (success)
{
UE_LOG(LogTemp, Warning, TEXT(" Name: %s, DeadTimes: %d"), *Name, DeadTimes);
return true;
}
}
return false;
- GGameIni 默认路径:
[ProjectName]\Saved\Config\Windows\Game.ini
GGameIni 也可以读取[ProjectName]\Config\DefaultGame.ini
读取自定义 SympleConfig.ini
FConfigFile CustomConfigFile;
FString Path = FPaths::ProjectConfigDir() / TEXT("SympleConfig.ini");
CustomConfigFile.Read(Path);
FString ProjectID;
bool success = CustomConfigFile.GetString(TEXT("ProjectSettings"), TEXT("ProjectID"), ProjectID);
if (success)
{
UE_LOG(LogTemp, Warning, TEXT(" ProjectID: %s"), *ProjectID);
return true;
}
return false;
写入
-
Set
if (GConfig) { FString Name = "Mike"; TArray<FString> Buff; Buff.Add(TEXT("Fire")); Buff.Add(TEXT("Strong")); Buff.Add(TEXT("Speed")); GConfig->SetString(TEXT("DarkSoul"), TEXT("Name"), *Name, GGameIni); GConfig->SetArray(TEXT("DarkSoul"), TEXT("Buff"), Buff, GGameIni); GConfig->SetVector(TEXT("DarkSoul"), TEXT("Name"), GetActorLocation(), GGameIni); }
附录
系统默认配置文件
FString GEngineIni; /* Engine ini filename */
/** Editor ini file locations - stored per engine version (shared across all projects). Migrated between versions on first run. */
FString GEditorIni; /* Editor ini filename */
FString GEditorKeyBindingsIni; /* Editor Key Bindings ini file */
FString GEditorLayoutIni; /* Editor UI Layout ini filename */
FString GEditorSettingsIni; /* Editor Settings ini filename */
/** Editor per-project ini files - stored per project. */
FString GEditorPerProjectIni; /* Editor User Settings ini filename */
FString GCompatIni;
FString GLightmassIni; /* Lightmass settings ini filename */
FString GScalabilityIni; /* Scalability settings ini filename */
FString GHardwareIni; /* Hardware ini filename */
FString GInputIni; /* Input ini filename */
FString GGameIni; /* Game ini filename */
FString GGameUserSettingsIni; /* User Game Settings ini filename */
FString GRuntimeOptionsIni; /* Runtime Options ini filename */
FString GInstallBundleIni; /* Install Bundle ini filename*/
FString GDeviceProfilesIni; /* Runtime DeviceProfiles ini filename - use LoadLocalIni for other platforms'
FConfigCacheIni 获取配置文件中数据的方法
// Derived functions.
FString GetStr
(
const TCHAR* Section,
const TCHAR* Key,
const FString& Filename
);
bool GetInt
(
const TCHAR* Section,
const TCHAR* Key,
int32& Value,
const FString& Filename
);
bool GetFloat
(
const TCHAR* Section,
const TCHAR* Key,
float& Value,
const FString& Filename
);
bool GetDouble
(
const TCHAR* Section,
const TCHAR* Key,
double& Value,
const FString& Filename
);
bool GetBool
(
const TCHAR* Section,
const TCHAR* Key,
bool& Value,
const FString& Filename
);
int32 GetArray
(
const TCHAR* Section,
const TCHAR* Key,
TArray<FString>& out_Arr,
const FString& Filename
);
/** Loads a "delimited" list of strings
* @param Section - Section of the ini file to load from
* @param Key - The key in the section of the ini file to load
* @param out_Arr - Array to load into
* @param Filename - Ini file to load from
*/
int32 GetSingleLineArray
(
const TCHAR* Section,
const TCHAR* Key,
TArray<FString>& out_Arr,
const FString& Filename
);
bool GetColor
(
const TCHAR* Section,
const TCHAR* Key,
FColor& Value,
const FString& Filename
);
bool GetVector2D(
const TCHAR* Section,
const TCHAR* Key,
FVector2D& Value,
const FString& Filename);
bool GetVector
(
const TCHAR* Section,
const TCHAR* Key,
FVector& Value,
const FString& Filename
);
bool GetVector4
(
const TCHAR* Section,
const TCHAR* Key,
FVector4& Value,
const FString& Filename
);
bool GetRotator
(
const TCHAR* Section,
const TCHAR* Key,
FRotator& Value,
const FString& Filename
);
void SetInt
(
const TCHAR* Section,
const TCHAR* Key,
int32 Value,
const FString& Filename
);
void SetFloat
(
const TCHAR* Section,
const TCHAR* Key,
float Value,
const FString& Filename
);
void SetDouble
(
const TCHAR* Section,
const TCHAR* Key,
double Value,
const FString& Filename
);
void SetBool
(
const TCHAR* Section,
const TCHAR* Key,
bool Value,
const FString& Filename
);
void SetArray
(
const TCHAR* Section,
const TCHAR* Key,
const TArray<FString>& Value,
const FString& Filename
);
/** Saves a "delimited" list of strings
* @param Section - Section of the ini file to save to
* @param Key - The key in the section of the ini file to save
* @param out_Arr - Array to save from
* @param Filename - Ini file to save to
*/
void SetSingleLineArray
(
const TCHAR* Section,
const TCHAR* Key,
const TArray<FString>& In_Arr,
const FString& Filename
);
void SetColor
(
const TCHAR* Section,
const TCHAR* Key,
FColor Value,
const FString& Filename
);
void SetVector2D(
const TCHAR* Section,
const TCHAR* Key,
FVector2D Value,
const FString& Filename);
void SetVector
(
const TCHAR* Section,
const TCHAR* Key,
FVector Value,
const FString& Filename
);
void SetVector4
(
const TCHAR* Section,
const TCHAR* Key,
const FVector4& Value,
const FString& Filename
);
void SetRotator
(
const TCHAR* Section,
const TCHAR* Key,
FRotator Value,
const FString& Filename
);
参考
作者:砥才人
出处:https://www.cnblogs.com/shiroe
本系列文章为笔者整理原创,只发表在博客园上,欢迎分享本文链接,如需转载,请注明出处!