Choose your operating system:
Windows
macOS
Linux
无缝与非无缝切换
UE4 中主要有两种转移方式:无缝和非无缝方式。两者的主要区别在于,无缝转移是一种非阻塞(non-blocking)操作,而非无缝转移则是一种阻塞(blocking)操作。
当客户端执行非无缝转移时,客户端将与服务器断开连接,然后重新连接到同一服务器,而服务器将准备新的地图以供加载。
我们建议 UE4 多人模式游戏尽量采用无缝转移。这样做通常可以提供更流畅的体验,同时避免重新连接过程中可能出现的问题。
有三种情形中必然产生非无缝转移:
初次加载地图时
初次作为客户端连接服务器时
想要终止一个多人模式游戏并启动新游戏时
有三个用来驱动转移的主要函数:UEngine::Browse
、UWorld::ServerTravel
和 APlayerController::ClientTravel
。在确定使用哪个函数时,您可能会感到有些困惑,所以请遵循下面的准则:
`UEngine::Browse`
就像是加载新地图时的硬重置。
将始终导致非无缝切换。
将导致服务器在切换到目标地图前与当前客户端断开连接。
客户端将与当前服务器断开连接。
专用服务器无法切换至其他服务器,因此地图必须存储在本地(不能是 URL)。
`UWorld::ServerTravel`
仅适用于服务器。
会将服务器跳转到新的世界/场景。
所有连接的客户端都会跟随。
这就是多人游戏在地图之间转移时所用的方法,而服务器将负责调用此函数。
服务器将为所有已连接的客户端玩家调用
APlayerController::ClientTravel
。
`APlayerController::ClientTravel`
如果从客户端调用,则转移到新的服务器
如果从服务器调用,则要求特定客户端转移到新地图(但仍然连接到当前服务器)
启用无缝切换
要启用无缝切换,您需要设置一个过渡地图。这需要通过 UGameMapsSettings::TransitionMap
属性进行配置。该属性默认为空,如果您的游戏保持这一默认状态,就会为过渡地图创建一个空地图。
之所以存在过渡地图,是因为必须始终有一个被加载的世界(用于存放地图),所以在加载新地图之前,我们不能释放原有的地图。由于地图可能会非常大,因此让新旧地图同时存放在存储器内绝对是个坏主意,这时就需要过渡地图来帮忙了。
现在,我们可以从当前地图转移到过渡地图,然后可以从那里转移到最终的地图。由于过渡地图非常小,因此在"中转"当前地图和最终地图时不会造成太大的资源消耗。
设置好过渡地图后,您需要将 AGameModeBase::bUseSeamlessTravel
设置为 true,这样就可以实现无缝切换了!
无缝切换流程
下面是执行无缝切换时的一般流程:
标记出要在过渡关卡中存留的 actor(更多信息请见下面)
转移到过渡关卡
标记出要在最终关卡中存留的 actor(更多信息请见下面)
转移到最终关卡
无缝切换中的存留 Actor
在使用无缝切换时,可以将(存留) actor 从当前关卡带到新的关卡。这适用于一些特定的 actor,如道具栏物品和玩家等。
默认情况下,这些 actor 将自动存留:
GameMode
actor(仅限服务器)通过
AGameModeBase::GetSeamlessTravelActorList
额外添加的任何 actor
拥有一个有效的
PlayerState
(仅限服务器)的所有控制器所有
PlayerControllers
(仅限服务器)所有本地
PlayerControllers
(服务器和客户端)通过
APlayerController::GetSeamlessTravelActorList
(在本地`PlayerControllers`上调用)额外添加的任何 actor