• 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字段的值。

  • 相关阅读:
    双亲委派机制的作用
    Elasticsearch使用——结合MybatisPlus使用ES & es和MySQL数据一致性 & 结合RabbitMQ实现解耦
    em与rem的区别
    20天零基础自学Python | Day8 String字符串
    C++语言学习笔记Day1-C++概述
    Hadoop(一)Hadoop核心架构与安装
    DMPE-PEG-Mal,二肉豆蔻酰磷脂酰乙醇胺-聚乙二醇-马来酰亚胺简述
    一体化污水处理设备在使用中有哪些故障?该如何解决?
    Nginx入门
    2022年Redis最新面试题第4篇 - Redis数据持久化
  • 原文地址:https://www.cnblogs.com/jeferwang/p/16154108.html