【UE4】异步加载关卡 LoadingScreen ( 蓝图和C++ )

66 篇文章 5 订阅
  • 一般先跳转到一个临时的关卡,然后异步加载目标关卡,同时展示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 获取加载进度

参考部分代码

参考

  • 4
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
UE4中,异步加载关卡可以使用场景流送机制。场景流送机制是一种将场景分为多个部分并按需加载的技术,可以提高游戏中的性能和效率。 在使用场景流送机制时,需要将场景分为多个Level,每个Level都是一个独立的场景,可以单独进行加载和卸载。在游戏运行时,可以使用Level Streaming Volume将场景分为多个区域,并根据玩家的位置动态地加载和卸载Level。 Level Streaming Volume是一种特殊的Volume,可以在场景中创建。它用于将场景分为多个区域,并在不同的区域之间进行场景的流送。 在使用Level Streaming Volume时,需要先创建一个Streaming Level,在Streaming Level中添加需要加载的Level,然后将Streaming Level添加到Level Streaming Volume中。当玩家进入Level Streaming Volume所在的区域时,相应的Streaming Level就会被加载,当玩家离开区域时,Streaming Level就会被卸载。 在代码中,可以使用以下函数来加载和卸载Level: ``` ULevelStreaming* UGameplayStatics::LoadStreamLevel( UObject* WorldContextObject, const FName& LevelName, bool bMakeVisibleAfterLoad, bool bShouldBlockOnLoad ); void UGameplayStatics::UnloadStreamLevel( UObject* WorldContextObject, const FName& LevelName, bool bShouldBlockOnUnload ); ``` 在加载Level时,可以选择是否在加载完成后立即显示Level,是否在加载过程中阻塞游戏等待加载完成。在卸载Level时,可以选择是否在卸载完成后立即终止游戏等待卸载完成。 使用场景流送机制可以提高游戏的性能和效率,并可以实现异步加载关卡的功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值