UnrealEngine創建自定義資產類型

導語

這篇文章記錄了將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欄位的值。