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<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拖到场景中运行游戏,就可以看到模型切换的效果了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值