UE4学习记录:资源加载(一) ——DataAsset使用

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 WealthGroup;

	UPROPERTY(EditAnywhere)
		TArray WealthTextures;

};

FWealthNode:单个资源需要的数据结构

FStringAssetReference :是对资源(Asset)的“软”引用,这个结构在BP中使用起来就像是UObject指针一样

创建继承UWealthData 的蓝图

UE4学习记录:资源加载(一) ——DataAsset使用_第1张图片

UE4学习记录:资源加载(一) ——DataAsset使用_第2张图片

UE4学习记录:资源加载(一) ——DataAsset使用_第3张图片

双击WealthData_BP打开蓝图

UE4学习记录:资源加载(一) ——DataAsset使用_第4张图片

然后可以在这里填充数据,我们现在添加几个看看

UE4学习记录:资源加载(一) ——DataAsset使用_第5张图片

这样就把资源的引用添加进去了,之后可以在代码中拿到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(TEXT("RootScene"));

	WorkMesh = CreateDefaultSubobject(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(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

UE4学习记录:资源加载(一) ——DataAsset使用_第6张图片

然后将WelathActor_BP拖到场景中运行游戏,就可以看到模型切换的效果了。

你可能感兴趣的:(UE4)