Seamless Travel 无缝切换关卡

547 阅读1分钟

写在前面

为什么要使用Seamless Travel呢?

Travelling in Multiplayer in Unreal Engine | Unreal Engine 5.3 Documentation

里面提到,每次non-seamless都会断开server和clients的链接,等待新地图的加载,之后再连接上同一个服务器。在这之间是存在额外的开销和风险的,比如clients无法重新连接server。

而Seamless Travel更加被推荐使用,它的原理是在old map和new map中间加上一层TransitionMap, 在新旧地图切换时,就先跳转到非常小的并且少有开销的TransitionMap等待新地图的加载。如果没有中间层,为了实现无缝跳转,新旧两张地图必须同时存在以让玩家有处可走。

创建C++GameMode作为Lobby的GameMode蓝图基类

C++ Class中合适的地方基于GameMode类建立LobbyMode类。

void ALobbyMode::PostLogin(APlayerController *NewPlayer)
{
    Super::PostLogin(NewPlayer);

    AGameStateBase *lobbyGameState{nullptr};
    int playerNums{0};

    // 当人数到达了一定数量就会前往GameMap
    if (!this->GameState)
    {
        lobbyGameState = this->GameState.Get();

        if (lobbyGameState)
        {
            playerNums = lobbyGameState->PlayerArray.Num();
        }

        if (playerNums == this->MaxNumOfPlayers)
        {
            // 设置无缝跳转
            bUseSeamlessTravel = 1;
            // 如果到达了一定的玩家人数,主服务器跳转到相应的游戏游玩界面
            GetWorld()->ServerTravel(FString("Game/Maps/GamePlay?listen"));
        }
    }
}

基于c++类建立BP_LobbyMode

在合适的地方,建立BP_LobbyMode, 当然基类是c++ 写的LobbyMode.

这之后, 做一些设置。

  • 搜索seamlessTravel 将其设置为true (注意,我们虽然在c++中写好了,但是蓝图里的设置的优先级是要高于c++的)
  • 把pawn更改为我们的BP_BlasterCharacter
  • 在LobbyMap上应用我们的BP_LobbyMode

测试

打包测试