UnrealEngine創建自定義資產類型
- 2022 年 4 月 16 日
- 筆記
- UE4, UnrealEngine, UnrealEngine4
導語
這篇文章記錄了將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欄位的值。