【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());
    	}
    }
    
  • 編輯器創建和使用

    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

參考


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM