Eingabemodus und TWeakObjectPtr
Stellt die UI-Eingabe und die UObject-Lebensdauer klar dar
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 Sie die Benutzeroberfläche öffnen, funktioniert die Maus, aber möglicherweise liegt ein Problem vor, bei dem alle Tastaturkürzel blockiert sind. Das Whiteboard von ProjectDT musste während der Manipulation der Benutzeroberfläche kontinuierlich Tastatureingaben empfangen.
Wählen Sie den Eingabemodus entsprechend Ihrem Zweck.
FInputModeGameAndUI InputMode;
InputMode.SetHideCursorDuringCapture(false);
PlayerController->SetInputMode(InputMode);
PlayerController->bShowMouseCursor = true;
FInputModeUIOnlyist geeignet, wenn der Schwerpunkt auf der Benutzeroberfläche liegt, kann jedoch für Bildschirme, die auch Tasteneingaben auf der Spielseite erfordern, zu stark sein. FInputModeGameAndUIHält die Benutzeroberfläche und die Spieleingabe zusammen.
Wichtig ist auch, auf welches Widget der Fokus liegt. Wenn die EditableTextBox Tastenanschläge verbraucht, wird die Verknüpfung möglicherweise nicht an den PlayerController weitergegeben.
Objekte, die nicht über einen längeren Zeitraum gehalten werden müssen, sind Schwachstellen.
Obwohl sich das UI-Subsystem derzeit MainWidget und WhiteBoard merkt, muss es nicht über die Lebensdauer dieser Objekte verfügen.
TWeakObjectPtr<UMainWidget> MainUI;
TWeakObjectPtr<UInvestigateWhiteBoard> ActiveWhiteBoard;
TObjectPtrVerfolgt UObject-Referenzen und kann das Überleben von Objekten mit starken Referenzen beeinträchtigen. TWeakObjectPtrwird ungültig, wenn das Objekt zerstört wird. Überprüfen Sie es daher vor der Verwendung.
if (UMainWidget* Widget = MainUI.Get())
{
Widget->ShowOverlay();
}
Der Inline-Setter eines schwachen Zeigers, der auf einen vorwärts deklarierten Typ zeigt, kann einen Kompilierungsfehler verursachen. Es ist sicherer, nur die Deklaration im Header zu belassen und sie in einem CPP zuzuweisen, das die gesamte Definition des Typs enthält.
Eingabemodus und Zeigertyp sind keine trivialen syntaktischen Entscheidungen. Es handelt sich um eine Entscheidung, im Code auszudrücken, wer Eingaben erhält und wem die Lebensdauer des Objekts gehört.