KLingo Project Documentation 1.0.0
Unreal Engine 5.6 C++ Project Documentation
로딩중...
검색중...
일치하는것 없음
UMainWidget.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
7#include "UMainWidget.h"
8#include "Input/Reply.h"
9#include "UPlayTimer.h"
10#include "UStateWidget.h"
11#include "UVoiceRecording.h"
12#include "ALingoGameState.h"
13#include "ALingoPlayerState.h"
14#include "ASpeakStageActor.h"
15#include "ChatWidget.h"
16#include "CompassWidget.h"
17#include "ULingoGameHelper.h"
18#include "UBroadcastManager.h"
19#include "GameLogging.h"
20#include "QuestOrderWidget.h"
21#include "UQuestInfoWidget.h"
22#include "USpeakWidget.h"
23#include "UFadeWidget.h"
24#include "URoomWidget.h"
25#include "Engine/World.h"
26#include "Components/Image.h"
27#include "Components/WidgetSwitcher.h"
28#include "Engine/Texture2D.h"
29#include "GameFramework/PlayerState.h"
30#include "GameFramework/PlayerController.h"
31
32#define AIM_TEXTURE_PATH TEXT("/Game/CustomContents/UI/UITexture/HookAim.HookAim")
33#define NO_AIM_TEXTURE_PATH TEXT("/Game/CustomContents/UI/UITexture/NoHookAim.NoHookAim")
34
35UMainWidget::UMainWidget(const FObjectInitializer& ObjectInitializer) : Super(ObjectInitializer)
36{
37 static ConstructorHelpers::FObjectFinder<UTexture2D> AimTextureFinder(AIM_TEXTURE_PATH);
38 if (AimTextureFinder.Succeeded())
39 HookAimTexture = AimTextureFinder.Object;
40
41 static ConstructorHelpers::FObjectFinder<UTexture2D> NoAimTextureFinder(NO_AIM_TEXTURE_PATH);
42 if (NoAimTextureFinder.Succeeded())
43 HookNoAimTexture = NoAimTextureFinder.Object;
44}
45
47{
48 Super::NativeConstruct();
49
50 // GameState 참조 가져오기
51 if (UWorld* World = GetWorld())
52 CachedGameState = World->GetGameState<ALingoGameState>();
53
54 if (auto BM = UBroadcastManager::Get(GetWorld()))
55 BM->OnUpdateMissionTimerState.AddDynamic(this, &UMainWidget::OnUpdateMissionTimerState);
56
57 StateWidget->InitWidget();
58 StateWidget->SetVisibility( ESlateVisibility::Collapsed);
59
60 RoomWidget->InitWidget();
61 RoomWidget->SetVisibility( ESlateVisibility::Collapsed);
62
63 QuestInfoWidget->SetVisibility( ESlateVisibility::Collapsed );
64
65 CompassWidget->SetVisibility( ESlateVisibility::Collapsed );
66
67 VoiceRecording->InitWidget();
68 VoiceRecording->SetVisibility( ESlateVisibility::Collapsed);
69
70 // 훅 타겟 인디케이터 초기 숨김
71 HookTargetIndicator->SetVisibility(ESlateVisibility::Hidden);
72
73 // SpeakWidget 초기 숨김 (BindWidgetOptional이므로 null 체크 필요)
74 SpeakWidget->SetWidgetVisibility(false);
76}
77
78void UMainWidget::NativeTick(const FGeometry& MyGeometry, float InDeltaTime)
79{
80 Super::NativeTick(MyGeometry, InDeltaTime);
81
83}
84
85void UMainWidget::SetMissionTimerState(bool bIsActive) const
86{
87 PlayTimer->SetVisibility(bIsActive ? ESlateVisibility::Visible : ESlateVisibility::Hidden);
88}
89
90void UMainWidget::UpdateStateWidget(int32 UserId, const FString& UserName)
91{
92 if ( UserName == "" )
93 return;
94
95 StateWidget->SetVisibility(ESlateVisibility::Visible);
96 StateWidget->UpdateUserName(UserId, UserName);
97}
98
99void UMainWidget::UpdateRoomWidget(int32 InRoomLevel, int64 InRoomId)
100{
101 if ( InRoomId <= 0 )
102 return;
103
104 RoomWidget->SetVisibility(ESlateVisibility::Visible);
105 RoomWidget->UpdateRoomInfo(InRoomLevel, InRoomId);
106}
107
108void UMainWidget::SendChatMessage(FResponseUserMe sendUser, const FText& inMessage, int32 PlayerIndex)
109{
110 // PRINTLOG(TEXT("[SendChat] UMainWidget::SendChatMessage - %s"), *inMessage.ToString());
111 ChatWidget->SendMessage(sendUser, inMessage, PlayerIndex);
112}
113
115{
116 ChatWidget->FocusInput();
117}
118
120{
121 if (!CachedGameState || !PlayTimer)
122 return;
123
124 PlayTimer->UpdateTimerText( CachedGameState->GetRemainMissionTime());
125}
126
127void UMainWidget::OnUpdateMissionTimerState(bool bIsActive, float TimeLimit)
128{
129 if (!CachedGameState)
130 {
131 if (UWorld* World = GetWorld())
132 CachedGameState = World->GetGameState<ALingoGameState>();
133 }
134
135 // GameState의 RemainMissionTime 업데이트
136 if (CachedGameState && bIsActive && TimeLimit > 0.0f)
138
139 // if (!QuestInfoWidget)
140 // return;
141
142 // QuestInfoWidget->SetVisibility(bIsActive ? ESlateVisibility::Visible : ESlateVisibility::Collapsed );
143
144 // HookTargetIndicator가 존재하는 경우에만 visibility 설정
146 HookTargetIndicator->SetVisibility(bIsActive ? ESlateVisibility::Visible : ESlateVisibility::Collapsed);
147
148 if (bIsActive)
149 {
150 WidgetSwitcher->SetActiveWidgetIndex(0);
151 // QuestInfoWidget->InitQuestInfo();
152 }
153
154 SetMissionTimerState(bIsActive);
155}
156
158{
159 if (!HookTargetIndicator || !HookTargetIndicator->IsVisible() )
160 return;
161
162 // 에임 상태에 따라 이미지 변경
163 HookTargetIndicator->SetBrushFromTexture(bIsAiming ? HookAimTexture : HookNoAimTexture );
164}
165
167{
168 WidgetSwitcher->SetActiveWidgetIndex(1);
169
170 ASpeakStageActor* SpeakStage = nullptr;
171 ALingoPlayerState* LocalPlayerState = nullptr;
172
173 const bool bCanShow =
174 CanShowSpeakWidget(SpeakStage, LocalPlayerState);
175 SpeakWidget->SetWidgetVisibility(bCanShow);
176
177 if ( bCanShow )
178 SpeakWidget->UpdateSpeakStage(SpeakStage, LocalPlayerState, StepIndex);
179}
180
181bool UMainWidget::CanShowSpeakWidget( ASpeakStageActor*& OutSpeakStage, ALingoPlayerState*& OutLocalPlayerState) const
182{
183 OutSpeakStage = ULingoGameHelper::GetSpeakStageActor(this);
184 if (!OutSpeakStage)
185 return false;
186
187 ALingoPlayerState* CurrentSpeaker = OutSpeakStage->GetCurrentSpeaker();
188 if (!CurrentSpeaker)
189 return false;
190
191 APlayerController* LocalPC = GetWorld()->GetFirstPlayerController();
192 if (!LocalPC)
193 return false;
194
195 OutLocalPlayerState = LocalPC->GetPlayerState<ALingoPlayerState>();
196 if (!OutLocalPlayerState)
197 return false;
198
199 return (OutLocalPlayerState == CurrentSpeaker);
200}
201
203{
204 ChatWidget->SetVisibility(ESlateVisibility::Visible);
205}
206
207void UMainWidget::FadeOut(float Duration)
208{
209 if (!FadeWidget)
210 {
211 PRINTLOG(TEXT("UMainWidget::FadeOut - FadeWidget is null"));
212 return;
213 }
214
215 FadeWidget->FadeOut(Duration);
216}
217
218void UMainWidget::FadeIn(float Duration)
219{
220 if (!FadeWidget)
221 {
222 PRINTLOG(TEXT("UMainWidget::FadeIn - FadeWidget is null"));
223 return;
224 }
225
226 FadeWidget->FadeIn(Duration);
227}
YiSan 전반에서 사용하는 공용 인터페이스를 선언합니다.
#define PRINTLOG(fmt,...)
Definition GameLogging.h:30
화면 페이드 인/아웃 효과를 제공하는 위젯
#define AIM_TEXTURE_PATH
#define NO_AIM_TEXTURE_PATH
void UpdateRemainMissionTime(const float InTimeLimit)
Speak Stage 시스템
FORCEINLINE class ALingoPlayerState * GetCurrentSpeaker() const
static class ASpeakStageActor * GetSpeakStageActor(const UObject *WorldContextObject)
void OnUpdateMissionTimerState(bool bIsActive, float TimeLimit)
미션 타이머 상태 변경 핸들러
TObjectPtr< class UCompassWidget > CompassWidget
@breif Compass
void SendChatMessage(FResponseUserMe sendUser, const FText &inMessage, int32 PlayerIndex)
TObjectPtr< class UPlayTimer > PlayTimer
플레이 타이머 위젯 (BindWidget)
Definition UMainWidget.h:80
TObjectPtr< class UChatWidget > ChatWidget
@breif Chat Widget
void FadeOut(float Duration=0.5f)
페이드 아웃 효과 시작 (화면이 어두워짐)
TObjectPtr< class UImage > HookTargetIndicator
훅 가능 대상 표시 위젯 (옵션, BindWidgetOptional)
void UpdateHookState(bool bIsAiming)
훅 인디케이터 상태 업데이트 (에임/비에임)
virtual void NativeTick(const FGeometry &MyGeometry, float InDeltaTime) override
매 프레임 호출되어 타이머를 업데이트합니다.
TObjectPtr< class UWidgetSwitcher > WidgetSwitcher
Definition UMainWidget.h:90
void UpdateSpeakWidget(int32 StepIndex)
TObjectPtr< class UTexture2D > HookNoAimTexture
훅 타겟 미감지 시 이미지 (회색)
void SetMissionTimerState(bool bIsActive) const
TObjectPtr< class UQuestInfoWidget > QuestInfoWidget
void UpdateStateWidget(int32 UserId, const FString &UserName)
void SetFocusOnChat()
void UpdateTimerDisplay() const
타이머 텍스트를 업데이트합니다.
void FadeIn(float Duration=0.5f)
페이드 인 효과 시작 (화면이 밝아짐)
TObjectPtr< class ALingoGameState > CachedGameState
GameState 참조 캐싱
TObjectPtr< class UFadeWidget > FadeWidget
페이드 인/아웃 위젯 (옵션, BindWidgetOptional)
bool CanShowSpeakWidget(ASpeakStageActor *&OutSpeakStage, ALingoPlayerState *&OutLocalPlayerState) const
void UpdateRoomWidget(int32 InRoomLevel, int64 InRoomId)
virtual void NativeConstruct() override
위젯 초기화
void UpdateChatWidget()
UMainWidget(const FObjectInitializer &ObjectInitializer)
TObjectPtr< class UTexture2D > HookAimTexture
훅 타겟 감지 시 이미지 (파란색)
TObjectPtr< class UVoiceRecording > VoiceRecording
TObjectPtr< class USpeakWidget > SpeakWidget
Speak Stage UI 위젯 (옵션, BindWidgetOptional)
Definition UMainWidget.h:94
TObjectPtr< class URoomWidget > RoomWidget
Definition UMainWidget.h:83
TObjectPtr< class UStateWidget > StateWidget
Definition UMainWidget.h:86