为什么不直接用 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。
先记随手一下,欢迎指点