keywords: [UE4]动态加载关卡或无缝切换场景的资料收集

How to open level asynchronously, without visible after load?

Level Streaming: Move from MainMenu to World level.

How to change Map? C++ code.

Failed to load package on client

What is the difference between ServerTravel and OpenLevel?


// 获取永久性关卡  
UWorld* PersistentWorld = GetWorld();

if (!PersistentWorld)
    UE_LOG(LogTemp, Fatal, TEXT("UDynamicLevels::LoadTileToStreamingArray >> Invalid PersistentWorld!!!"));

UE_LOG(LogTemp, Display, TEXT("aaaaaaaaaaaaaa"));

//new StreamingClass Instance 新流关卡实例  
UClass* StreamingClass = ULevelStreamingKismet::StaticClass();
ULevelStreaming* StreamingLevel = Cast<ULevelStreaming>(StaticConstructObject_Internal(StreamingClass, PersistentWorld));

// FName PackageName = TEXT("/Game/TempUmap/Level_01") 根据项目实际情况获取并设置PackageName  
FName PackageName(TEXT("/Game/Demo/scecn_test/scene_create_role"));

UE_LOG(LogTemp, Display, TEXT("bbbbb"));

//Make New Level Visible 使流关卡可见  
StreamingLevel->bShouldBeLoaded = true;
StreamingLevel->bShouldBeVisible = true;
StreamingLevel->bShouldBlockOnLoad = false;

UE_LOG(LogTemp, Display, TEXT("cccccc"));

//Very Important, used by LevelStreaming* to load the map 设置流关卡的包名  
StreamingLevel->PackageNameToLoad = PackageName;
//Add to UWorld 将流关卡添加到World中  

Levels loaded from .umap file name during Runtime flicker constantly and Lightning never finishes rebuilding

Unreal4 入门(关卡动态加载)

Unreal Engine4 C++ 动态加载Level(关卡)

!!!How do I use PrepareMapChange/CommitMapChange?

void AWarSoulPlayerController::TestSwitchScene(int32 Value)
    if (Value)
        bool rs = GetWorld()->ServerTravel(TEXT("/Game/Demo/scene/scene_01"));
        UE_LOG(LogTemp, Display, TEXT("aaa %d"), rs ? 1 : 0);
        bool rs = GetWorld()->ServerTravel(TEXT("/Game/Demo/scene/scene_01"));
        UE_LOG(LogTemp, Display, TEXT("bbb %d"), rs ? 1 : 0);


/** Returns true if allowed to server travel */
virtual bool CanServerTravel(const FString& URL, bool bAbsolute);

/** Handles request for server to travel to a new URL, with all players */
virtual void ProcessServerTravel(const FString& URL, bool bAbsolute = false);

 * called on server during seamless level transitions to get the list of Actors that should be moved into the new level
 * PlayerControllers, Role < ROLE_Authority Actors, and any non-Actors that are inside an Actor that is in the list
 * (i.e. Object.Outer == Actor in the list)
 * are all automatically moved regardless of whether they're included here
 * only dynamic actors in the PersistentLevel may be moved (this includes all actors spawned during gameplay)
 * this is called for both parts of the transition because actors might change while in the middle (e.g. players might join or leave the game)
 * @see also PlayerController::GetSeamlessTravelActorList() (the function that's called on clients)
 * @param bToTransition true if we are going from old level to transition map, false if we are going from transition map to new level
 * @param ActorList (out) list of actors to maintain
virtual void GetSeamlessTravelActorList(bool bToTransition, TArray<AActor*>& ActorList);

 * Used to swap a viewport/connection's PlayerControllers when seamless traveling and the new GameMode's
 * controller class is different than the previous
 * includes network handling
 * @param OldPC - the old PC that should be discarded
 * @param NewPC - the new PC that should be used for the player
virtual void SwapPlayerControllers(APlayerController* OldPC, APlayerController* NewPC);

 * Handles reinitializing players that remained through a seamless level transition
 * called from C++ for players that finished loading after the server
 * @param C the Controller to handle
virtual void HandleSeamlessTravelPlayer(AController*& C);

 * Called after a seamless level transition has been completed on the *new* GameMode.
 * Used to reinitialize players already in the game as they won't have *Login() called on them
virtual void PostSeamlessTravel();

/** Start the transition out of the current map. Called at start of seamless travel, or right before map change for hard travel. */
virtual void StartToLeaveMap();

 * Spawns a PlayerController at the specified location; split out from Login()/HandleSeamlessTravelPlayer() for easier overriding
 * @param RemoteRole the role this controller will play remotely
 * @param SpawnLocation location in the world to spawn
 * @param SpawnRotation rotation to set relative to the world
 * @return PlayerController for the player, NULL if there is any reason this player shouldn't exist or due to some error
virtual APlayerController* SpawnPlayerController(ENetRole InRemoteRole, FVector const& SpawnLocation, FRotator const& SpawnRotation);


[4.14] ServerTravel with more than the Server doesn’t work in PIE

How can I change the level for all connected clients in a multiplayer game?