基础
首先需要自定义一个继承自UObject的类,UCLASS加上config标志
UCLASS(config = MyClass)
class UMyClass: public UObject
将想要和配置文件交互的属性,UFUNCTION加上Config标志
UPROPERTY(Config, EditAnywhere)
float TestP;
之后只要配置文件内存在该配置项,就会自动读取。
在配置文件内的格式为:
[/Script/ProjectName.MyClass]
TestP=1.0
保存
手动保存,会自动保存到ProjectName\Saved\Config\WindowsEditor\MyClass.ini,这里的文件名就是UCLASS内的配置:
SaveConfig(CPF_Config);
GConfig->Flush(false);
或者可以自定义保存路径
FString ConfigPath = FPaths::ProjectConfigDir() / TEXT("MyClass.ini"); // 或者 FPaths::GeneratedConfigDir()
SaveConfig(CPF_Config, *ConfigPath);
GConfig->Flush(false, ConfigPath);
路径分别是:
- ProjectConfigDir:
ProjectName\Config\MyClass.ini
- GeneratedConfigDir:
ProjectName\Saved\Config\MyClass.ini
加载
需要在过程中恢复设置内的配置,需要手动加载
GConfig->Flush(true, ConfigPath);
LoadConfig(UMyClass::StaticClass(), *ConfigPath);
UCLASS(defaultconfig)
在修改项目设置的时候,会生成 / 保存到对应的ini文件,当UCLASS存在defaultconfig时,ini文件将会生成到
ProjectName\Config\Default[config_name].ini
否则,则是生成在
ProjectName\Saved\Config\WindowsEditor\[config_name].ini
UPROPERTY(globalconfig)
在配置文件内的格式为:
[/Script/ProjectName.MyClass]
TestP=1.0
其中[/Script/ProjectName.MyClass]就是Section
蓝图派生类在保存配置时Section会变为蓝图类,如果所有派生类和基类的配置共用,则添加globalconfig,这样子Section就变为基类了
项目内设置
上面的方式,要么需要手动写配置文件,要么需要主动调用SaveConfig,比较不直观。在开发过程中的一些参数,想要方便的调整,可以创建一个类继承自UDeveloperSettings
UCLASS(Config = ConfigFileName, defaultconfig) // 不加defaultconfig会生成到Intermediate\Config\CoalescedSourceConfigs下
class UTestSettings : public UDeveloperSettings
{
GENERATED_UCLASS_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("Project"); }
/** The unique name for your section of settings, uses the class's FName. */
virtual FName GetSectionName() const override { return TEXT("TestSetting"); }
UPROPERTY(Config, EditAnywhere)
float TestP;
void SettingsChanged(UObject* Ref, struct FPropertyChangedEvent& PropertyChangedEvent);
};
UTestSettings::UTestSettings(const FObjectInitializer& ObjectInitializer) : Super(ObjectInitializer)
{
OnSettingChanged().AddUObject(this, &UTestSettings::SettingsChanged);
}
void UTestSettings::SettingsChanged(UObject* Ref, FPropertyChangedEvent& PropertyChangedEvent)
{
if (PropertyChangedEvent.GetPropertyName() == FName(TEXT("TestP")))
{
if (PropertyChangedEvent.ChangeType == EPropertyChangeType::ValueSet)
{
// 修改值的时候做一些维护,然后保存
}
}
}
普通类加到项目内
先在类加上必要设置
UCLASS(config = Game, defaultconfig)
class UMyClass : public UObject
{
GENERATED_BODY()
public:
UPROPERTY(config, EditAnywhere, Category = MyClassSetting)
int32 Setting;
};
然后在模块启动的时候,将此类注册到游戏设置里面
class FMyProjectModule: public IModuleInterface
{
public:
static FMyProjectModule* GameModuleInstance;
virtual void StartupModule() override;
virtual void ShutdownModule() override;
};
#define LOCTEXT_NAMESPACE "MyProject"
FMyProjectModule* FMyProjectModule::GameModuleInstance = nullptr;
void FMyProjectModule::StartupModule()
{
GameModuleInstance = this;
if (ISettingsModule* SettingsModule = FModuleManager::GetModulePtr<ISettingsModule>("Settings"))
{
SettingsModule->RegisterSettings("Project", "Project", "MyClass",
LOCTEXT("MyClassName", "My Class"),
LOCTEXT("MyClassDescription", "Settings for MyClass."),
GetMutableDefault<UMyClass>()
);
}
}
void FMyProjectModule::ShutdownModule()
{
GameModuleInstance = nullptr;
if (ISettingsModule* SettingsModule = FModuleManager::GetModulePtr<ISettingsModule>("Settings"))
{
SettingsModule->UnregisterSettings("Project", "Project", "MyClass");
}
}
#undef LOCTEXT_NAMESPACE
IMPLEMENT_PRIMARY_GAME_MODULE(FMyProjectModule, MyProject, "MyProject");