【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

常见配置文件

  • 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();
    	}
    }
    

    image

  • 测试时,派生蓝图类,section 设为类路径也可以

  • 蓝图中添加的变量也可以使用配置文件,需要勾选 Config Variable,鼠标悬浮会提示,需要自己到对应路径手动添加
    使用时发现只在启动 Editor 生效,package game 模式下不生效。

    image

    [/Game/CPPFunction/DataDrive/BP_ConfigActor.BP_ConfigActor_C]
    ExampleArray=1
    ExampleArray=2
    ExampleArray=20
    ConfigVector=(X=10.000000,Y=20.000000,Z=30.000000)
    

    image

自定义配置文件

  • 创建 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;
    };
    

    image


直接读写配置文件

  • 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
);

参考

posted @ 2021-05-15 13:50  砥才人  阅读(10271)  评论(0编辑  收藏  举报