vault backup: 2024-10-12 17:19:45

This commit is contained in:
2024-10-12 17:19:46 +08:00
parent ff94ddca61
commit 244c0c52f6
960 changed files with 31348 additions and 10 deletions

View File

@@ -0,0 +1,72 @@
# ConfigHierarchyEditable
- **功能描述:** 使得一个属性可以在Config的各个层级配置。
- **使用位置:** UPROPERTY
- **引擎模块:** Config
- **元数据类型:** bool
- **常用程度:** ★★★
使得一个属性可以在Config的各个层级配置。
- 所谓Config的层级指的是BaseProjectDefaultEnginePlatformProjectPlatform这些逐级被更高优先级的覆盖。这部分知识大家可以参考网上其他的config详解文章。
- 一般的带有Config的属性其配置值只存在于UCLASS上的config标识符指定的config文件中。但如果该属性加上ConfigHierarchyEditable这个标记就允许它在各个层级都可以进行不同的配置。这种属性一般是有根据不同平台而要配置不同的值的需求比如一些平台相关的性能参数等。
## 测试例子:
```cpp
UCLASS(config = InsiderSettings, defaultconfig)
class UMyProperty_InsiderSettings :public UDeveloperSettings
{
GENERATED_BODY()
public:
UPROPERTY(Config, EditAnywhere, BlueprintReadWrite, Category = ConfigHierarchy)
FString MyString;
UPROPERTY(Config, EditAnywhere, BlueprintReadWrite, Category = ConfigHierarchy, meta = (ConfigHierarchyEditable))
FString MyString_ConfigHierarchyEditable;
};
```
## 测试效果:
可以见到MyString_ConfigHierarchyEditable输入框的右边出现了个层级按钮可打开一个专门的ConfigEditor方便你分别在不同的平台和不同的层级配置不同的值。
![Untitled](Untitled.png)
## 源码例子:
```cpp
UCLASS(config = Game, defaultconfig)
class COMMONUI_API UCommonUISettings : public UObject
{
/** The set of traits defined per-platform (e.g., the default input mode, whether or not you can exit the application, etc...) */
UPROPERTY(config, EditAnywhere, Category = "Visibility", meta=(Categories="Platform.Trait", ConfigHierarchyEditable))
TArray<FGameplayTag> PlatformTraits;
}
```
## 原理:
逻辑很简单就是在细节面板生成ValueWidget的时候根据ConfigHierarchyEditable配置额外再生成一个层级配置按钮。
```cpp
void FDetailPropertyRow::MakeValueWidget( FDetailWidgetRow& Row, const TSharedPtr<FDetailWidgetRow> InCustomRow, bool bAddWidgetDecoration ) const
{
// Don't add config hierarchy to container children, can't edit child properties at the hiearchy's per file level
TSharedPtr<IPropertyHandle> ParentHandle = PropertyHandle->GetParentHandle();
bool bIsChildProperty = ParentHandle && (ParentHandle->AsArray() || ParentHandle->AsMap() || ParentHandle->AsSet());
if (!bIsChildProperty && PropertyHandle->HasMetaData(TEXT("ConfigHierarchyEditable")))
{
ValueWidget->AddSlot()
.AutoWidth()
.VAlign(VAlign_Center)
.HAlign(HAlign_Left)
.Padding(4.0f, 0.0f, 4.0f, 0.0f)
[
PropertyCustomizationHelpers::MakeEditConfigHierarchyButton(FSimpleDelegate::CreateSP(PropertyEditor.ToSharedRef(), &FPropertyEditor::EditConfigHierarchy))
];
}
}
```

Binary file not shown.

After

Width:  |  Height:  |  Size: 297 KiB

View File

@@ -0,0 +1,38 @@
# ConfigRestartRequired
- **功能描述:** 使属性在设置里改变后弹出重启编辑器的对话框。
- **使用位置:** UPROPERTY
- **引擎模块:** Config
- **元数据类型:** bool
- **常用程度:** ★★★
使属性在设置里改变后弹出重启编辑器的对话框。
自然的,一般是用于真的需要重启编辑器的设置。
## 测试代码:
```cpp
public:
UPROPERTY(Config, EditAnywhere, BlueprintReadWrite, Category = ConfigRestartRequired, meta = (ConfigRestartRequired="true"))
FString MyString_ConfigRestartRequired;
```
## 测试效果:
![Untitled](Untitled.png)
## 原理:
在SSettingsEditor生效可见得是在UI窗口发生改变。然后弹出对话框。
```cpp
void SSettingsEditor::NotifyPostChange( const FPropertyChangedEvent& PropertyChangedEvent, class FEditPropertyChain* PropertyThatChanged )
{
static const FName ConfigRestartRequiredKey = "ConfigRestartRequired";
if (PropertyChangedEvent.Property->GetBoolMetaData(ConfigRestartRequiredKey) || PropertyChangedEvent.MemberProperty->GetBoolMetaData(ConfigRestartRequiredKey))
{
OnApplicationRestartRequiredDelegate.ExecuteIfBound();
}
}
```

Binary file not shown.

After

Width:  |  Height:  |  Size: 140 KiB

View File

@@ -0,0 +1,83 @@
# 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中更改值就会报错。
![Untitled](Untitled.png)
## 原理:
具体的值同步逻辑可见以下两个函数就知道了无非是根据名字去寻找相应的ConsoleVariable 然后get/set值。
```cpp
void UDeveloperSettings::ImportConsoleVariableValues()
{}
void UDeveloperSettings::ExportValuesToConsoleVariables(FProperty* PropertyThatChanged)
{}
```

Binary file not shown.

After

Width:  |  Height:  |  Size: 233 KiB

View File

@@ -0,0 +1,15 @@
# EditorConfig
- **功能描述:** 保存编辑器的配置
- **使用位置:** UCLASS
- **引擎模块:** Config
- **元数据类型:** string="abc"
- **关联项:**
UCLASS[EditorConfig](../../Specifier/UCLASS/Config/EditorConfig/EditorConfig.md)
- **常用程度:** ★★★