2.7 KiB
Raw Blame History

DefaultConfig

  • 功能描述: 指定保存到的配置文件层级是Project/Config/DefaultXXX.ini。
  • 引擎模块: Config
  • 元数据类型: bool
  • 作用机制: 在ClassFlags中增加CLASS_DefaultConfig
  • 关联项: Config
  • 常用程度:★★★

指定保存到的配置文件层级是Project/Config/DefaultXXX.ini。

  • 而不是默认的Saved/XXX.ini
  • 一般用在编辑器里把Settings自动保存到Project/Config/DefaultXXX.ini里去

示例代码:

UCLASS(Config = MyGame,DefaultConfig)
class INSIDER_API UMyClass_DefaultConfig :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("MyGame"); }
	/** The unique name for your section of settings, uses the class's FName. */
	virtual FName GetSectionName() const override { return TEXT("MyGame"); }
public:
	UPROPERTY(EditAnywhere, BlueprintReadWrite, Config)
		int32 MyPropertyWithConfig = 123;
};

//保存的结果:
//Config/DefaultMyGame.ini
[/Script/Insider.MyClass_DefaultConfig]
MyPropertyWithConfig=888

示例结果:

Untitled

原理:

代码里要使用Settings->TryUpdateDefaultConfigFile();但发现TryUpdateDefaultConfigFile不管有没有DefaultConfig都可以调用都可以保存到Default里。因此应该调用哪个SaveConfigTryUpdateDefaultConfigFileUpdateGlobalUserConfigFileUpdateProjectUserConfigFile是可以手动指定的。

但是在编辑器里编辑的时候则可以通过写好的代码来处理好逻辑。如SSettingsEditor.cpp里NotifyPostChange中调用Section->Save();则可以在内部再调用如下代码:

bool FSettingsSection::Save()
{
	if (ModifiedDelegate.IsBound() && !ModifiedDelegate.Execute())
	{
		return false;
	}

	if (SaveDelegate.IsBound())
	{
		return SaveDelegate.Execute();
	}

	//更新到正确的文件里
	if (SettingsObject.IsValid())
	{
		if (SettingsObject->GetClass()->HasAnyClassFlags(CLASS_DefaultConfig))
		{
			SettingsObject->TryUpdateDefaultConfigFile();
		}
		else if (SettingsObject->GetClass()->HasAnyClassFlags(CLASS_GlobalUserConfig))
		{
			SettingsObject->UpdateGlobalUserConfigFile();
		}
		else if (SettingsObject->GetClass()->HasAnyClassFlags(CLASS_ProjectUserConfig))
		{
			SettingsObject->UpdateProjectUserConfigFile();
		}
		else
		{
			SettingsObject->SaveConfig();
		}

		return true;
	}

	return false;
}