【UE4 C++】 UDataAsset、UPrimaryDataAsset 的简单使用

UDataAsset 简介

  • 用来存储数据,每一个DataAsset 都是一份数据
  • 可以派生,系统自带派生 UPrimaryDataAsset 方便数据对象的加载和释放
  • 可以引用其他的 UDataAsset
  • 可以存储UObject 实例
  • 可以BulkEdiit 批量编辑多个 UDataAsset
  • 灵活配置数据,但不好管理大量的配置对象
  • 方便配置树状组织数据,全局配置,数据对象集合

UDataAsset 简单使用

  • 如果是单例的全局配置,可配置 static 方法来获取数据

  • 可以配置普通数据、结构体、其他 UDataAsset 等

  • 可以配置 资源软引用 用于加载

  • 自定义 UDataAsset 派生类代码

    USTRUCT(BlueprintType, Blueprintable)
    struct FAttackInfo :public FTableRowBase
    {
    	GENERATED_BODY()
    
    	UPROPERTY(EditAnywhere, BlueprintReadWrite)
    		FString Name ;
    
    	UPROPERTY(EditAnywhere, BlueprintReadWrite)
    		float Damage;
    
    	UPROPERTY(EditAnywhere, BlueprintReadWrite)
    		UAnimMontage* Montage;
    
    	UPROPERTY(EditAnywhere, BlueprintReadWrite)
    		UParticleSystem* VFX;
    
    	UPROPERTY(EditAnywhere, BlueprintReadWrite)
    		USoundBase* Sound;
    };
    
    class TIPS_API USympleDataAsset : public UDataAsset
    {
    	GENERATED_BODY()
    
    public:
    	UPROPERTY(EditAnywhere, BlueprintReadWrite)
    		FAttackInfo AttackInfo;
    
    	//UFUNCTION(BlueprintPure, meta = (DisplayName = "SympleDataAsset"))
    		//static USympleDataAsset* Get();
    };
    
  • 调用数据

    void ADataDriveActor::UseDataAsset(USympleDataAsset* SympleDataAsset)
    {
    	if (SympleDataAsset)
    	{
    		const FAttackInfo& AttackInfo = SympleDataAsset->AttackInfo;
    		UE_LOG(LogTemp, Warning, TEXT(" Name:%sn Damage:%fn Montage:%sn Sound:%sn"),
    			*AttackInfo.Name, AttackInfo.Damage, *AttackInfo.Montage->GetName(), *AttackInfo.Sound->GetName());
    	}
    }
    
  • 编辑器创建和使用

    image

UPrimaryDataAsset 简单使用

  • 将上述代码改为继承 UPrimaryDataAsset 后,可以在蓝图使用

    image

  • 支持动态创建 UPrimaryDataAsset 资源

    void USympleBPFunLib::CreateNewDataAsset(const FString PackagePath, const FString AssetName, const FAttackInfo& AttackInfo)
    {
    	//创建package
    	UPackage* MyPackage = CreatePackage(nullptr, *PackagePath);
    
    	//创建Object
    	USympleDataAsset* SympleDataAsset = NewObject<USympleDataAsset>(MyPackage, USympleDataAsset::StaticClass(), *AssetName, EObjectFlags::RF_Public | RF_Standalone);
    
    	if (!SympleDataAsset)
    	{
    		return;
    	}
    
    	// 初始赋值,必要时可拷贝赋值
    	SympleDataAsset->AttackInfo = AttackInfo;//
    
    	// 创建资源
    	FAssetRegistryModule::AssetCreated(SympleDataAsset);
    
    	// 标记
    	SympleDataAsset->GetOutermost()->MarkPackageDirty();
    }
    

    image

参考

原文链接: https://www.cnblogs.com/shiroe/p/14770421.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍

    【UE4 C++】 UDataAsset、UPrimaryDataAsset 的简单使用

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/210518

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年2月13日 上午12:22
下一篇 2023年2月13日 上午12:23

相关推荐