diff --git a/Source/ChildHood/Collection/CollectionCompleteWidget.cpp b/Source/ChildHood/Collection/CollectionCompleteWidget.cpp index fbc2d9a..ba6288a 100644 --- a/Source/ChildHood/Collection/CollectionCompleteWidget.cpp +++ b/Source/ChildHood/Collection/CollectionCompleteWidget.cpp @@ -11,6 +11,19 @@ void UCollectionCompleteWidget::NativeOnInitialized() Super::NativeOnInitialized(); } +void UCollectionCompleteWidget::NativeDestruct() +{ + // 清理计时器:StayTimer/FadeOutTimer 的 lambda 捕获裸 this,Widget 销毁后 fire 会野指针 + // (与 CollectionHUDComponent::EndPlay 同类卫生写法,防关卡切换/退 PIE 时的悬挂 timer) + if (UWorld* World = GetWorld()) + { + World->GetTimerManager().ClearTimer(StayTimerHandle); + World->GetTimerManager().ClearTimer(FadeOutTimerHandle); + } + + Super::NativeDestruct(); +} + void UCollectionCompleteWidget::ShowComplete(const FString& Text, float DisplayDuration, float InFadeOutDuration) { CachedFadeOutDuration = InFadeOutDuration; diff --git a/Source/ChildHood/Collection/CollectionCompleteWidget.h b/Source/ChildHood/Collection/CollectionCompleteWidget.h index 03da29a..9241f27 100644 --- a/Source/ChildHood/Collection/CollectionCompleteWidget.h +++ b/Source/ChildHood/Collection/CollectionCompleteWidget.h @@ -59,6 +59,9 @@ protected: virtual void NativeOnInitialized() override; + /** Widget 销毁时清理计时器:lambda 捕获裸 this,销毁后 fire 会野指针 */ + virtual void NativeDestruct() override; + private: /** 停留结束 → 播放淡出动画 */ diff --git a/Source/ChildHood/Collection/CollectionNotifWidget.cpp b/Source/ChildHood/Collection/CollectionNotifWidget.cpp index 317136b..2db7eff 100644 --- a/Source/ChildHood/Collection/CollectionNotifWidget.cpp +++ b/Source/ChildHood/Collection/CollectionNotifWidget.cpp @@ -11,6 +11,19 @@ void UCollectionNotifWidget::NativeOnInitialized() Super::NativeOnInitialized(); } +void UCollectionNotifWidget::NativeDestruct() +{ + // 清理计时器:StayTimer/FadeOutTimer 的 lambda 捕获裸 this,Widget 销毁后 fire 会野指针 + // (与 CollectionHUDComponent::EndPlay 同类卫生写法,防关卡切换/退 PIE 时的悬挂 timer) + if (UWorld* World = GetWorld()) + { + World->GetTimerManager().ClearTimer(StayTimerHandle); + World->GetTimerManager().ClearTimer(FadeOutTimerHandle); + } + + Super::NativeDestruct(); +} + void UCollectionNotifWidget::InitializeNotif(const FString& Text, FLinearColor TextColor, float InFadeInDuration, float InStayDuration, float InFadeOutDuration) { diff --git a/Source/ChildHood/Collection/CollectionNotifWidget.h b/Source/ChildHood/Collection/CollectionNotifWidget.h index 1ae0854..ce6b9b2 100644 --- a/Source/ChildHood/Collection/CollectionNotifWidget.h +++ b/Source/ChildHood/Collection/CollectionNotifWidget.h @@ -65,6 +65,9 @@ protected: virtual void NativeOnInitialized() override; + /** Widget 销毁时清理计时器:lambda 捕获裸 this,销毁后 fire 会野指针 */ + virtual void NativeDestruct() override; + private: /** 停留结束 → 播放淡出动画 */