84 lines
2.9 KiB
Markdown
84 lines
2.9 KiB
Markdown
|
# ConsoleVariable
|
|||
|
|
|||
|
- **功能描述:** 把一个Conifg属性的值同步到一个同名的控制台变量。
|
|||
|
- **使用位置:** UPROPERTY
|
|||
|
- **引擎模块:** Config
|
|||
|
- **元数据类型:** string="abc"
|
|||
|
- **常用程度:** ★★★★★
|
|||
|
|
|||
|
把一个Conifg属性的值同步到一个同名的控制台变量。
|
|||
|
|
|||
|
- Config值往往也确实需要在控制台(按~)中更改,这种需求挺常见的,因此就有了这个标记。典型的例子是源码中的URendererSettings有相匹配的一系列“r.”开头的控制变量。
|
|||
|
- Config文件中的值也会变成这个ConsoleVariable 的名字(一般形如 r.XXX.XX之类的格式),而不是属性名。
|
|||
|
- 但单单加上这个标记是不够的,这个控制台变量是不会被自动创建出来的。因此需要自己再用代码创建,用类似TAutoConsoleVariable这种注册同名的控制台变量。
|
|||
|
- 有了控制台变量之后,也需要专门的代码来对二者的值进行同步。见下述测试代码ImportConsoleVariableValues和ExportValuesToConsoleVariables的调用。
|
|||
|
- 另外要格外注意,ConsoleVariable 的设置是有优先级的。Console的优先级比ProjectSettings高,因此如果在Console中改变后再尝试在ProjectSettings中更改值,就会报错。
|
|||
|
|
|||
|
## 测试代码:
|
|||
|
|
|||
|
```cpp
|
|||
|
UCLASS(config = InsiderSettings, defaultconfig)
|
|||
|
class UMyProperty_InsiderSettings :public UDeveloperSettings
|
|||
|
{
|
|||
|
GENERATED_BODY()
|
|||
|
public:
|
|||
|
UPROPERTY(Config, EditAnywhere, BlueprintReadWrite, Category = Console, meta = (ConsoleVariable = "i.Insider.MyStringConsole"))
|
|||
|
FString MyString_ConsoleVariable;
|
|||
|
public:
|
|||
|
virtual void PostInitProperties() override;
|
|||
|
#if WITH_EDITOR
|
|||
|
virtual void PostEditChangeProperty(FPropertyChangedEvent& PropertyChangedEvent) override;
|
|||
|
#endif
|
|||
|
};
|
|||
|
|
|||
|
//.cpp
|
|||
|
static TAutoConsoleVariable<FString> CVarInsiderMyStringConsole(
|
|||
|
TEXT("i.Insider.MyStringConsole"),
|
|||
|
TEXT("Hello"),
|
|||
|
TEXT("Insider test config to set MyString."));
|
|||
|
|
|||
|
void UMyProperty_InsiderSettings::PostInitProperties()
|
|||
|
{
|
|||
|
Super::PostInitProperties();
|
|||
|
|
|||
|
#if WITH_EDITOR
|
|||
|
if (IsTemplate())
|
|||
|
{
|
|||
|
ImportConsoleVariableValues();
|
|||
|
}
|
|||
|
#endif // #if WITH_EDITOR
|
|||
|
}
|
|||
|
|
|||
|
#if WITH_EDITOR
|
|||
|
void UMyProperty_InsiderSettings::PostEditChangeProperty(FPropertyChangedEvent& PropertyChangedEvent)
|
|||
|
{
|
|||
|
Super::PostEditChangeProperty(PropertyChangedEvent);
|
|||
|
|
|||
|
if (PropertyChangedEvent.Property)
|
|||
|
{
|
|||
|
ExportValuesToConsoleVariables(PropertyChangedEvent.Property);
|
|||
|
}
|
|||
|
}
|
|||
|
#endif // #if WITH_EDITOR
|
|||
|
```
|
|||
|
|
|||
|
## 测试结果:
|
|||
|
|
|||
|
可见一开始的时候控制台和配置文件的值都是和ProjectSettings中的值同步。
|
|||
|
|
|||
|
如果在Console中改变后再尝试在ProjectSettings中更改值,就会报错。
|
|||
|
|
|||
|

|
|||
|
|
|||
|
## 原理:
|
|||
|
|
|||
|
具体的值同步逻辑可见以下两个函数就知道了,无非是根据名字去寻找相应的ConsoleVariable 然后get/set值。
|
|||
|
|
|||
|
```cpp
|
|||
|
void UDeveloperSettings::ImportConsoleVariableValues()
|
|||
|
{}
|
|||
|
|
|||
|
void UDeveloperSettings::ExportValuesToConsoleVariables(FProperty* PropertyThatChanged)
|
|||
|
{}
|
|||
|
```
|