← SEARCHABLE ARCHIVE
Unreal Engine · 2026-07-04

Widget-Lebenszyklus und Delegat-Überlappungsverbindung

Probleme, die auftreten, wenn NativeConstruct erneut aufgerufen wird

INTERACTIVE READING MODE →

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.

UUserWidget::NativeConstruct()Es ist leicht anzunehmen, dass dies nur einmal aufgerufen wird, wenn ein Objekt zum ersten Mal erstellt wird. Wenn das Widget jedoch vom Bildschirm entfernt und erneut hinzugefügt wird, wird Construct möglicherweise erneut aufgerufen.

Delegierter kann redundant angeschlossen werden

void UDailyProblemWidget::NativeConstruct()
{
    Super::NativeConstruct();

    SubmitButton->OnClicked.AddDynamic(
        this,
        &UDailyProblemWidget::HandleSubmit
    );
}

Wenn Construct zweimal aufgerufen wird, wird die Funktion möglicherweise zweimal mit demselben Tastenklick ausgeführt. Bei Logiken wie Lagerung, Warenabzug und Knotenbildung werden die eigentlichen Daten redundant verarbeitet.

In ProjectDT war es so organisiert, dass derselbe Delegat vor dem Herstellen einer Verbindung entfernt wurde.

if (SubmitButton)
{
    SubmitButton->OnClicked.RemoveDynamic(
        this,
        &UDailyProblemWidget::HandleSubmit
    );

    SubmitButton->OnClicked.AddDynamic(
        this,
        &UDailyProblemWidget::HandleSubmit
    );
}

NativeOnInitialized und NativeConstruct

Eine Aufgabe, die nur einmal vorbereitet werden mussNativeOnInitialized()könnte besser geeignet sein. Der Wert, der jedes Mal aktualisiert werden muss, wenn der Bildschirm erneut angezeigt wird, istNativeConstruct()Ich bearbeite es in einer separaten Setup-Funktion.

NativeOnInitialized: Einmal während der Lebensdauer des Objekts
NativeConstruct: Kann erneut aufgerufen werden, wenn es an eine Ansicht angehängt wird
NativeDestruct: Wird beim Verlassen von View aufgerufen

In einer Widget-Pooling- oder Wiederverwendungsstruktur sollten Objekterstellung und Bildschirmanzeige nicht als dasselbe Ereignis betrachtet werden. Es ist wichtig zu unterscheiden, an welchem ​​Punkt jede Tastenverbindung, Dateninitialisierung und Bildschirmaktualisierung durchgeführt werden soll.