73 lines
2.4 KiB
Markdown
Raw Normal View History

2024-10-12 17:19:46 +08:00
# PerObjectConfig
- **功能描述:** 在已经有config配置文件名字的情况下指定应该按每个对象实例来存储值而不是一个类一个存储值。
- **引擎模块:** Config
- **元数据类型:** bool
- **作用机制:** 在ClassFlags中增加[CLASS_PerObjectConfig](../../../Flags/EClassFlags/CLASS_PerObjectConfig.md)
- **关联项:** [Config](Config.md)
- **常用程度:★★★★★**
在已经有config配置文件名字的情况下指定应该按每个对象实例来存储值而不是一个类一个存储值。
- 此类的配置信息将按对象存储,在.ini文件中每个对象都有一个分段根据对象命名格式为[ObjectName ClassName]。
- 此说明符会传播到子类。指定该配置是对每个对象都单独保存。
## 示例代码:
注意ObjectName必须一致
```cpp
UCLASS(Config = Game,PerObjectConfig)
class INSIDER_API UMyClass_PerObjectConfig :public UObject
{
GENERATED_BODY()
public:
UPROPERTY(EditAnywhere, BlueprintReadWrite)
int32 MyProperty = 123;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Config)
int32 MyPropertyWithConfig = 123;
};
void UMyClass_Config_Test::TestPerObjectConfigSave()
{
UMyClass_PerObjectConfig* testObject1 = NewObject<UMyClass_PerObjectConfig>(GetTransientPackage(), TEXT("testObject1"));
testObject1->MyPropertyWithConfig = 456;
testObject1->SaveConfig();
UMyClass_PerObjectConfig* testObject2 = NewObject<UMyClass_PerObjectConfig>(GetTransientPackage(), TEXT("testObject2"));
testObject2->MyPropertyWithConfig = 789;
testObject2->SaveConfig();
}
void UMyClass_Config_Test::TestPerObjectConfigLoad()
{
UMyClass_PerObjectConfig* testObject1 = NewObject<UMyClass_PerObjectConfig>(GetTransientPackage(), TEXT("testObject1"));
//testObject1->LoadConfig(); //不需要显式调用LoadConfig
UMyClass_PerObjectConfig* testObject2 = NewObject<UMyClass_PerObjectConfig>(GetTransientPackage(), TEXT("testObject2"));
//testObject2->LoadConfig();
}
//\Saved\Config\WindowsEditor\Game.ini
[testObject1 MyClass_PerObjectConfig]
MyPropertyWithConfig=456
[testObject2 MyClass_PerObjectConfig]
MyPropertyWithConfig=789
```
## 原理:
对象构造的末期会尝试去读取配置。
```cpp
void FObjectInitializer::PostConstructInit()
{
//在NewObject构造中后面会调用
if (bIsCDO || Class->HasAnyClassFlags(CLASS_PerObjectConfig))
{
Obj->LoadConfig(NULL, NULL, bIsCDO ? UE::LCPF_ReadParentSections : UE::LCPF_None);
}
}
```