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(); }