ServerTravel源代码Widgets删除线路

问题描述 投票:0回答:1

有谁知道通过调用 ServerTravel 更改级别时,源代码小部件在哪里被删除,以删除虚幻引擎 5.3.X / 5.4.X 中的那一行/那些行?

我尝试查看 ServerTravel 的代码,但找不到删除代码。

unreal-engine5 unreal
1个回答
0
投票

有人知道了吗

它是由 Epic Games 的员工编写的,这不是火箭科学,你只需遵循一些面包屑即可。

当您切换到新世界时会发生以下情况(以便您可以跟踪步骤):

  1. 当前世界在
    UWorld::SeamlessTravel
    中获取指向新世界的 URL,其中它使用处理程序实例来管理名为
    FSeamlessTravelHandler
    的实际旅行逻辑。
  2. FSeamlessTravelHandler::Tick
    中,处理程序会检查代表要前往的新 UWorld 实例的
    LoadedWorld
    。如果它不为 null 且不等于当前世界,则当前世界会收到对
    BeginTearingDown
    的调用。
  3. UWorld::BeginTearingDown
    中,
    FWorldDelegates::OnWorldBeginTearDown
    被广播,通知一堆系统,包括
    UGameViewportSubsystem
    ,它是
    UEngine
    的子系统。在那里它调用方法
    UGameViewportSubsystem::HandleRemoveWorld
  4. UGameViewportSubsystem::HandleRemoveWorld
    中,子系统迭代当前添加到视口的所有现有小部件并在它们上调用
    UWidget::RemoveFromParent

我想从现在开始,你就可以随波逐流了。


您可能想要做的事情而不是修改引擎代码: 您希望小部件在级别之间持续存在。这很棘手,因为在拆除世界时,UserWidget 的所有者可能会被删除,从而导致 widget 也被删除。它们被从父级中移除,所有者变得无效,导致它们被垃圾收集。

因此,首先,您不能仅将它们添加到玩家的屏幕上,而是添加到游戏实例中。这并不难,只需将其用作所有者即可。但您还想缓存它们,以便稍后在世界被移除时添加它们。如果您愿意,您可以在自己的

GameInstanceSubsystem
中执行此操作,也可以直接在游戏实例中执行此操作。只需确保在正确加载您想要前往的世界后,将它们添加回视口即可。

© www.soinside.com 2019 - 2024. All rights reserved.