KLingo Project Documentation 1.0.0
Unreal Engine 5.6 C++ Project Documentation
로딩중...
검색중...
일치하는것 없음
UPopup_InterviewHello 클래스 참조

Interview Popup - Duolingo Style (Single Question Mode) 더 자세히 ...

#include <UPopup_InterviewHello.h>

+ UPopup_InterviewHello에 대한 상속 다이어그램 :
+ UPopup_InterviewHello에 대한 협력 다이어그램:

Public 멤버 함수

void InitPopup (const FResponseInterviewHello &InterviewData)
 팝업 초기화
 
virtual void NativeTick (const FGeometry &MyGeometry, float InDeltaTime) override
 
void OpenAnimation ()
 팝업 오픈 애니메이션을 재생합니다
 

정적 Public 멤버 함수

static bool ShouldSkipInterviewToday (const UObject *WorldContextObject)
 오늘 Interview 팝업을 건너뛸지 확인
 

Public 속성

bool bAllowPlayerControl = false
 이 팝업이 활성화되어 있을 때 플레이어 조작을 허용할지 여부
 

Protected 멤버 함수

virtual void NativeConstruct () override
 
void UpdateAnimation (float InDeltaTime)
 스크립트 오픈 애니메이션 업데이트
 

Protected 속성

bool bIsOpenAnim = false
 애니메이션 재생 중 여부
 
UWidgetAnimation * BlueprintOpenAnimation
 블루프린트에서 정의한 오픈 애니메이션
 
TObjectPtr< class UTextureButtonBtn_Close
 팝업 닫기 버튼 (우측 상단)
 
TObjectPtr< class UImageButtonBtn_Next
 Next 버튼 (중앙, 초록색) - Submit과 전환
 
TObjectPtr< class UImageButtonBtn_Submit
 Submit 버튼 (중앙) - Next와 전환
 
TObjectPtr< class UCheckBox > Button_CheckToday
 "Today do not show" 체크박스
 
TObjectPtr< class UTextureButtonButton_NextArrow
 다음 질문 버튼 (▶)
 
TObjectPtr< class UTextureButtonButton_PrevArrow
 이전 질문 버튼 (◀)
 
TObjectPtr< class UEditableText > Edit_Answer
 플레이어 답변 입력란
 
EGameSoundType OpenAnimSound = EGameSoundType::UI_PopupOpen
 팝업 오픈 시 재생될 사운드 타입
 
float OpenDuration = 0.2f
 애니메이션 지속 시간
 
EEaseType OpenEaseType = EEaseType::EaseOutBack
 Easing 타입
 
float OpenElapsedTime = 0.0f
 경과 시간
 
FVector2D OpenPivot = FVector2D(0.5f, 0.5f)
 애니메이션 중심점 (0~1 범위)
 
float OpenStartScale = 0.8f
 시작 스케일
 
float OpenTargetScale = 1.0f
 목표 스케일
 
EPopupType PopupType
 
TObjectPtr< class UProgressBar > ProgressBar_Question
 질문 진행률 표시
 
TObjectPtr< class UTextBlock > TXt_Question
 현재 질문 텍스트 (영어)
 
TObjectPtr< class UTextBlock > Txt_Title
 팝업 타이틀 텍스트 ("Interview")
 

Private 멤버 함수

void LoadCurrentAnswer ()
 TempAnswers에서 현재 질문의 답변을 불러와 Edit_Answer에 표시
 
void OnAnswerTextChanged (const FText &Text)
 답변 입력란 텍스트 변경 시 호출 (실시간 Submit 버튼 상태 업데이트)
 
void OnCheckToday (bool bIsChecked)
 "Today do not show" 체크박스 변경
 
void OnClickClose ()
 닫기 버튼 클릭
 
void OnClickNext ()
 Next 버튼 클릭 (중앙 버튼)
 
void OnClickNextArrow ()
 다음 질문으로 이동 (우측 화살표)
 
void OnClickPrevArrow ()
 이전 질문으로 이동 (좌측 화살표)
 
void OnClickSubmit ()
 Submit 버튼 클릭
 
void OnResponseInterviewAnswer (FResponseInterviewAnswer &ResponseData, bool bWasSuccessful)
 Interview Answer API 응답 처리
 
void RefreshArrowButton ()
 Prev/Next 화살표 버튼 표시/숨김 처리
 
void RefreshProgressBar ()
 Progress Bar 업데이트
 
void RefreshSubmitButtonState ()
 Submit 버튼 활성화 상태 업데이트
 
void RefreshUI ()
 현재 질문과 답변을 UI에 반영
 
void SaveCurrentAnswer ()
 현재 질문의 답변을 TempAnswers에 저장
 

Private 속성

bool bCheckTodayDoNotShow = false
 "Today do not show" 체크박스 상태 (Submit 시 사용)
 
int32 CurQuestionIndex = 0
 현재 표시 중인 질문 인덱스 (0-based)
 
TArray< FInterviewQuestionDataSavedQuestions
 저장된 인터뷰 질문 데이터
 
TArray< FString > TempAnswers
 사용자가 입력한 답변 임시 저장 배열 (Questions.Num()과 크기 동일)
 

상세한 설명

Interview Popup - Duolingo Style (Single Question Mode)

기존 ScrollBox 방식과 달리 한 번에 하나의 질문만 표시하고 Prev/Next 버튼으로 네비게이션하는 방식입니다.

UPopup_InterviewHello.h 파일의 19 번째 라인에서 정의되었습니다.

멤버 함수 문서화

◆ InitPopup()

void UPopup_InterviewHello::InitPopup ( const FResponseInterviewHello InterviewData)

팝업 초기화

매개변수
InterviewDataAPI 응답으로 받은 질문 배열

UPopup_InterviewHello.cpp 파일의 71 번째 라인에서 정의되었습니다.

72{
73 // 질문 데이터 저장
74 SavedQuestions = InterviewData.Questions;
75
76 // 답변 임시 저장 배열 초기화
77 TempAnswers.SetNum(SavedQuestions.Num());
78 for (int32 i = 0; i < TempAnswers.Num(); ++i)
79 {
80 TempAnswers[i] = TEXT("");
81 }
82
83 // 첫 번째 질문으로 초기화
85
86 // UI 업데이트
87 RefreshUI();
91}
int32 CurQuestionIndex
현재 표시 중인 질문 인덱스 (0-based)
void RefreshUI()
현재 질문과 답변을 UI에 반영
void RefreshProgressBar()
Progress Bar 업데이트
void RefreshSubmitButtonState()
Submit 버튼 활성화 상태 업데이트
TArray< FString > TempAnswers
사용자가 입력한 답변 임시 저장 배열 (Questions.Num()과 크기 동일)
TArray< FInterviewQuestionData > SavedQuestions
저장된 인터뷰 질문 데이터
void RefreshArrowButton()
Prev/Next 화살표 버튼 표시/숨김 처리
TArray< FInterviewQuestionData > Questions

다음을 참조함 : CurQuestionIndex, FResponseInterviewHello::Questions, RefreshArrowButton(), RefreshProgressBar(), RefreshSubmitButtonState(), RefreshUI(), SavedQuestions, TempAnswers.

+ 이 함수 내부에서 호출하는 함수들에 대한 그래프입니다.:

◆ LoadCurrentAnswer()

void UPopup_InterviewHello::LoadCurrentAnswer ( )
private

TempAnswers에서 현재 질문의 답변을 불러와 Edit_Answer에 표시

UPopup_InterviewHello.cpp 파일의 186 번째 라인에서 정의되었습니다.

187{
188 if (!Edit_Answer || !TempAnswers.IsValidIndex(CurQuestionIndex))
189 return;
190
191 Edit_Answer->SetText(FText::FromString(TempAnswers[CurQuestionIndex]));
192}
TObjectPtr< class UEditableText > Edit_Answer
플레이어 답변 입력란

다음을 참조함 : CurQuestionIndex, Edit_Answer, TempAnswers.

다음에 의해서 참조됨 : RefreshUI().

+ 이 함수를 호출하는 함수들에 대한 그래프입니다.:

◆ NativeConstruct()

void UPopup_InterviewHello::NativeConstruct ( )
overrideprotectedvirtual

UPopup_InterviewHello.cpp 파일의 22 번째 라인에서 정의되었습니다.

23{
24 Super::NativeConstruct();
25
26 // 버튼 이벤트 바인딩
28 {
29 Button_PrevArrow->OnButtonClickedEvent.RemoveDynamic(this, &UPopup_InterviewHello::OnClickPrevArrow);
30 Button_PrevArrow->OnButtonClickedEvent.AddDynamic(this, &UPopup_InterviewHello::OnClickPrevArrow);
31 }
32
34 {
35 Button_NextArrow->OnButtonClickedEvent.RemoveDynamic(this, &UPopup_InterviewHello::OnClickNextArrow);
36 Button_NextArrow->OnButtonClickedEvent.AddDynamic(this, &UPopup_InterviewHello::OnClickNextArrow);
37 }
38
39 if (Btn_Next)
40 {
41 Btn_Next->OnButtonClickedEvent.RemoveDynamic(this, &UPopup_InterviewHello::OnClickNext);
42 Btn_Next->OnButtonClickedEvent.AddDynamic(this, &UPopup_InterviewHello::OnClickNext);
43 }
44
45 if (Btn_Submit)
46 {
47 Btn_Submit->OnButtonClickedEvent.RemoveDynamic(this, &UPopup_InterviewHello::OnClickSubmit);
48 Btn_Submit->OnButtonClickedEvent.AddDynamic(this, &UPopup_InterviewHello::OnClickSubmit);
49 }
50
51 if (Btn_Close)
52 {
53 Btn_Close->OnButtonClickedEvent.RemoveDynamic(this, &UPopup_InterviewHello::OnClickClose);
54 Btn_Close->OnButtonClickedEvent.AddDynamic(this, &UPopup_InterviewHello::OnClickClose);
55 }
56
58 {
59 Button_CheckToday->OnCheckStateChanged.RemoveDynamic(this, &UPopup_InterviewHello::OnCheckToday);
60 Button_CheckToday->OnCheckStateChanged.AddDynamic(this, &UPopup_InterviewHello::OnCheckToday);
61 }
62
63 // 답변 입력란 텍스트 변경 이벤트 바인딩
64 if (Edit_Answer)
65 {
66 Edit_Answer->OnTextChanged.RemoveDynamic(this, &UPopup_InterviewHello::OnAnswerTextChanged);
67 Edit_Answer->OnTextChanged.AddDynamic(this, &UPopup_InterviewHello::OnAnswerTextChanged);
68 }
69}
void OnClickPrevArrow()
이전 질문으로 이동 (좌측 화살표)
void OnCheckToday(bool bIsChecked)
"Today do not show" 체크박스 변경
TObjectPtr< class UImageButton > Btn_Submit
Submit 버튼 (중앙) - Next와 전환
void OnAnswerTextChanged(const FText &Text)
답변 입력란 텍스트 변경 시 호출 (실시간 Submit 버튼 상태 업데이트)
void OnClickSubmit()
Submit 버튼 클릭
TObjectPtr< class UTextureButton > Button_NextArrow
다음 질문 버튼 (▶)
TObjectPtr< class UTextureButton > Button_PrevArrow
이전 질문 버튼 (◀)
TObjectPtr< class UTextureButton > Btn_Close
팝업 닫기 버튼 (우측 상단)
TObjectPtr< class UCheckBox > Button_CheckToday
"Today do not show" 체크박스
void OnClickNext()
Next 버튼 클릭 (중앙 버튼)
TObjectPtr< class UImageButton > Btn_Next
Next 버튼 (중앙, 초록색) - Submit과 전환
void OnClickClose()
닫기 버튼 클릭
void OnClickNextArrow()
다음 질문으로 이동 (우측 화살표)

다음을 참조함 : Btn_Close, Btn_Next, Btn_Submit, Button_CheckToday, Button_NextArrow, Button_PrevArrow, Edit_Answer, OnAnswerTextChanged(), OnCheckToday(), OnClickClose(), OnClickNext(), OnClickNextArrow(), OnClickPrevArrow(), OnClickSubmit().

+ 이 함수 내부에서 호출하는 함수들에 대한 그래프입니다.:

◆ NativeTick()

void UBasePopup::NativeTick ( const FGeometry &  MyGeometry,
float  InDeltaTime 
)
overridevirtualinherited

UBasePopup.cpp 파일의 7 번째 라인에서 정의되었습니다.

8{
9 Super::NativeTick(MyGeometry, InDeltaTime);
10
11 if (bIsOpenAnim)
12 {
13 UpdateAnimation(InDeltaTime);
14 }
15}
bool bIsOpenAnim
애니메이션 재생 중 여부
Definition UBasePopup.h:57
void UpdateAnimation(float InDeltaTime)
스크립트 오픈 애니메이션 업데이트

다음을 참조함 : UBasePopup::bIsOpenAnim, UBasePopup::UpdateAnimation().

+ 이 함수 내부에서 호출하는 함수들에 대한 그래프입니다.:

◆ OnAnswerTextChanged()

void UPopup_InterviewHello::OnAnswerTextChanged ( const FText &  Text)
private

답변 입력란 텍스트 변경 시 호출 (실시간 Submit 버튼 상태 업데이트)

UPopup_InterviewHello.cpp 파일의 310 번째 라인에서 정의되었습니다.

311{
312 // 현재 질문의 답변을 실시간으로 TempAnswers에 저장
313 if (TempAnswers.IsValidIndex(CurQuestionIndex))
314 {
315 TempAnswers[CurQuestionIndex] = Text.ToString();
316 }
317
318 // Submit 버튼 상태 업데이트 (마지막 질문에서만 영향)
320}

다음을 참조함 : CurQuestionIndex, RefreshSubmitButtonState(), TempAnswers.

다음에 의해서 참조됨 : NativeConstruct().

+ 이 함수 내부에서 호출하는 함수들에 대한 그래프입니다.:
+ 이 함수를 호출하는 함수들에 대한 그래프입니다.:

◆ OnCheckToday()

void UPopup_InterviewHello::OnCheckToday ( bool  bIsChecked)
private

"Today do not show" 체크박스 변경

UPopup_InterviewHello.cpp 파일의 304 번째 라인에서 정의되었습니다.

305{
306 // 체크박스 상태만 저장 (실제 Config 저장은 Submit 성공 시)
307 bCheckTodayDoNotShow = bIsChecked;
308}
bool bCheckTodayDoNotShow
"Today do not show" 체크박스 상태 (Submit 시 사용)

다음을 참조함 : bCheckTodayDoNotShow.

다음에 의해서 참조됨 : NativeConstruct().

+ 이 함수를 호출하는 함수들에 대한 그래프입니다.:

◆ OnClickClose()

void UPopup_InterviewHello::OnClickClose ( )
private

닫기 버튼 클릭

UPopup_InterviewHello.cpp 파일의 283 번째 라인에서 정의되었습니다.

284{
285 // PopupManager를 통해 팝업 닫기
286 if (UPopupManager* PopupMgr = UPopupManager::Get(GetWorld()))
287 {
288 PopupMgr->HideCurrentPopup();
289
290 if (APlayerController* PC = GetWorld()->GetFirstPlayerController())
291 {
292 if (APlayerControl* PlayerControl = Cast<APlayerControl>(PC))
293 {
294 if (!PlayerControl->ShouldSkipTutorial())
295 {
296 // 튜토리얼 여부 화면 띄우기
297 PopupMgr->ShowPopup(EPopupType::AskTutorial);
298 }
299 }
300 }
301 }
302}
팝업 관리자

다음에 의해서 참조됨 : NativeConstruct().

+ 이 함수를 호출하는 함수들에 대한 그래프입니다.:

◆ OnClickNext()

void UPopup_InterviewHello::OnClickNext ( )
private

Next 버튼 클릭 (중앙 버튼)

UPopup_InterviewHello.cpp 파일의 230 번째 라인에서 정의되었습니다.

231{
233}

다음을 참조함 : OnClickNextArrow().

다음에 의해서 참조됨 : NativeConstruct().

+ 이 함수 내부에서 호출하는 함수들에 대한 그래프입니다.:
+ 이 함수를 호출하는 함수들에 대한 그래프입니다.:

◆ OnClickNextArrow()

void UPopup_InterviewHello::OnClickNextArrow ( )
private

다음 질문으로 이동 (우측 화살표)

UPopup_InterviewHello.cpp 파일의 212 번째 라인에서 정의되었습니다.

213{
214 // 현재 답변 저장
216
217 // 인덱스 증가
218 if (CurQuestionIndex < SavedQuestions.Num() - 1)
219 {
221
222 // UI 업데이트
223 RefreshUI();
227 }
228}
void SaveCurrentAnswer()
현재 질문의 답변을 TempAnswers에 저장

다음을 참조함 : CurQuestionIndex, RefreshArrowButton(), RefreshProgressBar(), RefreshSubmitButtonState(), RefreshUI(), SaveCurrentAnswer(), SavedQuestions.

다음에 의해서 참조됨 : NativeConstruct(), OnClickNext().

+ 이 함수 내부에서 호출하는 함수들에 대한 그래프입니다.:
+ 이 함수를 호출하는 함수들에 대한 그래프입니다.:

◆ OnClickPrevArrow()

void UPopup_InterviewHello::OnClickPrevArrow ( )
private

이전 질문으로 이동 (좌측 화살표)

UPopup_InterviewHello.cpp 파일의 194 번째 라인에서 정의되었습니다.

195{
196 // 현재 답변 저장
198
199 // 인덱스 감소
200 if (CurQuestionIndex > 0)
201 {
203
204 // UI 업데이트
205 RefreshUI();
209 }
210}

다음을 참조함 : CurQuestionIndex, RefreshArrowButton(), RefreshProgressBar(), RefreshSubmitButtonState(), RefreshUI(), SaveCurrentAnswer().

다음에 의해서 참조됨 : NativeConstruct().

+ 이 함수 내부에서 호출하는 함수들에 대한 그래프입니다.:
+ 이 함수를 호출하는 함수들에 대한 그래프입니다.:

◆ OnClickSubmit()

void UPopup_InterviewHello::OnClickSubmit ( )
private

Submit 버튼 클릭

UPopup_InterviewHello.cpp 파일의 235 번째 라인에서 정의되었습니다.

236{
237 // 마지막 답변 저장
239
240 // 모든 답변 검증
241 for (int32 i = 0; i < TempAnswers.Num(); ++i)
242 {
243 if (TempAnswers[i].TrimStartAndEnd().IsEmpty())
244 {
245 // 빈 답변이 있으면 Toast 메시지 표시
246 if (UDialogManager* DialogMgr = UDialogManager::Get(GetWorld()))
247 {
248 FString Message = FString::Printf( TEXT("Question %d is not answered. Please fill in all answers."), i + 1 );
249 DialogMgr->ShowToast(Message);
250 }
251 return;
252 }
253 }
254
255 // 답변 데이터 생성
256 TArray<FInterviewAnswerData> AnswerDataList;
257 const int32 UserId = ULingoGameHelper::GetUserId(GetWorld());
258
259 for (int32 i = 0; i < SavedQuestions.Num(); ++i)
260 {
261 FInterviewAnswerData AnswerData;
262 AnswerData.interview_id = SavedQuestions[i].Id;
263 AnswerData.answer = TempAnswers[i];
264 AnswerData.user_id = UserId;
265 AnswerDataList.Add(AnswerData);
266 }
267
268 // 네트워크 전송
269 if (UKLingoNetworkSystem* NetworkSystem = UKLingoNetworkSystem::Get(GetWorld()))
270 {
272 Request.answer = AnswerDataList;
273
274 NetworkSystem->RequestInterviewAnswer(
275 Request,
276 FResponseInterviewAnswerDelegate::CreateUObject(
278 )
279 );
280 }
281}
토스트 메시지와 같은 간단한 다이얼로그 위젯의 표시를 관리하는 LocalPlayer 서브시스템입니다.
KLingo 서버와의 HTTP 요청을 중재하는 게임 인스턴스 서브시스템입니다.
static int32 GetUserId(const UObject *WorldContextObject)
void OnResponseInterviewAnswer(FResponseInterviewAnswer &ResponseData, bool bWasSuccessful)
Interview Answer API 응답 처리
TArray< FInterviewAnswerData > answer

다음을 참조함 : FInterviewAnswerData::answer, FRequestInterviewAnswer::answer, ULingoGameHelper::GetUserId(), FInterviewAnswerData::interview_id, OnResponseInterviewAnswer(), SaveCurrentAnswer(), SavedQuestions, TempAnswers, FInterviewAnswerData::user_id.

다음에 의해서 참조됨 : NativeConstruct().

+ 이 함수 내부에서 호출하는 함수들에 대한 그래프입니다.:
+ 이 함수를 호출하는 함수들에 대한 그래프입니다.:

◆ OnResponseInterviewAnswer()

void UPopup_InterviewHello::OnResponseInterviewAnswer ( FResponseInterviewAnswer ResponseData,
bool  bWasSuccessful 
)
private

Interview Answer API 응답 처리

UPopup_InterviewHello.cpp 파일의 322 번째 라인에서 정의되었습니다.

323{
324 if (bWasSuccessful)
325 {
326 PRINTLOG(TEXT("[UPopup_InterviewHello] Interview Answer SUCCESS"));
327
328 // "Today do not show" 체크되어 있으면 오늘 날짜 저장
330 {
331 const int32 UserId = ULingoGameHelper::GetUserId(GetWorld());
332
333 // 현재 날짜를 "YYYY-MM-DD" 형식으로 저장
334 const FDateTime Now = FDateTime::Now();
335 const FString TodayDate = FString::Printf(TEXT("%04d-%02d-%02d"), Now.GetYear(), Now.GetMonth(), Now.GetDay());
336
337 UConfigLibrary::SetUserString(UserId, TEXT("InterviewSkipDate"), TodayDate);
338
339 if (auto DM = UDialogManager::Get(GetWorld()))
340 {
341 DM->ShowToast(TEXT("Do not show again setting complete"));
342 }
343
344 PRINTLOG(TEXT("[UPopup_InterviewHello] 'Today do not show' saved for User %d, Date: %s"), UserId, *TodayDate);
345 }
346
347 // 성공 시 튜터 메시지 표시
348 if (auto BM = UBroadcastManager::Get(GetWorld()))
349 {
350 BM->SendTutorMessage( FText::FromString(TEXT("Interview answers submitted successfully!")) );
351 }
352
353 // 팝업 닫기
354 if (UPopupManager* PopupMgr = UPopupManager::Get(GetWorld()))
355 {
356 PopupMgr->HideCurrentPopup();
357
358 // 튜토리얼 완료 여부 확인 후 조건부로 AskTutorial 표시
359 if (APlayerController* PC = GetWorld()->GetFirstPlayerController())
360 {
361 if (APlayerControl* PlayerControl = Cast<APlayerControl>(PC))
362 {
363 if (!PlayerControl->ShouldSkipTutorial())
364 {
365 // 튜토리얼을 아직 안 했으면 AskTutorial 팝업 표시
366 PopupMgr->ShowPopup(EPopupType::AskTutorial);
367 }
368 }
369 }
370 }
371 }
372 else
373 {
374 PRINTLOG(TEXT("[UPopup_InterviewHello] Interview Answer FAILED"));
375 }
376}
#define PRINTLOG(fmt,...)
Definition GameLogging.h:30
static void SetUserString(int32 UserId, const FString &Key, const FString &Value, bool bAutoSave=true)
유저별 문자열 설정 저장

다음을 참조함 : bCheckTodayDoNotShow, ULingoGameHelper::GetUserId(), PRINTLOG, UConfigLibrary::SetUserString().

다음에 의해서 참조됨 : OnClickSubmit().

+ 이 함수 내부에서 호출하는 함수들에 대한 그래프입니다.:
+ 이 함수를 호출하는 함수들에 대한 그래프입니다.:

◆ OpenAnimation()

void UBasePopup::OpenAnimation ( )
inherited

팝업 오픈 애니메이션을 재생합니다

UBasePopup.cpp 파일의 17 번째 라인에서 정의되었습니다.

18{
19 if (!IsInViewport())
20 {
21 AddToViewport();
22 }
23
24 // 팝업 오픈 사운드 재생 (None이 아닐 때만)
26 {
27 if (UGameSoundManager* SoundManager = UGameSoundManager::Get(this))
28 {
29 SoundManager->PlaySound2D(OpenAnimSound);
30 }
31 }
32
33 // 블루프린트에서 정의한 애니메이션이 있으면 해당 애니메이션 재생
35 {
36 PlayAnimation(BlueprintOpenAnimation);
37 return;
38 }
39
40 // 블루프린트 애니메이션이 없으면 기본 스크립트 애니메이션 사용
41 SetRenderTransformPivot(OpenPivot);
42 SetRenderScale(FVector2D(OpenStartScale, OpenStartScale));
43
44 bIsOpenAnim = OpenDuration > KINDA_SMALL_NUMBER;
45 OpenElapsedTime = 0.0f;
46
47 if (!bIsOpenAnim)
48 {
49 SetRenderScale(FVector2D(OpenTargetScale, OpenTargetScale));
50 }
51}
EGameSoundType OpenAnimSound
팝업 오픈 시 재생될 사운드 타입
Definition UBasePopup.h:96
float OpenDuration
애니메이션 지속 시간
Definition UBasePopup.h:64
float OpenElapsedTime
경과 시간
Definition UBasePopup.h:60
float OpenStartScale
시작 스케일
Definition UBasePopup.h:68
FVector2D OpenPivot
애니메이션 중심점 (0~1 범위)
Definition UBasePopup.h:76
float OpenTargetScale
목표 스케일
Definition UBasePopup.h:72
UWidgetAnimation * BlueprintOpenAnimation
블루프린트에서 정의한 오픈 애니메이션
Definition UBasePopup.h:45
게임 내 모든 사운드 재생을 관리하는 중앙 사운드 관리 서브시스템입니다.

다음을 참조함 : UBasePopup::bIsOpenAnim, UBasePopup::BlueprintOpenAnimation, None, UBasePopup::OpenAnimSound, UBasePopup::OpenDuration, UBasePopup::OpenElapsedTime, UBasePopup::OpenPivot, UBasePopup::OpenStartScale, UBasePopup::OpenTargetScale.

◆ RefreshArrowButton()

void UPopup_InterviewHello::RefreshArrowButton ( )
private

Prev/Next 화살표 버튼 표시/숨김 처리

UPopup_InterviewHello.cpp 파일의 114 번째 라인에서 정의되었습니다.

115{
116 // Prev 버튼: 첫 번째 질문이 아닐 때만 표시
117 Button_PrevArrow->SetVisibility( CurQuestionIndex > 0 ? ESlateVisibility::Visible : ESlateVisibility::Hidden );
118
119 // Next 버튼: 마지막 질문이 아닐 때만 표시
120 Button_NextArrow->SetVisibility( CurQuestionIndex < SavedQuestions.Num() - 1 ? ESlateVisibility::Visible : ESlateVisibility::Hidden );
121}

다음을 참조함 : Button_NextArrow, Button_PrevArrow, CurQuestionIndex, SavedQuestions.

다음에 의해서 참조됨 : InitPopup(), OnClickNextArrow(), OnClickPrevArrow().

+ 이 함수를 호출하는 함수들에 대한 그래프입니다.:

◆ RefreshProgressBar()

void UPopup_InterviewHello::RefreshProgressBar ( )
private

Progress Bar 업데이트

UPopup_InterviewHello.cpp 파일의 169 번째 라인에서 정의되었습니다.

170{
171 if (ProgressBar_Question && SavedQuestions.Num() > 0)
172 {
173 float Progress = static_cast<float>(CurQuestionIndex + 1) / static_cast<float>(SavedQuestions.Num());
174 ProgressBar_Question->SetPercent(Progress);
175 }
176}
TObjectPtr< class UProgressBar > ProgressBar_Question
질문 진행률 표시

다음을 참조함 : CurQuestionIndex, ProgressBar_Question, SavedQuestions.

다음에 의해서 참조됨 : InitPopup(), OnClickNextArrow(), OnClickPrevArrow().

+ 이 함수를 호출하는 함수들에 대한 그래프입니다.:

◆ RefreshSubmitButtonState()

void UPopup_InterviewHello::RefreshSubmitButtonState ( )
private

Submit 버튼 활성화 상태 업데이트

UPopup_InterviewHello.cpp 파일의 123 번째 라인에서 정의되었습니다.

124{
125 // 모든 답변이 채워졌는지 확인
126 bool bAllAnswered = true;
127 for (const FString& Answer : TempAnswers)
128 {
129 if (Answer.TrimStartAndEnd().IsEmpty())
130 {
131 bAllAnswered = false;
132 break;
133 }
134 }
135
136 // 마지막 질문인지 확인
137 bool bIsLastQuestion = (CurQuestionIndex == SavedQuestions.Num() - 1);
138
139 // 버튼 표시/숨김 및 활성화 상태 전환
140 if (bIsLastQuestion)
141 {
142 // 마지막 질문이면 무조건 Submit 표시
143 if (Btn_Submit)
144 {
145 Btn_Submit->SetVisibility(ESlateVisibility::Visible);
146 // 모든 답변이 완료되었을 때만 활성화
147 Btn_Submit->SetIsEnabled(bAllAnswered);
148 }
149
150 if (Btn_Next)
151 {
152 Btn_Next->SetVisibility(ESlateVisibility::Hidden);
153 }
154 }
155 else
156 {
157 // 마지막 질문이 아니면 Next 표시
158 if (Btn_Next)
159 {
160 Btn_Next->SetVisibility(ESlateVisibility::Visible);
161 }
162 if (Btn_Submit)
163 {
164 Btn_Submit->SetVisibility(ESlateVisibility::Hidden);
165 }
166 }
167}

다음을 참조함 : Btn_Next, Btn_Submit, CurQuestionIndex, SavedQuestions, TempAnswers.

다음에 의해서 참조됨 : InitPopup(), OnAnswerTextChanged(), OnClickNextArrow(), OnClickPrevArrow().

+ 이 함수를 호출하는 함수들에 대한 그래프입니다.:

◆ RefreshUI()

void UPopup_InterviewHello::RefreshUI ( )
private

현재 질문과 답변을 UI에 반영

UPopup_InterviewHello.cpp 파일의 93 번째 라인에서 정의되었습니다.

94{
95 // 유효성 체크
96 if (!SavedQuestions.IsValidIndex(CurQuestionIndex))
97 {
98 PRINTLOG(TEXT("[UPopup_InterviewHello] RefreshUI - Invalid CurrentQuestionIndex: %d"), CurQuestionIndex);
99 return;
100 }
101
103
104 // 질문 텍스트 업데이트
105 if (TXt_Question)
106 {
107 TXt_Question->SetText(FText::FromString(CurrentQuestion.Eng));
108 }
109
110 // 현재 질문의 답변 불러오기
112}
TObjectPtr< class UTextBlock > TXt_Question
현재 질문 텍스트 (영어)
void LoadCurrentAnswer()
TempAnswers에서 현재 질문의 답변을 불러와 Edit_Answer에 표시

다음을 참조함 : CurQuestionIndex, FInterviewQuestionData::Eng, LoadCurrentAnswer(), PRINTLOG, SavedQuestions, TXt_Question.

다음에 의해서 참조됨 : InitPopup(), OnClickNextArrow(), OnClickPrevArrow().

+ 이 함수 내부에서 호출하는 함수들에 대한 그래프입니다.:
+ 이 함수를 호출하는 함수들에 대한 그래프입니다.:

◆ SaveCurrentAnswer()

void UPopup_InterviewHello::SaveCurrentAnswer ( )
private

현재 질문의 답변을 TempAnswers에 저장

UPopup_InterviewHello.cpp 파일의 178 번째 라인에서 정의되었습니다.

179{
180 if (!Edit_Answer || !TempAnswers.IsValidIndex(CurQuestionIndex))
181 return;
182
183 TempAnswers[CurQuestionIndex] = Edit_Answer->GetText().ToString();
184}

다음을 참조함 : CurQuestionIndex, Edit_Answer, TempAnswers.

다음에 의해서 참조됨 : OnClickNextArrow(), OnClickPrevArrow(), OnClickSubmit().

+ 이 함수를 호출하는 함수들에 대한 그래프입니다.:

◆ ShouldSkipInterviewToday()

bool UPopup_InterviewHello::ShouldSkipInterviewToday ( const UObject *  WorldContextObject)
static

오늘 Interview 팝업을 건너뛸지 확인

매개변수
WorldContextObjectWorld 컨텍스트 객체
반환값
true: 오늘은 건너뜀, false: 보여줌

UPopup_InterviewHello.cpp 파일의 378 번째 라인에서 정의되었습니다.

379{
380 const int32 UserId = ULingoGameHelper::GetUserId(WorldContextObject);
381
382 // 저장된 날짜 읽기
383 const FString SavedDate = UConfigLibrary::GetUserString(UserId, TEXT("InterviewSkipDate"), TEXT(""));
384 if (SavedDate.IsEmpty())
385 {
386 // 저장된 날짜 없음 → 보여줌
387 return false;
388 }
389
390 // 오늘 날짜 생성
391 const FDateTime Now = FDateTime::Now();
392 const FString TodayDate = FString::Printf(TEXT("%04d-%02d-%02d"), Now.GetYear(), Now.GetMonth(), Now.GetDay());
393
394 // 날짜 비교: 저장된 날짜 == 오늘 날짜 → Skip
395 if (SavedDate == TodayDate)
396 {
397 PRINTLOG(TEXT("[UPopup_InterviewHello] Skipping Interview today for User %d (Saved Date: %s)"), UserId, *SavedDate);
398 return true; // 오늘은 건너뜀
399 }
400
401 // 날짜가 다르면 → 보여줌
402 return false;
403}
static FString GetUserString(int32 UserId, const FString &Key, const FString &DefaultValue=TEXT(""))
유저별 문자열 설정 읽기

다음을 참조함 : ULingoGameHelper::GetUserId(), UConfigLibrary::GetUserString(), PRINTLOG.

다음에 의해서 참조됨 : AMainLevelScriptActor::RequestInterviewHello().

+ 이 함수 내부에서 호출하는 함수들에 대한 그래프입니다.:
+ 이 함수를 호출하는 함수들에 대한 그래프입니다.:

◆ UpdateAnimation()

void UBasePopup::UpdateAnimation ( float  InDeltaTime)
protectedinherited

스크립트 오픈 애니메이션 업데이트

UBasePopup.cpp 파일의 53 번째 라인에서 정의되었습니다.

54{
55 if (!bIsOpenAnim)
56 {
57 return;
58 }
59
60 OpenElapsedTime += InDeltaTime;
61
62 const float Alpha = FMath::Clamp(OpenElapsedTime / OpenDuration, 0.0f, 1.0f);
63 const float EasedAlpha = FEaseHelper::Ease(Alpha, OpenEaseType);
64 const float NewScale = FMath::Lerp(OpenStartScale, OpenTargetScale, EasedAlpha);
65
66 SetRenderScale(FVector2D(NewScale, NewScale));
67
68 if (Alpha >= 1.0f)
69 {
70 bIsOpenAnim = false;
71 }
72}
EEaseType OpenEaseType
Easing 타입
Definition UBasePopup.h:83
static float Ease(float Alpha, EEaseType Type)
Definition FEaseHelper.h:45

다음을 참조함 : UBasePopup::bIsOpenAnim, FEaseHelper::Ease(), UBasePopup::OpenDuration, UBasePopup::OpenEaseType, UBasePopup::OpenElapsedTime, UBasePopup::OpenStartScale, UBasePopup::OpenTargetScale.

다음에 의해서 참조됨 : UBasePopup::NativeTick().

+ 이 함수 내부에서 호출하는 함수들에 대한 그래프입니다.:
+ 이 함수를 호출하는 함수들에 대한 그래프입니다.:

멤버 데이터 문서화

◆ bAllowPlayerControl

bool UBasePopup::bAllowPlayerControl = false
inherited

이 팝업이 활성화되어 있을 때 플레이어 조작을 허용할지 여부

true면 이 팝업이 열려있어도 플레이어가 캐릭터를 조작할 수 있습니다. 기본값은 false (대부분의 팝업은 플레이어 조작을 차단)

UBasePopup.h 파일의 105 번째 라인에서 정의되었습니다.

다음에 의해서 참조됨 : UPopup_DailyStudy::NativeConstruct(), UPopup_SpeakQuestJudes::NativeConstruct().

◆ bCheckTodayDoNotShow

bool UPopup_InterviewHello::bCheckTodayDoNotShow = false
private

"Today do not show" 체크박스 상태 (Submit 시 사용)

UPopup_InterviewHello.h 파일의 168 번째 라인에서 정의되었습니다.

다음에 의해서 참조됨 : OnCheckToday(), OnResponseInterviewAnswer().

◆ bIsOpenAnim

bool UBasePopup::bIsOpenAnim = false
protectedinherited

애니메이션 재생 중 여부

UBasePopup.h 파일의 57 번째 라인에서 정의되었습니다.

다음에 의해서 참조됨 : UBasePopup::NativeTick(), UBasePopup::OpenAnimation(), UBasePopup::UpdateAnimation().

◆ BlueprintOpenAnimation

UWidgetAnimation* UBasePopup::BlueprintOpenAnimation
protectedinherited

블루프린트에서 정의한 오픈 애니메이션

설정된 경우 스크립트 애니메이션 대신 이 애니메이션을 재생합니다.

UBasePopup.h 파일의 45 번째 라인에서 정의되었습니다.

다음에 의해서 참조됨 : UBasePopup::OpenAnimation().

◆ Btn_Close

TObjectPtr<class UTextureButton> UPopup_InterviewHello::Btn_Close
protected

팝업 닫기 버튼 (우측 상단)

UPopup_InterviewHello.h 파일의 151 번째 라인에서 정의되었습니다.

다음에 의해서 참조됨 : NativeConstruct().

◆ Btn_Next

TObjectPtr<class UImageButton> UPopup_InterviewHello::Btn_Next
protected

Next 버튼 (중앙, 초록색) - Submit과 전환

UPopup_InterviewHello.h 파일의 139 번째 라인에서 정의되었습니다.

다음에 의해서 참조됨 : NativeConstruct(), RefreshSubmitButtonState().

◆ Btn_Submit

TObjectPtr<class UImageButton> UPopup_InterviewHello::Btn_Submit
protected

Submit 버튼 (중앙) - Next와 전환

UPopup_InterviewHello.h 파일의 143 번째 라인에서 정의되었습니다.

다음에 의해서 참조됨 : NativeConstruct(), RefreshSubmitButtonState().

◆ Button_CheckToday

TObjectPtr<class UCheckBox> UPopup_InterviewHello::Button_CheckToday
protected

"Today do not show" 체크박스

UPopup_InterviewHello.h 파일의 147 번째 라인에서 정의되었습니다.

다음에 의해서 참조됨 : NativeConstruct().

◆ Button_NextArrow

TObjectPtr<class UTextureButton> UPopup_InterviewHello::Button_NextArrow
protected

다음 질문 버튼 (▶)

UPopup_InterviewHello.h 파일의 135 번째 라인에서 정의되었습니다.

다음에 의해서 참조됨 : NativeConstruct(), RefreshArrowButton().

◆ Button_PrevArrow

TObjectPtr<class UTextureButton> UPopup_InterviewHello::Button_PrevArrow
protected

이전 질문 버튼 (◀)

UPopup_InterviewHello.h 파일의 131 번째 라인에서 정의되었습니다.

다음에 의해서 참조됨 : NativeConstruct(), RefreshArrowButton().

◆ CurQuestionIndex

int32 UPopup_InterviewHello::CurQuestionIndex = 0
private

현재 표시 중인 질문 인덱스 (0-based)

UPopup_InterviewHello.h 파일의 165 번째 라인에서 정의되었습니다.

다음에 의해서 참조됨 : InitPopup(), LoadCurrentAnswer(), OnAnswerTextChanged(), OnClickNextArrow(), OnClickPrevArrow(), RefreshArrowButton(), RefreshProgressBar(), RefreshSubmitButtonState(), RefreshUI(), SaveCurrentAnswer().

◆ Edit_Answer

TObjectPtr<class UEditableText> UPopup_InterviewHello::Edit_Answer
protected

플레이어 답변 입력란

UPopup_InterviewHello.h 파일의 123 번째 라인에서 정의되었습니다.

다음에 의해서 참조됨 : LoadCurrentAnswer(), NativeConstruct(), SaveCurrentAnswer().

◆ OpenAnimSound

EGameSoundType UBasePopup::OpenAnimSound = EGameSoundType::UI_PopupOpen
protectedinherited

팝업 오픈 시 재생될 사운드 타입

블루프린트에서 팝업별로 다른 사운드를 설정할 수 있습니다. None으로 설정하면 사운드를 재생하지 않습니다. 기본값은 UI_PopupOpen입니다.

UBasePopup.h 파일의 96 번째 라인에서 정의되었습니다.

다음에 의해서 참조됨 : UBasePopup::OpenAnimation().

◆ OpenDuration

float UBasePopup::OpenDuration = 0.2f
protectedinherited

애니메이션 지속 시간

UBasePopup.h 파일의 64 번째 라인에서 정의되었습니다.

다음에 의해서 참조됨 : UBasePopup::OpenAnimation(), UBasePopup::UpdateAnimation().

◆ OpenEaseType

EEaseType UBasePopup::OpenEaseType = EEaseType::EaseOutBack
protectedinherited

Easing 타입

애니메이션의 보간 곡선을 선택합니다. 기본값은 EaseOutBack (탄성 효과)

UBasePopup.h 파일의 83 번째 라인에서 정의되었습니다.

다음에 의해서 참조됨 : UBasePopup::UpdateAnimation().

◆ OpenElapsedTime

float UBasePopup::OpenElapsedTime = 0.0f
protectedinherited

경과 시간

UBasePopup.h 파일의 60 번째 라인에서 정의되었습니다.

다음에 의해서 참조됨 : UBasePopup::OpenAnimation(), UBasePopup::UpdateAnimation().

◆ OpenPivot

FVector2D UBasePopup::OpenPivot = FVector2D(0.5f, 0.5f)
protectedinherited

애니메이션 중심점 (0~1 범위)

UBasePopup.h 파일의 76 번째 라인에서 정의되었습니다.

다음에 의해서 참조됨 : UBasePopup::OpenAnimation().

◆ OpenStartScale

float UBasePopup::OpenStartScale = 0.8f
protectedinherited

시작 스케일

UBasePopup.h 파일의 68 번째 라인에서 정의되었습니다.

다음에 의해서 참조됨 : UBasePopup::OpenAnimation(), UBasePopup::UpdateAnimation().

◆ OpenTargetScale

float UBasePopup::OpenTargetScale = 1.0f
protectedinherited

목표 스케일

UBasePopup.h 파일의 72 번째 라인에서 정의되었습니다.

다음에 의해서 참조됨 : UBasePopup::OpenAnimation(), UBasePopup::UpdateAnimation().

◆ PopupType

EPopupType UBasePopup::PopupType
protectedinherited

UBasePopup.h 파일의 34 번째 라인에서 정의되었습니다.

다음에 의해서 참조됨 : UPopup_InputMsg::InitPopup(), UPopup_InputMsg::OnClickOk().

◆ ProgressBar_Question

TObjectPtr<class UProgressBar> UPopup_InterviewHello::ProgressBar_Question
protected

질문 진행률 표시

UPopup_InterviewHello.h 파일의 127 번째 라인에서 정의되었습니다.

다음에 의해서 참조됨 : RefreshProgressBar().

◆ SavedQuestions

TArray<FInterviewQuestionData> UPopup_InterviewHello::SavedQuestions
private

저장된 인터뷰 질문 데이터

UPopup_InterviewHello.h 파일의 159 번째 라인에서 정의되었습니다.

다음에 의해서 참조됨 : InitPopup(), OnClickNextArrow(), OnClickSubmit(), RefreshArrowButton(), RefreshProgressBar(), RefreshSubmitButtonState(), RefreshUI().

◆ TempAnswers

TArray<FString> UPopup_InterviewHello::TempAnswers
private

사용자가 입력한 답변 임시 저장 배열 (Questions.Num()과 크기 동일)

UPopup_InterviewHello.h 파일의 162 번째 라인에서 정의되었습니다.

다음에 의해서 참조됨 : InitPopup(), LoadCurrentAnswer(), OnAnswerTextChanged(), OnClickSubmit(), RefreshSubmitButtonState(), SaveCurrentAnswer().

◆ TXt_Question

TObjectPtr<class UTextBlock> UPopup_InterviewHello::TXt_Question
protected

현재 질문 텍스트 (영어)

UPopup_InterviewHello.h 파일의 119 번째 라인에서 정의되었습니다.

다음에 의해서 참조됨 : RefreshUI().

◆ Txt_Title

TObjectPtr<class UTextBlock> UPopup_InterviewHello::Txt_Title
protected

팝업 타이틀 텍스트 ("Interview")

UPopup_InterviewHello.h 파일의 115 번째 라인에서 정의되었습니다.


이 클래스에 대한 문서화 페이지는 다음의 파일들로부터 생성되었습니다.: