使用 GameInstanceSubsystem 收集共同特徵
我們如何集中 ProjectDT 的 UI 流程
該部落格上撰寫的文章是出於教學目的而創建的。 另外,文章中的資訊可能不正確,請謹慎。
當多個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的範圍內。