DataAsset:包含一个简单资源数据的基类。如果您继承了这个类,编辑器将在content browser中列出它。这个相当于Unity Asset文件,可以用来存储数据。
在UE4中一般DataAsset会和资源加载配合使用,接下来记录下DataAsset的使用,视频教程可以看迪迪教程第二期资源加载
创建继承DataAsset的类
.h文件
USTRUCT()
struct FWealthNode
{
GENERATED_BODY()
public:
UPROPERTY(EditAnywhere)
FName WeathName;
UPROPERTY(EditAnywhere)
FStringAssetReference WealthPath;
};
UCLASS()
class FRAMECOURSE_API UWealthData : public UDataAsset
{
GENERATED_BODY()
public:
UPROPERTY(EditAnywhere)
TArray<FWealthNode> WealthGroup;
UPROPERTY(EditAnywhere)
TArray<UTexture2D*> WealthTextures;
};
FWealthNode:单个资源需要的数据结构
FStringAssetReference :是对资源(Asset)的“软”引用,这个结构在BP中使用起来就像是UObject指针一样
创建继承UWealthData 的蓝图
双击WealthData_BP打开蓝图
然后可以在这里填充数据,我们现在添加几个看看
这样就把资源的引用添加进去了,之后可以在代码中拿到WealthData的引用去里面直接取数据使用。
读取WealthData数据
首先我们现在要是用WealthData的类里申明定义一个WealthData的变量,并让这个变量在蓝图中可编辑
AWelathActor .h
class FRAMECOURSE_API AWelathActor : public AActor
{
GENERATED_BODY()
public:
// Sets default values for this actor's properties
AWelathActor();
public:
UPROPERTY(EditAnywhere)
UStaticMeshComponent* WorkMesh;
UPROPERTY(EditAnywhere)
UWealthData* WealthData;
FTimerHandle UpdateTextureHandle;
int MeshIndex;
protected:
// Called when the game starts or when spawned
virtual void BeginPlay() override;
void WealthState();
void UpdateMesh();
public:
// Called every frame
virtual void Tick(float DeltaTime) override;
};
AWelathActor .cpp
#include "WelathActor.h"
#include "Components/SceneComponent.h"
#include "FWCommon.h"
#include "TimerManager.h"
#include "Engine/ObjectLibrary.h"
#include "WealthWidget.h"
#include "HandleWidget.h"
#include "Engine/StreamableManager.h"
// Sets default values
AWelathActor::AWelathActor()
{
// Set this actor to call Tick() every frame. You can turn this off to improve performance if you don't need it.
PrimaryActorTick.bCanEverTick = true;
RootComponent = CreateDefaultSubobject<USceneComponent>(TEXT("RootScene"));
WorkMesh = CreateDefaultSubobject<UStaticMeshComponent>(TEXT("WorkMesh"));
//将workMesh放到RootComponent节点下;
WorkMesh->SetupAttachment(RootComponent);
}
// Called when the game starts or when spawned
void AWelathActor::BeginPlay()
{
Super::BeginPlay();
FTimerDelegate UpdateMeshDele = FTimerDelegate::CreateUObject(this, &AWelathActor::UpdateMesh);
GetWorld()->GetTimerManager().SetTimer(UpdateMeshHandle, UpdateMeshDele, 1.f, true);
}
void AWelathActor::UpdateMesh()
{
if (WealthData && WealthData->WealthGroup.Num()>0)
{
UStaticMesh* FactMesh = LoadObject<UStaticMesh>(NULL, *WealthData->WealthGroup[MeshIndex].WealthPath.ToString());
WorkMesh->SetStaticMesh(FactMesh);
MeshIndex = (MeshIndex + 1) >= WealthData->WealthGroup.Num() ? 0 : (MeshIndex + 1);
}
}
// Called every frame
void AWelathActor::Tick(float DeltaTime)
{
Super::Tick(DeltaTime);
}
然后创建继承AwelathActor类的蓝图,将WealthData引用赋值给actor的成员变量WealthData
然后将WelathActor_BP拖到场景中运行游戏,就可以看到模型切换的效果了。