From be4e9a15c94a11a9d67fc2cee2a44d4f58446bd3 Mon Sep 17 00:00:00 2001 From: starmen1265 Date: Mon, 15 Jun 2026 11:42:43 +0800 Subject: [PATCH] =?UTF-8?q?fix(collection):=20=E6=94=B6=E9=9B=86Widget?= =?UTF-8?q?=E8=A1=A5NativeDestruct=E6=B8=85=E7=90=86=E8=AE=A1=E6=97=B6?= =?UTF-8?q?=E5=99=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Collection/CollectionCompleteWidget.cpp | 13 +++++++++++++ .../ChildHood/Collection/CollectionCompleteWidget.h | 3 +++ .../ChildHood/Collection/CollectionNotifWidget.cpp | 13 +++++++++++++ Source/ChildHood/Collection/CollectionNotifWidget.h | 3 +++ 4 files changed, 32 insertions(+) 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: /** 停留结束 → 播放淡出动画 */