- 一般先跳轉到一個臨時的關卡,然后異步加載目標關卡,同時展示Loading界面
- 對於含有流關卡的目標關卡,可以先載入子關卡
藍圖異步加載
- 無進度條
C++ 異步加載關卡
LoadPackageAsync
bool bIsLoaded;
UPROPERTY()
FString LoadPackagePath;
// 用於加載完成的回調
DECLARE_DYNAMIC_DELEGATE(FOnAsyncLoadFinished);
UFUNCTION(BlueprintCallable)
void MyAsyncLoad(const FOnAsyncLoadFinished& OnAsyncLoadFinished);
UFUNCTION(BlueprintCallable)
float GetLoadProgress();
//開始異步加載
void ALoadActor::MyAsyncLoad(const FOnAsyncLoadFinished& OnAsyncLoadFinished)
{
//不使用GetBaseFilename,編譯 error C4458: LoadPackageAsync failed to begin to load a package···
LoadPackagePath = FPaths::GetBaseFilename(LoadPackageSoftObjectPath.ToString(), false);
bIsLoaded = false;
UE_LOG(LogTemp, Warning, TEXT("String: %s"), *LoadPackagePath);
LoadPackageAsync(
LoadPackagePath,
FLoadPackageAsyncDelegate::CreateLambda([=](const FName& PackageName, UPackage* LoadedPackage, EAsyncLoadingResult::Type Result)
{
if (Result == EAsyncLoadingResult::Failed)
{
UE_LOG(LogTemp, Warning, TEXT("Load Failed"));
}
else if (Result == EAsyncLoadingResult::Succeeded)
{
bIsLoaded = true;
UE_LOG(LogTemp, Warning, TEXT("Load Succeeded"));
OnAsyncLoadFinished.ExecuteIfBound();
}
}), 0, PKG_ContainsMap);
}
//獲取加載的進度 -1 —— 100
float ALoadActor::GetLoadProgress()
{
float FloatPercentage = GetAsyncLoadPercentage(*LoadPackagePath);
if (!bIsLoaded)
{
FString ResultStr = FString::Printf(TEXT("Percentage: %f"), FloatPercentage);
GEngine->AddOnScreenDebugMessage(-1, 2.0f, FColor::Green, ResultStr);
UE_LOG(LogTemp, Warning, TEXT("Percentage: %f"), FloatPercentage);
}
else {
FloatPercentage = 100;
}
return FloatPercentage;
}
效果
FStreamableManager
- 獲取依賴項
- 將依賴項轉為
FSoftObjectPath
存儲到容器中 - 使用
RequestAsyncLoad
加載 - 使用
GetLoadCount
獲取加載進度
參考部分代碼