645473022f
对应 P-016 game-reviewer 审查建议(非阻塞关注项)两项: 1. [生命周期] ExecuteHideNarrative 删除 Hide() 后立即 CachedNarrativeWidget=nullptr 的那行,与 Pickup 路径对称;让 RemoveNarrativeWidget 能检测到残留 Widget 并 RemoveFromParent,修复每次交互循环视口残留实例累积。 2. [一致性] NarrativeTextWidget/PickupNotificationWidget 的 Hide() 淡出时长改为从 FadeOutAnim->GetEndTime() 读取(无动画回退 0.2f),消除与动画时长耦合的硬编码;lambda 捕获由 [this] 改为 [WeakThis](TWeakObjectPtr) 避免悬空。 补充:两个 cpp 添加 #include Animation/WidgetAnimation.h(GetEndTime 需要 UWidgetAnimation 完整类型,原仅有前向声明)。UE5.7 编译验证 Result:Succeeded,零 error/warning。 Co-Authored-By: Claude Opus 5.8 <noreply@anthropic.com>
68 lines
1.6 KiB
C++
68 lines
1.6 KiB
C++
// ChildHood Project - 拾取通知 UI 基类 实现
|
|
|
|
#include "Interaction/PickupNotificationWidget.h"
|
|
#include "Animation/WidgetAnimation.h" // UWidgetAnimation 完整定义(GetEndTime 需要完整类型)
|
|
#include "Components/TextBlock.h"
|
|
|
|
void UPickupNotificationWidget::NativeOnInitialized()
|
|
{
|
|
Super::NativeOnInitialized();
|
|
|
|
// 初始隐藏
|
|
SetVisibility(ESlateVisibility::Hidden);
|
|
}
|
|
|
|
void UPickupNotificationWidget::SetPickupText(const FString& Text)
|
|
{
|
|
if (PickupTextBlock)
|
|
{
|
|
PickupTextBlock->SetText(FText::FromString(Text));
|
|
}
|
|
}
|
|
|
|
void UPickupNotificationWidget::Show()
|
|
{
|
|
if (bIsVisible) return;
|
|
bIsVisible = true;
|
|
|
|
SetVisibility(ESlateVisibility::HitTestInvisible);
|
|
|
|
if (FadeInAnim)
|
|
{
|
|
PlayAnimation(FadeInAnim, 0.0f, 1, EUMGSequencePlayMode::Forward, 1.0f);
|
|
}
|
|
}
|
|
|
|
void UPickupNotificationWidget::Hide()
|
|
{
|
|
if (!bIsVisible) return;
|
|
|
|
// 淡出时长从 FadeOutAnim 实际时长读取,消除与动画时长耦合的硬编码
|
|
const float FadeOutDuration = (FadeOutAnim ? FadeOutAnim->GetEndTime() : 0.2f);
|
|
|
|
if (FadeOutAnim)
|
|
{
|
|
PlayAnimation(FadeOutAnim, 0.0f, 1, EUMGSequencePlayMode::Forward, 1.0f);
|
|
}
|
|
|
|
if (UWorld* World = GetWorld())
|
|
{
|
|
// 捕获弱引用避免悬空 this
|
|
TWeakObjectPtr<UPickupNotificationWidget> WeakThis(this);
|
|
FTimerHandle TempHandle;
|
|
World->GetTimerManager().SetTimer(TempHandle, [WeakThis]()
|
|
{
|
|
if (UPickupNotificationWidget* Self = WeakThis.Get())
|
|
{
|
|
Self->bIsVisible = false;
|
|
Self->SetVisibility(ESlateVisibility::Hidden);
|
|
}
|
|
}, FadeOutDuration, false);
|
|
}
|
|
else
|
|
{
|
|
bIsVisible = false;
|
|
SetVisibility(ESlateVisibility::Hidden);
|
|
}
|
|
}
|