// 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 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); } }