【UE4】異步加載關卡 LoadingScreen ( 藍圖和C++ )


  • 一般先跳轉到一個臨時的關卡,然后異步加載目標關卡,同時展示Loading界面
  • 對於含有流關卡的目標關卡,可以先載入子關卡

藍圖異步加載

  • 無進度條

image

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;	
}

image

效果

image

FStreamableManager

  • 獲取依賴項
  • 將依賴項轉為 FSoftObjectPath 存儲到容器中
  • 使用 RequestAsyncLoad 加載
  • 使用 GetLoadCount 獲取加載進度

參考部分代碼

image

參考


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM