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 在蓝图的细节面板中指定