← SEARCHABLE ARCHIVE
Unreal Engine · 2026-07-05

使用 GameInstanceSubsystem 收集共同特征

我们如何集中 ProjectDT 的 UI 流程

INTERACTIVE READING MODE →

该博客上撰写的文章是出于教学目的而创建的。 另外,文章中的信息可能不正确,请谨慎。

当多个Widget和Actor重复执行相同的UI任务时,相互查找的代码直接增加。 ProjectDT 具有通用的 UI 流程UGameInstanceSubsystem集。

为什么要使用子系统?

UGameInstanceSubsystem与 GameInstance 具有相同的生命周期,由引擎自动创建。 您可以通过 GameInstance 从任何地方获取它,而无需自己创建单独的 Singleton 指针。

UDTUISubsystem* UISubsystem =
    GetGameInstance()->GetSubsystem<UDTUISubsystem>();

if (UISubsystem)
{
    UISubsystem->ProcessSolvedProblem(
        ProblemData,
        FVector2D::ZeroVector,
        0.0f,
        100.0f
    );
}

副作用,例如问题答案处理后的对话和白板节点的创建,可以收集到一个函数中,而不是为每个小部件复制。

不要把所有东西都放进去

子系统也可以在全局范围内轻松访问,因此如果您不断添加职责,它就会成为另一个巨大的管理器类。

  • UI 转换和 UI 事件是 UI 子系统
  • 保存槽和当前SaveGame都是Save Subsystem
  • 当前世界输赢规则为GameMode
  • 玩家输入是 PlayerController

如果您在战斗中持有临时 Actor 指针,只是因为它的寿命很长,那么在世界各地移动后,旧对象可能会保留下来。 ProjectDT 的 MainUI 和 WhiteBoard 参考资料是:TWeakObjectPtr它被存储为

子系统是将远距离对象连接在一起的良好枢纽。 但在使用前必须检查数据的寿命和责任是否确实在GameInstance的范围内。