Unreal使用LoadStreamLevel动态加载Map

为什么不直接用 LoadStreamLevel。主要是希望能像Unity一样,动态的控制Level的加载。而LoadStreamLevel需要添加到

觉得不太灵活。所以,手动的添加到永久性关卡中。

FString ALevelTestGameModeBase::CreateStreamInstance(UWorld* World, const FString& LongPackageName, const FVector Location, const FRotator Rotation)
{
	const FString ShortPackageName = FPackageName::GetShortName(LongPackageName);
	const FString PackagePath = FPackageName::GetLongPackagePath(LongPackageName);
	FString UniqueLevelPackageName = PackagePath + TEXT("/")+ World->StreamingLevelsPrefix + ShortPackageName;
	// Setup streaming level object that will load specified map
	ULevelStreamingDynamic* StreamingLevel = NewObject<ULevelStreamingDynamic>(World, ULevelStreamingDynamic::StaticClass(), NAME_None, RF_Transient, NULL);
	StreamingLevel->SetWorldAssetByPackageName(FName(*UniqueLevelPackageName));
	StreamingLevel->LevelColor = FColor::MakeRandomColor();
	
	StreamingLevel->LevelTransform = FTransform(Rotation, Location);
	// Map to Load
	StreamingLevel->PackageNameToLoad = FName(*LongPackageName);

	World->AddStreamingLevel(StreamingLevel);
	return UniqueLevelPackageName;
}

void ALevelTestGameModeBase::LoadMap(const FString & LevelName)
{
	FString LongPackageName;
	bool bOutSuccess = FPackageName::SearchForPackageOnDisk(LevelName, &LongPackageName);
	if (!bOutSuccess)
	{
		return ;
	}
	UWorld* world = GetWorld();
	FString name = CreateStreamInstance(world, LongPackageName, FVector::ZeroVector, FRotator::ZeroRotator);
	UGameplayStatics::LoadStreamLevel(world, FName(*LevelName), true, true, FLatentActionInfo());
}
void ALevelTestGameModeBase::StartPlay()
{
	LoadMap("StarterMap");
}

核心:World->AddStreamingLevel(StreamingLevel); 调用到StreamingLevels.Add(StreamingLevelToAdd);这样使用UGameplayStatics::LoadStreamLevel就能够异步加载Level,并且能够控制加载完成回调函数。

StreamLevel的加载是在ActivateLevel中设置的。

这样就能够在World中调用UpdateStreamingState

UpdateStreamingState能够加载Level。

先记随手一下,欢迎指点

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值