Sammeln Sie gemeinsame Funktionen mit GameInstanceSubsystem
Wie wir den UI-Flow von ProjectDT zentralisiert haben
Die in diesem Blog verfassten Artikel wurden mit dem Ziel erstellt, zu unterrichten. Außerdem können die Informationen im Artikel falsch sein, also seien Sie bitte vorsichtig.
Wenn mehrere Widgets und Akteure dieselbe UI-Aufgabe wiederholen, erhöht sich der Code, um einander direkt zu finden. ProjectDT verfügt über einen gemeinsamen UI-AblaufUGameInstanceSubsystemgesammelt.
Warum Subsystem verwenden?
UGameInstanceSubsystemhat die gleiche Lebensdauer wie GameInstance und wird automatisch von der Engine erstellt. Sie können es von überall über GameInstance abrufen, ohne selbst einen separaten Singleton-Zeiger erstellen zu müssen.
UDTUISubsystem* UISubsystem =
GetGameInstance()->GetSubsystem<UDTUISubsystem>();
if (UISubsystem)
{
UISubsystem->ProcessSolvedProblem(
ProblemData,
FVector2D::ZeroVector,
0.0f,
100.0f
);
}
Nebeneffekte, wie der Dialog, der auf die Verarbeitung der Problemantwort folgt, und die Erstellung eines Whiteboard-Knotens können in einer Funktion zusammengefasst werden, anstatt für jedes Widget kopiert zu werden.
Setzen Sie nicht alles ein
Das Subsystem ist auch global leicht zugänglich. Wenn Sie also weitere Verantwortlichkeiten hinzufügen, wird es zu einer weiteren riesigen Managerklasse.
- UI-Übergänge und UI-Ereignisse sind UI-Subsysteme
- Der Speicherplatz und das aktuelle SaveGame sind das Save Subsystem
- Die aktuellen Gewinn-/Verlustregeln für die Welt sind GameMode
- Die Spielereingabe ist PlayerController
Wenn Sie während des Kampfes an einem temporären Akteurzeiger festhalten, nur weil er eine lange Lebensdauer hat, bleiben möglicherweise alte Objekte zurück, nachdem Sie sich um die Welt bewegt haben. Die MainUI- und WhiteBoard-Referenzen von ProjectDT sind:TWeakObjectPtrEs wurde gespeichert als
Subsysteme sind gute Knotenpunkte, die entfernte Objekte miteinander verbinden. Sie müssen jedoch vor der Nutzung prüfen, ob die Lebensdauer und die Verantwortung der Daten wirklich im Rahmen von GameInstance liegen.