【UE4】加载资源的方式(四)使用DataAsset引用然后加载
参考资料&原文链接
DataAsset
包含一个简单资源数据的基类。如果您继承了这个类,编辑器将在content browser中列出它。这个相当于Unity Asset文件,可以用来存储数据。
它里面只有一个TSubclassOf:
private:
UPROPERTY(AssetRegistrySearchable)
TSubclassOf<UDataAsset> NativeClass;
TSubclassOf模板允许TClassType以类型安全的方式传递。就是在传递的时候保证类型安全。
使用:
先继承,再往里面写我们感兴趣的数据:
// Fill out your copyright notice in the Description page of Project Settings.
#pragma once
#include "CoreMinimal.h"
#include "Engine/DataAsset.h"
#include "ImageDataAsset.generated.h"
/*
*图片结构体
*/
USTRUCT(BlueprintType)
struct FMyImage
{
GENERATED_BODY()
public:
UPROPERTY(EditAnywhere, BlueprintReadWrite)
FName ImageName;
UPROPERTY(EditAnywhere, BlueprintReadWrite)
FStringAssetReference ImagePath;
};
/**
* 自定义的DataAsset,在Unreal的Content里面右键「Miscellaneous」 - 「DataAsset」,再选择这个类即可创建。
* 创建完成之后可以打开再向里面添加想要的数据。
*/
UCLASS()
class TESTPROJECT_API UImageDataAsset : public UDataAsset
{
GENERATED_BODY()
public:
//注意公开
UPROPERTY(EditAnywhere, BlueprintReadWrite)
TArray<FMyImage> Images;
};
你可以写FStringAssetReference
,也可以写TAssetPtr
,也可以直接写TSoftObjectPtr
。都是一样的,存的都是一个弱引用,后面可以用LoadObject
或者StreamManager
来加载。
然后在UE里面创建,并选择我们自己的类:
可以在里面添加引用:
C++使用:
//.h
public:
UPROPERTY(EditAnywhere,BlueprintReadWrite, Category = "Test")
UImageDataAsset* ImageAssets;
private:
int32 CurCount = 0;
//.cpp
void UWC_TestUI::OnBtnClickCommonBtn_DataAsset()
{
if (ImageAssets)
{
if (ImageAssets->Images.Num() > 0)
{
FString ImgSAR = ImageAssets->Images[CurCount].ImagePath.ToString();
Img_DataAsset->SetBrushFromTexture(LoadObject<UTexture2D>(nullptr,*ImgSAR));
if (CurCount >= ImageAssets->Images.Num() - 1)
{
CurCount = 0;
}
else {
CurCount++;
}
}
}
}
不要忘了选好:
特点
此方式的特点是:
- 需要手动定义DataAsset的数据结构,并且要手动添加需要的数据的引用,稍显麻烦。
- 不过手动定义数据结构的话灵活性极大,并且可以定义多种不同的数据。
- 这种方式似乎类似于用DataTable数据驱动开发,就像一个配置表一样。DataTable也需要自定义数据类型。
- 一个DataAsset可以给很多个蓝图使用,只需要使用UPROPOERTY宏。
- DataAsset只是存储引用,并不是真正的加载数据,加载数据是用的其他方法。
本文标签
游戏开发
、游戏开发基础
、Unreal Engine
、UE资源加载
。