Payback 0.0.1
CK Graduation Project
로딩중...
검색중...
일치하는것 없음
UConstellationBuffHUDWidget 클래스 참조

#include <ConstellationBuffHUDWidget.h>

UConstellationBuffHUDWidget에 대한 상속 다이어그램 :
Inheritance graph
UConstellationBuffHUDWidget에 대한 협력 다이어그램:
Collaboration graph

클래스

struct  FTrackedSlot
 

Protected 멤버 함수

virtual void NativeConstruct () override
 
virtual void NativeDestruct () override
 
virtual void NativeTick (const FGeometry &MyGeometry, float InDeltaTime) override
 
void HandleBuffApplied (USituationBase *Situation)
 
void HandleBuffRemoved (USituationBase *Situation)
 
UConstellationBuffSlotWidgetFindSlot (const USituationBase *Situation) const
 
void ReflowSlots ()
 
- UUserWidgetBase(으)로부터 상속된 Protected 멤버 함수
virtual void OnWidgetActivated ()
 
virtual void OnWidgetDeactivated ()
 
void OnPushedToLayer_Internal ()
 
void OnPoppedFromLayer_Internal ()
 
void OnActivated_Internal ()
 
void OnDeactivated_Internal ()
 

Protected 속성

TObjectPtr< UPanelWidget > BuffSlotContainer
 
TSubclassOf< UConstellationBuffSlotWidgetBuffSlotClass
 
int32 SlotsPerRow = 5
 
- UUserWidgetBase(으)로부터 상속된 Protected 속성
EWidgetState WidgetState
 
TObjectPtr< UAbilitySystemComponent > ASC
 
FGameplayTag LayerTag
 
bool bPrimary = false
 
TObjectPtr< UWidgetAnimation > AppearanceAnim
 
TObjectPtr< UWidgetAnimation > DisappearanceAnim
 

Private 속성

TArray< FTrackedSlotTrackedSlots
 

추가로 상속된 멤버들

- UUserWidgetBase(으)로부터 상속된 Public 멤버 함수
virtual void SetAbilitySystemComponent (AActor *InOwner)
 
virtual UAbilitySystemComponent * GetAbilitySystemComponent () const override
 
virtual void OnPushedToLayer ()
 
virtual void OnPoppedFromLayer ()
 
virtual void OnActivated ()
 
virtual void OnDeactivated ()
 
void Activate ()
 
void Deactivate ()
 
FORCEINLINE FGameplayTag GetLayerTag () const
 
FORCEINLINE void SetLayerTag (const FGameplayTag InTag)
 
FORCEINLINE bool IsPrimary () const
 
FORCEINLINE void SetPrimary (const bool InPrimary)
 
FORCEINLINE EWidgetState GetWidgetState () const
 
FORCEINLINE void SetWidgetState (const EWidgetState InState)
 
FORCEINLINE UWaitForWidgetActivationGetActivationHandle ()
 
FORCEINLINE bool HasAppearanceAnim () const
 
FORCEINLINE bool HasDisappearanceAnim () const
 

상세한 설명

채팅창 아래에 걸리는 활성 버프 아이콘 줄. 슬롯 생성/제거와 남은 시간 갱신을 담당한다.

버프는 성좌가 아니라 상황 카드가 소유하므로, 슬롯 하나는 장착된 상황 하나에 대응한다.

멤버 함수 문서화

◆ FindSlot()

UConstellationBuffSlotWidget * UConstellationBuffHUDWidget::FindSlot ( const USituationBase Situation) const
protected
162{
163 auto MatchesSituation = [Situation](const FTrackedSlot& Tracked)
164 {
165 return Tracked.Situation == Situation;
166 };
167
168 const FTrackedSlot* Found = TrackedSlots.FindByPredicate(MatchesSituation);
169
170 return Found ? Found->Slot.Get() : nullptr;
171}
TArray< FTrackedSlot > TrackedSlots
Definition ConstellationBuffHUDWidget.h:59
이 함수를 호출하는 함수들에 대한 그래프입니다.:

◆ HandleBuffApplied()

void UConstellationBuffHUDWidget::HandleBuffApplied ( USituationBase Situation)
protected
54{
55 if (Situation == nullptr || BuffSlotContainer == nullptr)
56 {
57 return;
58 }
59
60 // 같은 카드가 다음 주기에 또 발동한 경우엔 슬롯을 새로 만들지 않는다. 남은 시간은 틱에서 알아서 따라간다.
61 auto MatchesSituation = [Situation](const FTrackedSlot& Tracked)
62 {
63 return Tracked.Situation == Situation;
64 };
65
66 if (TrackedSlots.ContainsByPredicate(MatchesSituation))
67 {
68 return;
69 }
70
71 if (BuffSlotClass == nullptr)
72 {
73 LOG_WARNING(LogCK, "BuffSlotClass 가 비어 있어 버프 슬롯을 만들 수 없습니다.");
74 return;
75 }
76
77 UConstellationBuffSlotWidget* NewSlot = CreateWidget<UConstellationBuffSlotWidget>(GetOwningPlayer(), BuffSlotClass);
78
79 if (NewSlot == nullptr)
80 {
81 return;
82 }
83
84 // 일러스트는 소프트 참조라 표시 직전에 로드한다.
85 NewSlot->SetupSlot(Situation, Situation->GetSituationData().Illustration_Path.LoadSynchronous());
86
87 // 자식 하나만 받는 패널(Border/SizeBox/ScaleBox 등)이면 두 번째부터 nullptr 을 돌려주고 조용히 실패한다.
88 if (BuffSlotContainer->AddChild(NewSlot) == nullptr)
89 {
90 LOG_ERROR(LogCK, "BuffSlotContainer(%s)에 슬롯을 붙이지 못했습니다. 자식을 여러 개 받는 패널(HorizontalBox 등)로 바꿔야 합니다.", *BuffSlotContainer->GetClass()->GetName());
91 return;
92 }
93
94 FTrackedSlot Tracked;
95 Tracked.Situation = Situation;
96 Tracked.Slot = NewSlot;
97 TrackedSlots.Add(Tracked);
98
100}
#define LOG_ERROR(Category, Format,...)
Definition CK_UE.h:40
#define LOG_WARNING(Category, Format,...)
Definition CK_UE.h:39
TObjectPtr< UPanelWidget > BuffSlotContainer
Definition ConstellationBuffHUDWidget.h:41
TSubclassOf< UConstellationBuffSlotWidget > BuffSlotClass
Definition ConstellationBuffHUDWidget.h:44
void ReflowSlots()
Definition ConstellationBuffHUDWidget.cpp:103
Definition ConstellationBuffSlotWidget.h:22
void SetupSlot(USituationBase *InSituation, UTexture2D *InIcon)
Definition ConstellationBuffSlotWidget.cpp:13
FORCEINLINE const FDT_SituationTable & GetSituationData() const
Definition SituationBase.h:67
TSoftObjectPtr< UTexture2D > Illustration_Path
Definition DT_SituationTable.h:62
이 함수 내부에서 호출하는 함수들에 대한 그래프입니다.:
이 함수를 호출하는 함수들에 대한 그래프입니다.:

◆ HandleBuffRemoved()

void UConstellationBuffHUDWidget::HandleBuffRemoved ( USituationBase Situation)
protected
138{
139 if (Situation == nullptr)
140 {
141 return;
142 }
143
144 if (UConstellationBuffSlotWidget* RemovedSlot = FindSlot(Situation))
145 {
146 RemovedSlot->RemoveFromParent();
147 }
148
149 auto MatchesSituation = [Situation](const FTrackedSlot& Tracked)
150 {
151 return Tracked.Situation == Situation;
152 };
153
154 TrackedSlots.RemoveAll(MatchesSituation);
155
156 // 중간 슬롯이 빠지면 뒤 슬롯을 앞으로 당겨 빈칸을 없앤다.
157 ReflowSlots();
158}
UConstellationBuffSlotWidget * FindSlot(const USituationBase *Situation) const
Definition ConstellationBuffHUDWidget.cpp:161
이 함수 내부에서 호출하는 함수들에 대한 그래프입니다.:
이 함수를 호출하는 함수들에 대한 그래프입니다.:

◆ NativeConstruct()

void UConstellationBuffHUDWidget::NativeConstruct ( )
overrideprotectedvirtual
18{
19 Super::NativeConstruct();
20
21 USituationManagementSubsystem* SituationSubsystem = GetWorld()->GetSubsystem<USituationManagementSubsystem>();
22
23 if (SituationSubsystem == nullptr)
24 {
25 return;
26 }
27
30
31 // HUD 가 뒤늦게 생성돼도 이미 걸려 있는 버프를 놓치지 않도록 초기 상태를 채운다.
32 for (USituationBase* Situation : SituationSubsystem->GetActiveSituations())
33 {
34 HandleBuffApplied(Situation);
35 }
36}
void HandleBuffRemoved(USituationBase *Situation)
Definition ConstellationBuffHUDWidget.cpp:137
void HandleBuffApplied(USituationBase *Situation)
Definition ConstellationBuffHUDWidget.cpp:53
Definition SituationBase.h:31
Definition SituationManagementSubsystem.h:36
FOnSituationBuffChanged OnSituationBuffApplied
Definition SituationManagementSubsystem.h:64
FOnSituationBuffChanged OnSituationBuffRemoved
Definition SituationManagementSubsystem.h:65
이 함수 내부에서 호출하는 함수들에 대한 그래프입니다.:

◆ NativeDestruct()

void UConstellationBuffHUDWidget::NativeDestruct ( )
overrideprotectedvirtual
40{
41 if (USituationManagementSubsystem* SituationSubsystem = GetWorld()->GetSubsystem<USituationManagementSubsystem>())
42 {
43 SituationSubsystem->OnSituationBuffApplied.RemoveAll(this);
44 SituationSubsystem->OnSituationBuffRemoved.RemoveAll(this);
45 }
46
47 TrackedSlots.Empty();
48
49 Super::NativeDestruct();
50}

◆ NativeTick()

void UConstellationBuffHUDWidget::NativeTick ( const FGeometry &  MyGeometry,
float  InDeltaTime 
)
overrideprotectedvirtual
175{
176 Super::NativeTick(MyGeometry, InDeltaTime);
177
178 if (TrackedSlots.IsEmpty())
179 {
180 return;
181 }
182
183 const APlayerController* OwningPlayer = GetOwningPlayer();
184
185 for (const FTrackedSlot& Tracked : TrackedSlots)
186 {
187 if (Tracked.Situation.IsValid() == false || Tracked.Slot.IsValid() == false)
188 {
189 continue;
190 }
191
192 // 남은 시간과 총 지속 시간 모두 GE 가 소유하므로 매번 직접 물어본다.
193 // 캐싱해두면 재적용이나 무기 교체로 지속 시간이 바뀔 때 비율이 어긋난다.
194 const float RemainingSeconds = Tracked.Situation->GetBuffRemainingTime(OwningPlayer);
195 const float Duration = Tracked.Situation->GetBuffDuration(OwningPlayer);
196
197 const bool bIsPermanent = Duration <= 0.0f;
198 const float NormalizedRemaining = bIsPermanent ? 1.0f : FMath::Clamp(RemainingSeconds / Duration, 0.0f, 1.0f);
199
200 Tracked.Slot->UpdateRemaining(NormalizedRemaining, FMath::Max(RemainingSeconds, 0.0f), bIsPermanent);
201 }
202}

◆ ReflowSlots()

void UConstellationBuffHUDWidget::ReflowSlots ( )
protected
104{
105 // 스스로 흐르는 패널(WrapBox 등)이면 UMG 가 알아서 배치한다.
106 if (Cast<UUniformGridPanel>(BuffSlotContainer) == nullptr)
107 {
108 return;
109 }
110
111 const int32 ColumnCount = FMath::Max(SlotsPerRow, 1);
112
113 int32 Index = 0;
114
115 for (const FTrackedSlot& Tracked : TrackedSlots)
116 {
117 if (Tracked.Slot.IsValid() == false)
118 {
119 continue;
120 }
121
122 UUniformGridSlot* GridSlot = Cast<UUniformGridSlot>(Tracked.Slot->Slot);
123
124 if (GridSlot == nullptr)
125 {
126 continue;
127 }
128
129 GridSlot->SetRow(Index / ColumnCount);
130 GridSlot->SetColumn(Index % ColumnCount);
131
132 ++Index;
133 }
134}
int32 SlotsPerRow
Definition ConstellationBuffHUDWidget.h:48
이 함수를 호출하는 함수들에 대한 그래프입니다.:

멤버 데이터 문서화

◆ BuffSlotClass

TSubclassOf<UConstellationBuffSlotWidget> UConstellationBuffHUDWidget::BuffSlotClass
protected

◆ BuffSlotContainer

TObjectPtr<UPanelWidget> UConstellationBuffHUDWidget::BuffSlotContainer
protected

◆ SlotsPerRow

int32 UConstellationBuffHUDWidget::SlotsPerRow = 5
protected

◆ TrackedSlots

TArray<FTrackedSlot> UConstellationBuffHUDWidget::TrackedSlots
private

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