導語
這篇文章記錄了將UObject例項儲存在Asset檔案的方法,用這個方法可以將自定義的UObject資料序列化儲存到檔案,可以用於自定義UE資源型別。
建立UObject類
這一步比較簡單,按照正常的方式建立C++類即可。
在這裡我建立一個簡單的UCustomAsset派生自UObject,包含一個Value欄位作為演示。
UCLASS()
class LEARNUI_API UCustomAsset final : public UObject
{
GENERATED_BODY()
public:
UPROPERTY(EditAnywhere, BlueprintReadWrite)
FString Value;
};
建立Asset
這一步是為了在Content視窗中新增右鍵選單,像建立其他Asset一樣快速建立CustomAsset。主要分為兩步,建立對應的Factory和TypeAction類。
建立MyDataFactory
MyDataFactory
中包含了具體的生成UObject例項的實現,我們接下來建立的Asset是由Factory例項化出來的。
UCLASS()
class LEARNUIEDITOR_API UMyDataFactory final : public UFactory
{
GENERATED_BODY()
public:
UMyDataFactory(){
// 指定是否可以通過選單來建立
bCreateNew = true;
// 建立Asset之後是否自動開啟編輯
bEditAfterNew = true;
// 指定支援的型別
SupportedClass = UMyData::StaticClass();
}
// 過載FactoryCreateNew方法,建立UMyData例項
virtual UObject* FactoryCreateNew(UClass* InClass, UObject* InParent, FName InName, EObjectFlags Flags, UObject* Context, FFeedbackContext* Warn) override{
return NewObject<UMyData>(InParent, InName, Flags);
}
};
建立MyDataTypeAction
FMyDataTypeAction
定義了Asset的顯示名稱、型別、顯示顏色和所在分類。
// 至少需要過載以下四個方法
class FMyDataTypeAction final : public FAssetTypeActions_Base
{
public:
virtual FText GetName() const override;
virtual UClass* GetSupportedClass() const override;
virtual FColor GetTypeColor() const override;
virtual uint32 GetCategories() override;
};
以上程式碼中,GetCategories
可以返回引擎中已經註冊的Category,也可以使用以下程式碼註冊自己的Category。
Category = FAssetToolsModule::GetModule().Get().RegisterAdvancedAssetCategory(FName("Custom"), FText::FromString("Custom"));
需要使用FAssetToolsModule
註冊FMyDataTypeAction
以使其生效。
IAssetTools& AssetTool = FAssetToolsModule::GetModule().Get();
// 建立TypeAction例項並儲存起來,方便在合適的時候呼叫UnregisterAssetTypeActions反註冊
AssetTypeActions.Emplace(MakeShared<FMyDataTypeAction>());
for (TSharedPtr<FAssetTypeActions_Base> AssetType : AssetTypeActions)
{
AssetTool.RegisterAssetTypeActions(AssetType.ToSharedRef());
}
效果
在ContentBrowser的Add/Import
選單中,可以看到自定義的MyData型別。
建立完成後,雙擊開啟編輯視窗,可以修改UProperty欄位的值。