TSoftObjectPtr和TSoftClassPtr

模板类帮助我们在进行资源操作时增加了类型安全检查,我们可以在细节面板中根据给定的模版类型拾取对应的资源,以获得更加高效的操作!

同样的,TSoftObjectPtr和TSoftClassPtr也分为同步加载与异步加载!针对资源拾取类别不同,使用需要注意!

1
2
3
4
UPROPERTY(EditAnywhere)
TSoftObjectPtr<class UStaticMesh> SoftMesh;
UPROPERTY(EditAnywhere)
TSoftClassPtr<class ATestActor> SoftTestActor;

TSoftObjectPtr:

同步加载
头文件:

1
2
3
4
5
UPROPERTY(EditAnywhere)
TSoftObjectPtr<class UStaticMesh> SoftMesh;
// 构建为栈对象,需要引入头文件,不要构建为堆对象
// #include "Engine/StreamableManager.h"
FStreamableManager m_Streamable;

cpp文件:

1
2
3
4
5
6
7
8
// 可以转换为FSoftObjectPath对象
SoftMesh.ToSoftObjectPath();
// 同步加载
UObject* Source = m_Streamable.LoadSynchronous(SoftMesh);
UStaticMesh* Mesh = Cast<UStaticMesh>(Source);
if (Mesh) {
UKismetSystemLibrary::PrintString(this, TEXT("加载成功!"));
}

异步加载

头文件:添加一个回调函数

1
2
// 异步加载回调函数
void LoadSourceCallback();

cpp文件:需要在初始化函数中绑定回调函数,然后实现回调函数

1
2
// 异步加载
m_Streamable.RequestAsyncLoad(SoftMesh.ToSoftObjectPath(), FStreamableDelegate::CreateUObject(this, &UTestGameInstance::LoadSourceCallback));

回调函数实现:

1
2
3
4
5
6
void UTestGameInstance::LoadSourceCallback() {
// 此函数调用,则表明异步加载完成
if (SoftMesh.Get()) {
UKismetSystemLibrary::PrintString(this, TEXT("加载成功!"));
}
}

TSoftClassPtr

同步加载

头文件:

1
2
3
4
5
UPROPERTY(EditAnywhere)
TSoftClassPtr<class ATestActor> SoftTestActor;
// 构建为栈对象,需要引入头文件,不要构建为堆对象
// #include "Engine/StreamableManager.h"
FStreamableManager m_Streamable;

cpp文件

1
2
3
4
5
// 同步加载
TSubclassOf<ATestActor> TestActorClass = m_Streamable.LoadSynchronous(SoftTestActor);
if (TestActorClass) {
GetWorld()->SpawnActor<ATestActor>(TestActorClass);
}

异步加载

头文件:同TSoftClassPtr需要添加回调函数

cpp文件

1
2
// 异步加载
m_Streamable.RequestAsyncLoad(SoftTestActor.ToSoftObjectPath(), FStreamableDelegate::CreateUObject(this, &UTestGameInstance::LoadSourceCallback));

回调函数实现

1
2
3
4
5
6
7
void UTestGameInstance::LoadSourceCallback() {
// 此函数调用,则表明异步加载完成
UClass* TestActorClass = SoftTestActor.Get();
if (TestActorClass) {
GetWorld()->SpawnActor<ATestActor>(TestActorClass);
}
}