跳至主要內容

ED06.Config|属性持久化

Mr.Si大约 3 分钟u++

温故

头像
前面我们花了大量篇章介绍了:

1️⃣ 用 AssetDefinitionDefault注册我们的资产。

2️⃣ 用 ToolMenus扩展编辑器的菜单和工具栏。

3️⃣ 用 FSlateStyleSet自定义了一些图标。

属性持久化

头像

先不说之前的了!我用了EditorUtilityWidget后,我每次打开都要重新配置内容啊!

头像

EditorUtilityWidget本质上是一个编辑器维护的UUserWidget,你可以理解成编辑器模式下打开了一个UI界面。

头像

可当我用一些类似State Tree等编辑他的细节面板,下次打开并不会重置数据呀!不是所有属性都能写死在默认值里的呀!

Config

头像
怎么不可以,其实你可以直接用Config配置一些属性持久化的
头像

使用时需要在UClass以及对应的UProperty中标记Config

Config|类内方法

① 声明类时加上 config=XXX

UCLASS(Config=Game)
class UMyGameSettings : public UObject
{
	GENERATED_BODY()

public:
	UPROPERTY(Config, EditAnywhere, Category="Game")
	int32 DifficultyLevel;

	void ChangeSetting(int32 NewValue)
	{
		DifficultyLevel = NewValue;
		SaveConfig(); // 自动写入到 Game.ini
	}
};

② 默认保存位置

头像
这里的Config 保存名是可以自定义的,他默认也提供了4个常见的保存名(保存文件位置)
DefaultEditor.ini
DefaultEngine.ini
DefaultGame.ini
DefaultInput.ini

③自定义位置

头像
当然这里写上自定义的名字也可以,只不过它会被保存到其他目录里。

Config|类内限制

头像
好麻烦啊!不支持一些复杂的数据结构啊,比如对象、TMap。无法创建多个实例配置,只支持“类默认对象”(CDO)配置
头像

而且还用手动调用 SaveConfig 也太麻烦了!即便我可以用PostEditChangeProperty自动保存,他的限制实在太多了!


Config|类外方法

头像

你可以改用 UDeveloperSettings UDeveloperSettings直通车

DataAsset

头像
这个方法看起来不错!但总感觉怪怪的,我就不能像DataAsset那样编辑中修改后自动存为默认值啊。比如这样:
UCLASS(BlueprintType)
class UMyGameConfig : public UObject
{
    GENERATED_BODY()

public:
    UPROPERTY(EditAnywhere, Category = "Game Settings")
    float MaxHealth = 100.f;

};
头像

然后,编辑器里创建对应的BP改属性,下次打开编辑器, 这些数据就还在。 不需要写什么保存逻辑!

  • MaxHealth = 200
头像
没错啊!没毛病老铁!
头像

关键是这样写没法用按钮 这种 视觉组件去执行函数了!而且为什么他会被持久化?


Editor in Default

头像

因为编辑的是类的默认对象(Class Default Object,简称 CDO)或某个 UObject 的资产默认状态, 是基于构造时的值,不是运行时的动态实例。

头像

那咋整我总不能 所有逻辑都用bool + PostEditChangeProperty 吧!

Editor Toolkit |引

头像

SO!看起来我们急需要一种方法,他能像UDataAsset那样持久化属性,也能像UserWidget那样加入自定义的按钮、图片等等。