UEC++ 资源加载(三)异步加载

异步加载

FStreamableManager

FSreamableManager可以帮助我们构建异步处理逻辑,用来将加载逻辑与游戏主逻辑进行,以达到高效加载资源的目的。建议FSreamableManager创建在全局游戏的单例对象中,结合FSoftObjectPath进行加载。 FSreamableManager支持异步加载的同时也支持同步加载。

FSreamableManager创建:

    // 构建为栈对象,需要引入头文件,不要构建为堆对象
    // #include "Engine/StreamableManager.h"
    FStreamableManager m_treamable;

FSoftObjectPath同步加载:

同步加载与之前使用的TryLoad基本一致

头文件:

    UPROPERTY(EditAnywhere)
        FSoftObjectPath SourcePath;
    // 构建为栈对象,需要引入头文件,不要构建为堆对象
    // #include "Engine/StreamableManager.h"
    FStreamableManager m_treamable;

注意头文件引入头文件需要在 #include "TestGameInstance.generated.h"  头文件上面既 #include "TestGameInstance.generated.h" 必须是最后一个引入的头文件

cpp文件:

    // FSoftObjectPath 通过蓝图的细节面板拾取
    // 借助FStreamableManager配合FSoftObjectPath同步资源
    UObject* Source = m_Streamable.LoadSynchronous(SourcePath);
    //加载完成后转换资产
    UStaticMesh* Mesh = Cast<UStaticMesh>(Source);
    if (Mesh) {
        UKismetSystemLibrary::PrintString(this, TEXT("加载成功!"));
    }

FSoftObjectPath异步加载:

异步加载需要设置回调通知对象与通知函数

在上述同步加载的头文件基础上添加一个回调函数:

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

 然后在初始化函数中,绑定回调函数,我使用的 GameInstance 类 所以这行代码写在 Init 中,一般Actor类,写在BeginPlay 中

    // FSoftObjectPath 通过蓝图的细节面板拾取
    // 借助FStreamableManager配合FSoftObjectPath同步资源
    // 这个操作不会阻塞进程
    m_Streamable.RequestAsyncLoad(SourcePath, FStreamableDelegate::CreateUObject(this, &UTestGameInstance::LoadSourceCallback));

实现回调函数:

void UTestGameInstance::LoadSourceCallback()
{
    // 此函数调用,则表明异步加载完成
    // 加载之后完成转换资产
    UStaticMesh* Mesh = Cast<UStaticMesh>(SourcePath.ResolveObject());
    if (Mesh) {
        UKismetSystemLibrary::PrintString(this, TEXT("加载成功!"));
    }
}

加载的路径同同步加载一样通过 FSoftObjectPath 在蓝图的细节面板中指定

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