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。

先記隨手一下,歡迎指點

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章