写在前面
为什么要使用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
测试
打包测试