← 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的範圍內。