UEC++ 资源加载(四)模板资源拾取类

TSoftObjectPtr和TSoftClassPtr

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

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

    UPROPERTY(EditAnywhere)
        TSoftObjectPtr<class UStaticMesh> SoftMesh;
    UPROPERTY(EditAnywhere)
        TSoftClassPtr<class ATestActor> SoftTestActor;

TSoftObjectPtr:

 同步加载
头文件:
    UPROPERTY(EditAnywhere)
        TSoftObjectPtr<class UStaticMesh> SoftMesh;
    // 构建为栈对象,需要引入头文件,不要构建为堆对象
    // #include "Engine/StreamableManager.h"
    FStreamableManager m_Streamable;

cpp文件:

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

异步加载

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

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

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

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

回调函数实现:

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

TSoftClassPtr

同步加载

头文件:

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

cpp文件

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

异步加载

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

cpp文件

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

回调函数实现

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

 

posted @ 2022-09-21 15:47  黎沐不吃香菜  阅读(410)  评论(0编辑  收藏  举报