feat(interaction): 接通叙事/拾取通知Widget表现层

P-016: 将EffectManager的ShowNarrative/HideNarrative/ShowPickupNotification
从日志占位改为真实CreateWidget+AddToViewport+淡入淡出生命周期。

- 新增UPickupNotificationWidget C++基类(对称NarrativeTextWidget)
- EffectManager新增SetWidgetClasses注入接口与Widget弱引用缓存
- PerformCleanup补齐Narrative/Pickup Widget兜底淡出移除
- ASystemDriver新增两个TSubclassOf配置点,BeginPlay注入给EffectManager
- Widget Class未注入时回退日志占位,保证Effect流程不卡

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
2026-06-16 23:30:50 +08:00
parent 11895bddfc
commit 1e5f40e633
6 changed files with 323 additions and 9 deletions
@@ -0,0 +1,57 @@
// ChildHood Project - 拾取通知 UI 基类 实现
#include "Interaction/PickupNotificationWidget.h"
#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;
if (FadeOutAnim)
{
PlayAnimation(FadeOutAnim, 0.0f, 1, EUMGSequencePlayMode::Forward, 1.0f);
FTimerHandle TempHandle;
if (UWorld* World = GetWorld())
{
World->GetTimerManager().SetTimer(TempHandle, [this]()
{
bIsVisible = false;
SetVisibility(ESlateVisibility::Hidden);
}, 0.2f, false);
}
}
else
{
bIsVisible = false;
SetVisibility(ESlateVisibility::Hidden);
}
}