KLingo Project Documentation 1.0.0
Unreal Engine 5.6 C++ Project Documentation
로딩중...
검색중...
일치하는것 없음
UToastWidget.cpp
이 파일의 문서화 페이지로 가기
1// Copyright (c) 2025 Doppleddiggong. All rights reserved. Unauthorized copying, modification, or distribution of this file, via any medium is strictly prohibited. Proprietary and confidential.
2
3
4#include "UToastWidget.h"
5
6#include "UAutoDespawnItem.h"
7#include "UBroadcastManager.h"
8#include "UTutorMessage.h"
9#include "Components/HorizontalBox.h"
10
12{
13 if (auto BM = UBroadcastManager::Get(GetWorld()))
14 {
15 BM->OnTutorMessage.AddDynamic(this, &UToastWidget::OnTutorMessage);
16 BM->OnAddItemToBoxList.AddDynamic(this, &UToastWidget::AddItemToBoxList);
17
18 BM->OnShowTutorialMessage.AddDynamic(this, &UToastWidget::OnShowTutorialMessage);
19 BM->OnHideTutorialMessage.AddDynamic(this, &UToastWidget::OnHideTutorialMessage);
20 }
21
22 // TutorMessage 초기화 및 애니메이션 콜백 바인딩
24}
25
26
28{
29 if (TutorMessage)
30 {
31 TutorMessage->SetVisibility(ESlateVisibility::HitTestInvisible);
32
33 FWidgetAnimationDynamicEvent HideDelegate;
34 HideDelegate.BindDynamic(this, &UToastWidget::OnTutorHideComplete);
35 BindToAnimationFinished(TutorHideAnim, HideDelegate);
36
37 PlayAnimation(TutorHideAnim);
38
39 bIsTutorVisible = false;
40 }
41}
42
43
44void UToastWidget::OnTutorMessage(const FText& NewMessage)
45{
46 if (!TutorMessage)
47 return;
48
49 // 기존 타이머가 있으면 클리어
50 if (TutorHideTimerHandle.IsValid())
51 {
52 GetWorld()->GetTimerManager().ClearTimer(TutorHideTimerHandle);
53 }
54
56 {
57 // 표시 중이면 Hide → SetText → Show
58 PendingMessage = NewMessage;
59 bHasPendingMessage = true;
60 bPendingIsTutorial = false;
61
62 PlayAnimation(TutorHideAnim);
63 }
64 else
65 {
66 // 숨김 상태면 바로 SetText → Show
67 TutorMessage->SetMessageText(NewMessage);
68
69 if (TutorShowAnim)
70 {
71 PlayAnimation(TutorShowAnim);
72 bIsTutorVisible = true;
73
74 // 자동 Hide 타이머 시작
76 }
77 }
78}
79
80void UToastWidget::OnShowTutorialMessage(const FText& NewMessage)
81{
82 if (!TutorMessage)
83 return;
84
85 // 기존 타이머가 있으면 클리어
86 if (TutorHideTimerHandle.IsValid())
87 {
88 GetWorld()->GetTimerManager().ClearTimer(TutorHideTimerHandle);
89 }
90
92 {
93 // 표시 중이면 Hide → SetText → Show
94 PendingMessage = NewMessage;
95 bHasPendingMessage = true;
96 bPendingIsTutorial = true;
97
98 PlayAnimation(TutorHideAnim);
99 }
100 else
101 {
102 // 숨김 상태면 바로 SetText → Show
103 TutorMessage->SetMessageText(NewMessage);
104
105 if (TutorShowAnim)
106 {
107 PlayAnimation(TutorShowAnim);
108 bIsTutorVisible = true;
109 }
110 }
111}
112
114{
115 if (!TutorMessage || !bIsTutorVisible) return;
116
117 // 기존 타이머가 있으면 클리어
118 if (TutorHideTimerHandle.IsValid())
119 {
120 GetWorld()->GetTimerManager().ClearTimer(TutorHideTimerHandle);
121 }
122
123 // Hide 애니메이션 재생
124 if (TutorHideAnim)
125 {
126 PlayAnimation(TutorHideAnim);
127 }
128}
129
131{
132 bIsTutorVisible = false;
133
135 {
136 bHasPendingMessage = false;
137 TutorMessage->SetMessageText(PendingMessage);
138
139 if (TutorShowAnim)
140 {
141 PlayAnimation(TutorShowAnim);
142 bIsTutorVisible = true;
143
144 // 튜토리얼 메시지가 아닐 때만 타이머 시작!
145 if (!bPendingIsTutorial) // ← 이 줄 추가!
146 {
148 }
149 }
150
151 // 플래그 초기화
152 bPendingIsTutorial = false;
153 }
154}
155
157{
158 // 기존 타이머 클리어 (안전성을 위해)
159 if (TutorHideTimerHandle.IsValid())
160 {
161 GetWorld()->GetTimerManager().ClearTimer(TutorHideTimerHandle);
162 }
163
164 // 지정된 시간 후 자동으로 Hide 애니메이션 재생
165 GetWorld()->GetTimerManager().SetTimer(
167 [this]()
168 {
169 if (bIsTutorVisible)
170 {
171 PlayAnimation(TutorHideAnim);
172 }
173 },
175 false
176 );
177}
178
179void UToastWidget::AddItemToBoxList(const TArray<FResultStatData>& InDataList)
180{
181 if (InDataList.Num() == 0)
182 return;
183
184 // 기존 타이머가 있으면 클리어
185 if (ItemAddTimerHandle.IsValid())
186 {
187 GetWorld()->GetTimerManager().ClearTimer(ItemAddTimerHandle);
188 }
189
190 // 대기 리스트에 데이터 복사 및 인덱스 초기화
191 PendingItemDataList = InDataList;
192 CurItemIndex = 0;
193
194 // 첫 번째 아이템은 즉시 추가
196}
197
198
200{
202 return;
203
204 // 새 아이템 생성
205 if (auto SpawnItem = CreateWidget<UAutoDespawnItem>(GetWorld(), ItemWidgetClass))
206 {
207 ItemHorizontalBox->AddChild(SpawnItem);
208
209 SpawnItem->InitData(InData);
210 }
211}
212
214{
216 {
217 // 모든 아이템 추가 완료
218 PendingItemDataList.Empty();
219 CurItemIndex = 0;
220 return;
221 }
222
223 // 현재 인덱스의 아이템 추가
225 CurItemIndex++;
226
227 // 다음 아이템이 있으면 타이머 설정
229 {
230 GetWorld()->GetTimerManager().SetTimer(
232 this,
235 false
236 );
237 }
238 else
239 {
240 // 모든 아이템 추가 완료
241 PendingItemDataList.Empty();
242 CurItemIndex = 0;
243 }
244}
void ProcessNextItem()
다음 아이템을 HorizontalBox에 추가 (타이머 콜백)
bool bPendingIsTutorial
펜딩 메시지가 튜토리얼 메시지인지 여부
FTimerHandle TutorHideTimerHandle
자동 Hide 타이머 핸들
TObjectPtr< class UTutorMessage > TutorMessage
튜터 메시지 위젯 (옵션, BindWidgetOptional)
TObjectPtr< class UHorizontalBox > ItemHorizontalBox
아이템 표시용 HorizontalBox
int32 CurItemIndex
현재 추가 중인 아이템 인덱스
FTimerHandle ItemAddTimerHandle
아이템 순차 추가 타이머 핸들
TArray< FResultStatData > PendingItemDataList
순차 추가 대기 중인 아이템 데이터 리스트
float TutorMessageDisplayDuration
튜터 메시지 표시 지속 시간 (초)
void OnShowTutorialMessage(const FText &NewMessage)
void AddItemToBoxList(const TArray< FResultStatData > &InDataList)
void InitTutorMessage()
TObjectPtr< class UWidgetAnimation > TutorHideAnim
TutorMessage Hide Animation (MainWidget에서 제어)
bool bHasPendingMessage
펜딩 메시지 존재 여부
TObjectPtr< class UWidgetAnimation > TutorShowAnim
TutorMessage Show Animation (MainWidget에서 제어)
TSubclassOf< class UAutoDespawnItem > ItemWidgetClass
아이템 위젯 클래스
virtual void NativeConstruct() override
위젯 초기화
void AddItemToBoxItem(const FResultStatData &InData)
void OnHideTutorialMessage()
float ItemAddInterval
아이템 추가 간격 (초)
bool bIsTutorVisible
튜터 메시지 표시 여부
void OnTutorHideComplete()
TutorHideAnim 완료 시 호출되는 콜백
FText PendingMessage
펜딩 중인 메시지 (Hide 완료 후 표시할 메시지)
void OnTutorMessage(const FText &NewMessage)
튜터 메시지를 설정하고 애니메이션을 재생합니다.
void StartTutorHideTimer()
자동 Hide 타이머 시작
Result Stat 위젯 통합 데이터 구조 위젯 타입, 색상 스타일, 각 타입별 데이터를 통합 관리