【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:%s\n Damage:%f\n Montage:%s\n Sound:%s\n"), *AttackInfo.Name, AttackInfo.Damage, *AttackInfo.Montage->GetName(), *AttackInfo.Sound->GetName()); } }
-
编辑器创建和使用
UPrimaryDataAsset 简单使用
-
将上述代码改为继承 UPrimaryDataAsset 后,可以在蓝图使用
-
支持动态创建 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(); }
参考
作者:砥才人
出处:https://www.cnblogs.com/shiroe
本系列文章为笔者整理原创,只发表在博客园上,欢迎分享本文链接,如需转载,请注明出处!