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

#include <UIManagementSubsystem.h>

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

Public 멤버 함수

 UUIManagementSubsystem ()
 
virtual void Initialize (FSubsystemCollectionBase &Collection) override
 
virtual void Deinitialize () override
 
virtual void OnLevelLoaded (ULevel *NewLevel, const ULevelStreamingData *LevelStreamingData) override
 
virtual void OnLevelUnloaded () override
 
virtual void OnLevelStreamingStarted () override
 
virtual void OnLevelStreamingEnded () override
 
UUserWidgetBasePushWidget (const FUIContext &Context, AActor *OwningActor, UUILayer *&OutLayer)
 
UUserWidgetBasePushPlayerWidget (const FUIContext &Context, UUILayer *&OutLayer)
 
UUserWidgetBasePushWidgetInstance (UUserWidgetBase *Widget, int32 ZOrder, UUILayer *&OutLayer)
 
void PushWidgetDirect (UUserWidgetBase *Widget, int32 ZOrder, UUILayer *&OutLayer)
 
bool PopWidget (UUserWidgetBase *Widget)
 
void PopWidgetFromLayer (UUserWidgetBase *Widget, UUILayer *Layer)
 
void PopAllWidgetsInLayer (UPARAM(meta=(Categories="UI.Layer")) FGameplayTag LayerTag)
 
void PopAllLayer (bool WithPrimaryWidgets=false)
 
UUILayerGetLayer (UPARAM(meta=(Categories="UI.Layer")) FGameplayTag LayerTag) const
 
UUserWidgetBaseFindFirstWidgetByArgs (UPARAM(meta=(Categories="UI.Layer")) FGameplayTag LayerTag, const TSubclassOf< UUserWidget > ClassType) const
 
UUILayerGetTopLayer () const
 
UUILayerGetRootLayer () const
 
UUILayerCreateLayer (UPARAM(meta=(Categories="UI.Layer")) FGameplayTag LayerTag, TSubclassOf< UUILayer > LayerClass=nullptr)
 
void RemoveLayer (UPARAM(meta=(Categories="UI.Layer")) FGameplayTag LayerTag)
 
void ShowLayer (UPARAM(meta=(Categories="UI.Layer")) FGameplayTag LayerTag)
 
void HideLayer (UPARAM(meta=(Categories="UI.Layer")) FGameplayTag LayerTag)
 
void ClearAllLayers ()
 
int32 GetWidgetCountInLayer (UPARAM(meta=(Categories="UI.Layer")) const FGameplayTagContainer &UILayerTags)
 

Private 멤버 함수

UUserWidgetBasePushWidgetToLayer (UUserWidgetBase *Widget, FGameplayTag LayerTag, int32 ZOrder, UUILayer *&OutLayer, bool bActivateOnPush=true, bool bCanIncludeInSnapshot=false)
 
UUILayerGetOrCreateLayer (FGameplayTag LayerTag)
 
void UpdateInputMode ()
 
void ApplyLayerTimeScale (float LayerTimeScale)
 
float GetActiveLayerTimeScale () const
 
void HandleTimeScaleRaised (float NewTimeScale)
 

Private 속성

TArray< TObjectPtr< UUILayer > > LayerStack
 

생성자 & 소멸자 문서화

◆ UUIManagementSubsystem()

UUIManagementSubsystem::UUIManagementSubsystem ( )
18{
19#if WITH_EDITOR
20 FCK_ConsoleCommands::RegisterUICommands(this);
21#endif
22}

멤버 함수 문서화

◆ ApplyLayerTimeScale()

void UUIManagementSubsystem::ApplyLayerTimeScale ( float  LayerTimeScale)
private
631{
632 UTimeManagementSubsystem* TimeSubsystem = GetWorld() ? GetWorld()->GetSubsystem<UTimeManagementSubsystem>() : nullptr;
633
634 if (TimeSubsystem == nullptr)
635 {
636 return;
637 }
638
639 // 시간이 풀렸을 때 아직 떠 있는 레이어의 요구를 다시 주장해야 한다.
640 // 이 서브시스템은 GameInstance 수명이라 월드가 바뀌면 구독이 끊긴다. 매번 확인해 다시 붙는다.
641 if (TimeSubsystem->GetOnTimeScaleRaised().IsBoundToObject(this) == false)
642 {
644 }
645
646 // 배율을 요구하지 않는 레이어로 바뀌었으면 자기가 멈춰둔 시간을 직접 되돌린다.
647 if (FMath::IsNearlyEqual(LayerTimeScale, 1.0f))
648 {
649 TimeSubsystem->ResetTimeScale();
650 return;
651 }
652
653 TimeSubsystem->ApplyTimeScale(LayerTimeScale);
654}
Definition TimeManagementSubsystem.h:27
FORCEINLINE FOnTimeScaleRaised & GetOnTimeScaleRaised()
Definition TimeManagementSubsystem.h:48
void ResetTimeScale()
Definition TimeManagementSubsystem.cpp:32
void ApplyTimeScale(float TimeScale, bool bForce=false)
Definition TimeManagementSubsystem.cpp:20
void HandleTimeScaleRaised(float NewTimeScale)
Definition UIManagementSubsystem.cpp:673
이 함수 내부에서 호출하는 함수들에 대한 그래프입니다.:
이 함수를 호출하는 함수들에 대한 그래프입니다.:

◆ ClearAllLayers()

void UUIManagementSubsystem::ClearAllLayers ( )
469{
470 if (LayerStack.IsEmpty())
471 {
473 return;
474 }
475
476 TArray<TObjectPtr<UUILayer>> LayersToClear = LayerStack;
477 LayerStack.Empty();
478
479 for (UUILayer* Layer : LayersToClear)
480 {
481 if (Layer)
482 {
483 Layer->OnPoppedFromLayerStack();
484 Layer->ClearWidget();
485 }
486 }
487
489}
Definition UILayer.h:14
TArray< TObjectPtr< UUILayer > > LayerStack
Definition UIManagementSubsystem.h:121
void UpdateInputMode()
Definition UIManagementSubsystem.cpp:575
이 함수 내부에서 호출하는 함수들에 대한 그래프입니다.:
이 함수를 호출하는 함수들에 대한 그래프입니다.:

◆ CreateLayer()

UUILayer * UUIManagementSubsystem::CreateLayer ( UPARAM(meta=(Categories="UI.Layer")) FGameplayTag  LayerTag,
TSubclassOf< UUILayer LayerClass = nullptr 
)
375{
376 if (LayerTag.IsValid() == false)
377 {
378 return nullptr;
379 }
380
381 if (UUILayer* Existing = GetLayer(LayerTag))
382 {
383 return Existing;
384 }
385
386 UClass* ClassToUse;
387
388 if (LayerClass)
389 {
390 ClassToUse = LayerClass.Get();
391 }
392 else
393 {
394 ClassToUse = UUILayer::StaticClass();
395 }
396
397 const int32 Priority = UUILayerSettings::Get()->GetLayerPriority(LayerTag);
398
399 UUILayer* NewLayer = NewObject<UUILayer>(this, ClassToUse);
400 NewLayer->InitLayer(LayerTag, Priority, this);
401
402 // 우선순위 오름차순 정렬 삽입
403 int32 InsertIndex = 0;
404
405 for (int32 i = 0; i < LayerStack.Num(); ++i)
406 {
407 if (LayerStack[i]->GetPriority() > Priority)
408 {
409 break;
410 }
411
412 InsertIndex = i + 1;
413 }
414
415 LayerStack.Insert(NewLayer, InsertIndex);
416 NewLayer->OnPushedToLayerStack();
417 return NewLayer;
418}
int32 GetLayerPriority(const FGameplayTag &LayerTag) const
Definition UILayerSettings.h:59
static const UUILayerSettings * Get()
Definition UILayerSettings.h:48
void InitLayer(FGameplayTag InLayerTag, int32 InPriority, UUIManagementSubsystem *InSubsystem)
Definition UILayer.cpp:8
virtual void OnPushedToLayerStack()
Definition UILayer.h:39
UUILayer * GetLayer(UPARAM(meta=(Categories="UI.Layer")) FGameplayTag LayerTag) const
Definition UIManagementSubsystem.cpp:285
이 함수 내부에서 호출하는 함수들에 대한 그래프입니다.:
이 함수를 호출하는 함수들에 대한 그래프입니다.:

◆ Deinitialize()

void UUIManagementSubsystem::Deinitialize ( )
overridevirtual
50{
52 Super::Deinitialize();
53}
void ClearAllLayers()
Definition UIManagementSubsystem.cpp:468
이 함수 내부에서 호출하는 함수들에 대한 그래프입니다.:

◆ FindFirstWidgetByArgs()

UUserWidgetBase * UUIManagementSubsystem::FindFirstWidgetByArgs ( UPARAM(meta=(Categories="UI.Layer")) FGameplayTag  LayerTag,
const TSubclassOf< UUserWidget >  ClassType 
) const
304{
305 // TSubclassOf 는 UUserWidgetBase 파생이 아닌 UClass 를 받아도 컴파일되지만, 역참조할 때마다 nullptr 을 돌려준다.
306 // 여기서 걸러두지 않으면 아래 IsA 가 전부 false 가 되고 실패 로그가 널 포인터를 역참조한다.
307 const UClass* TargetClass = ClassType.Get();
308
309 if (TargetClass == nullptr)
310 {
311 LOG_ERROR(LogCK, "%s 가 비었거나 %s 파생 클래스가 아닙니다. ", NAMEOF_VAR(ClassType), NAMEOF(UUserWidgetBase));
312 return nullptr;
313 }
314
315 const UUILayer* UILayer = GetLayer(LayerTag);
316
317 if (UILayer == nullptr)
318 {
319 LOG_ERROR(LogCK, "%s를 찾을 수 없습니다. ", NAMEOF(UUILayer));
320 return nullptr;
321 }
322
323 TArray<UUserWidgetBase*> UserWidgetBases = UILayer->GetWidgets();
324
325 if (UserWidgetBases.IsEmpty())
326 {
327 LOG_ERROR(LogCK, "%s가 비어있습니다. ", NAMEOF_VAR(UserWidgetBases));
328 return nullptr;
329 }
330
331 auto MatchPredicate = [TargetClass](const UUserWidgetBase* Widget)
332 {
333 return IsValid(Widget) && Widget->IsA(TargetClass);
334 };
335
336 UUserWidgetBase** Result = UserWidgetBases.FindByPredicate(MatchPredicate);
337
338 if (Result == nullptr || *Result == nullptr)
339 {
340 LOG_WARNING(LogCK, "%s 타입의 위젯을 찾지 못했습니다. ", *TargetClass->GetName());
341 return nullptr;
342 }
343
344 return (*Result);
345}
#define LOG_ERROR(Category, Format,...)
Definition CK_UE.h:40
#define NAMEOF_VAR(Expr)
Definition CK_UE.h:34
#define NAMEOF(Type)
Definition CK_UE.h:30
#define LOG_WARNING(Category, Format,...)
Definition CK_UE.h:39
FORCEINLINE TArray< UUserWidgetBase * > GetWidgets() const
Definition UILayer.h:44
Definition UserWidgetBase.h:33
이 함수 내부에서 호출하는 함수들에 대한 그래프입니다.:

◆ GetActiveLayerTimeScale()

float UUIManagementSubsystem::GetActiveLayerTimeScale ( ) const
private
658{
659 // UpdateInputMode 의 레이어 판단 규칙과 동일해야 한다.
660 const UUILayerSettings* Settings = UUILayerSettings::Get();
661 const FUILayerConfig* ActiveConfig = nullptr;
662 const UUILayer* TopLayer = GetTopLayer();
663
664 if (TopLayer && TopLayer->IsVisible() && TopLayer->WidgetCount() > 0)
665 {
666 ActiveConfig = Settings->LayerConfigs.Find(TopLayer->GetTag());
667 }
668
669 return ActiveConfig ? ActiveConfig->TimeScale : Settings->DefaultConfig.TimeScale;
670}
Definition UILayerSettings.h:44
TMap< FGameplayTag, FUILayerConfig > LayerConfigs
Definition UILayerSettings.h:72
FUILayerConfig DefaultConfig
Definition UILayerSettings.h:68
int32 WidgetCount() const
Definition UILayer.cpp:143
FORCEINLINE FGameplayTag GetTag() const
Definition UILayer.h:54
FORCEINLINE bool IsVisible() const
Definition UILayer.h:49
UUILayer * GetTopLayer() const
Definition UIManagementSubsystem.cpp:348
Definition UILayerSettings.h:13
float TimeScale
Definition UILayerSettings.h:38
이 함수 내부에서 호출하는 함수들에 대한 그래프입니다.:
이 함수를 호출하는 함수들에 대한 그래프입니다.:

◆ GetLayer()

UUILayer * UUIManagementSubsystem::GetLayer ( UPARAM(meta=(Categories="UI.Layer")) FGameplayTag  LayerTag) const
286{
287 TObjectPtr<UUILayer> const* Found = LayerStack.FindByPredicate([&LayerTag](const UUILayer* Layer)
288 {
289 return Layer && Layer->GetTag() == LayerTag;
290 });
291
292 if (Found == nullptr)
293 {
294 return nullptr;
295 }
296 else
297 {
298 return Found->Get();
299 }
300}
이 함수 내부에서 호출하는 함수들에 대한 그래프입니다.:
이 함수를 호출하는 함수들에 대한 그래프입니다.:

◆ GetOrCreateLayer()

UUILayer * UUIManagementSubsystem::GetOrCreateLayer ( FGameplayTag  LayerTag)
private
563{
564 if (UUILayer* Existing = GetLayer(LayerTag))
565 {
566 return Existing;
567 }
568 else
569 {
570 return CreateLayer(LayerTag);
571 }
572}
UUILayer * CreateLayer(UPARAM(meta=(Categories="UI.Layer")) FGameplayTag LayerTag, TSubclassOf< UUILayer > LayerClass=nullptr)
Definition UIManagementSubsystem.cpp:374
이 함수 내부에서 호출하는 함수들에 대한 그래프입니다.:
이 함수를 호출하는 함수들에 대한 그래프입니다.:

◆ GetRootLayer()

UUILayer * UUIManagementSubsystem::GetRootLayer ( ) const
362{
363 if (LayerStack.Num() > 0)
364 {
365 return LayerStack[0];
366 }
367 else
368 {
369 return nullptr;
370 }
371}

◆ GetTopLayer()

UUILayer * UUIManagementSubsystem::GetTopLayer ( ) const
349{
350 if (LayerStack.Num() > 0)
351 {
352 return LayerStack.Last();
353 }
354 else
355 {
356 return nullptr;
357 }
358}
이 함수를 호출하는 함수들에 대한 그래프입니다.:

◆ GetWidgetCountInLayer()

int32 UUIManagementSubsystem::GetWidgetCountInLayer ( UPARAM(meta=(Categories="UI.Layer")) const FGameplayTagContainer &  UILayerTags)
493{
494 TArray<FGameplayTag> TagArray = UILayerTags.GetGameplayTagArray();
495
496 if (TagArray.IsEmpty())
497 {
498 return 0;
499 }
500
501 int32 Sum = 0;
502
503 for (const FGameplayTag& Tag : TagArray)
504 {
505 if (Tag.IsValid() == false)
506 {
507 continue;
508 }
509
510 if (const UUILayer* Layer = GetLayer(Tag))
511 {
512 Sum += Layer->WidgetCount();
513 }
514 }
515
516 return Sum;
517}
이 함수 내부에서 호출하는 함수들에 대한 그래프입니다.:

◆ HandleTimeScaleRaised()

void UUIManagementSubsystem::HandleTimeScaleRaised ( float  NewTimeScale)
private
674{
675 const float LayerTimeScale = GetActiveLayerTimeScale();
676
677 // 레이어가 여전히 느린 시간을 요구하면 다시 주장한다.
678 if (LayerTimeScale >= NewTimeScale)
679 {
680 return;
681 }
682
683 if (UTimeManagementSubsystem* TimeSubsystem = GetWorld() ? GetWorld()->GetSubsystem<UTimeManagementSubsystem>() : nullptr)
684 {
685 TimeSubsystem->ApplyTimeScale(LayerTimeScale);
686 }
687}
float GetActiveLayerTimeScale() const
Definition UIManagementSubsystem.cpp:657
이 함수 내부에서 호출하는 함수들에 대한 그래프입니다.:
이 함수를 호출하는 함수들에 대한 그래프입니다.:

◆ HideLayer()

void UUIManagementSubsystem::HideLayer ( UPARAM(meta=(Categories="UI.Layer")) FGameplayTag  LayerTag)
456{
457 if (UUILayer* Layer = GetLayer(LayerTag))
458 {
459 Layer->HideLayer();
460 }
461 else
462 {
463 LOG_WARNING(LogCK, "%s 태그 레이어가 설정되어 있시 않습니다. ", *LayerTag.ToString());
464 }
465}
이 함수 내부에서 호출하는 함수들에 대한 그래프입니다.:

◆ Initialize()

void UUIManagementSubsystem::Initialize ( FSubsystemCollectionBase &  Collection)
overridevirtual
44{
45 Super::Initialize(Collection);
46}

◆ OnLevelLoaded()

virtual void UUIManagementSubsystem::OnLevelLoaded ( ULevel *  NewLevel,
const ULevelStreamingData LevelStreamingData 
)
inlineoverridevirtual

◆ OnLevelStreamingEnded()

virtual void UUIManagementSubsystem::OnLevelStreamingEnded ( )
inlineoverridevirtual

◆ OnLevelStreamingStarted()

virtual void UUIManagementSubsystem::OnLevelStreamingStarted ( )
inlineoverridevirtual

◆ OnLevelUnloaded()

void UUIManagementSubsystem::OnLevelUnloaded ( )
overridevirtual

IStreamingEventListenerInterface를 구현.

57{
58 PopAllLayer(false);
59}
void PopAllLayer(bool WithPrimaryWidgets=false)
Definition UIManagementSubsystem.cpp:245
이 함수 내부에서 호출하는 함수들에 대한 그래프입니다.:

◆ PopAllLayer()

void UUIManagementSubsystem::PopAllLayer ( bool  WithPrimaryWidgets = false)
246{
247 TArray<FGameplayTag> LayersToRemove;
248
249 for (UUILayer* Layer : LayerStack)
250 {
251 if (Layer == nullptr)
252 {
253 continue;
254 }
255
256 if (WithPrimaryWidgets == false)
257 {
258 bool bHasPrimaryWidget = false;
259
260 for (const UUserWidgetBase* Widget : Layer->GetWidgets())
261 {
262 if (IsValid(Widget) && Widget->IsPrimary())
263 {
264 bHasPrimaryWidget = true;
265 break;
266 }
267 }
268
269 if (bHasPrimaryWidget)
270 {
271 continue;
272 }
273 }
274
275 LayersToRemove.Add(Layer->GetTag());
276 }
277
278 for (const FGameplayTag& Tag : LayersToRemove)
279 {
280 RemoveLayer(Tag);
281 }
282}
void RemoveLayer(UPARAM(meta=(Categories="UI.Layer")) FGameplayTag LayerTag)
Definition UIManagementSubsystem.cpp:421
이 함수 내부에서 호출하는 함수들에 대한 그래프입니다.:
이 함수를 호출하는 함수들에 대한 그래프입니다.:

◆ PopAllWidgetsInLayer()

void UUIManagementSubsystem::PopAllWidgetsInLayer ( UPARAM(meta=(Categories="UI.Layer")) FGameplayTag  LayerTag)
223{
224 if (LayerTag == FGameplayTag::EmptyTag)
225 {
226 LOG_WARNING(LogCK, "요청받은 레이어 태그가 '%s' 입니다. ", *FGameplayTag::EmptyTag.ToString());
227 return;
228 }
229
230 UUILayer* Layer = GetLayer(LayerTag);
231
232 if (Layer == nullptr)
233 {
234 LOG_WARNING(LogCK, "%s를 찾지 못했습니다. ", *LayerTag.ToString());
235 return;
236 }
237
238 Algo::NullSafeForEach(Layer->GetWidgets(), [this](UUserWidgetBase* Widget)
239 {
240 PopWidget(Widget);
241 });
242}
이 함수 내부에서 호출하는 함수들에 대한 그래프입니다.:

◆ PopWidget()

bool UUIManagementSubsystem::PopWidget ( UUserWidgetBase Widget)
169{
170 if (IsValid(Widget) == false)
171 {
172 LOG_ERROR(LogCK, "'%s'이 존재하지 않습니다. ", NAMEOF(UUserWidgetBase));
173 return false;
174 }
175
176 LOG_INFO(LogCK, "제거할 대상 위젯: %s", *Widget->GetName());
177
178 //제거할 위젯이 현재 비활성화 중인 상황이거나, 이미 비활성화됐다면 추가로 이행할 작업이 없음.
179 if (Widget->GetWidgetState() == EWidgetState::Disappearing || Widget->GetWidgetState() == EWidgetState::Disappeared)
180 {
181 return false;
182 }
183 else
184 {
185 LOG_INFO(LogCK, "[%s] 제거 위젯", *Widget->GetName());
186 Widget->Deactivate();
187 return true;
188 }
189}
#define LOG_INFO(Category, Format,...)
Definition CK_UE.h:38
FORCEINLINE EWidgetState GetWidgetState() const
Definition UserWidgetBase.h:72
void Deactivate()
Definition UserWidgetBase.cpp:87
이 함수 내부에서 호출하는 함수들에 대한 그래프입니다.:
이 함수를 호출하는 함수들에 대한 그래프입니다.:

◆ PopWidgetFromLayer()

void UUIManagementSubsystem::PopWidgetFromLayer ( UUserWidgetBase Widget,
UUILayer Layer 
)
193{
194 if (IsValid(Widget) == false)
195 {
196 LOG_ERROR(LogCK, "%s가 유효하지 않습니다. ", NAMEOF(UUserWidgetBase));
197 return;
198 }
199
200 if (IsValid(Layer) == false)
201 {
202 LOG_ERROR(LogCK, "%s가 유효하지 않습니다. ", NAMEOF(UUILayer));
203 return;
204 }
205
206 Layer->RemoveWidget(Widget);
207 Widget->OnPoppedFromLayer();
208
209 if (Layer->WidgetCount() == 0)
210 {
211 RemoveLayer(Layer->GetTag());
212 }
213 else
214 {
216 }
217
218 Widget->RemoveFromParent();
219}
void RemoveWidget(UUserWidgetBase *Widget)
Definition UILayer.cpp:115
virtual void OnPoppedFromLayer()
Definition UserWidgetBase.cpp:24
이 함수 내부에서 호출하는 함수들에 대한 그래프입니다.:
이 함수를 호출하는 함수들에 대한 그래프입니다.:

◆ PushPlayerWidget()

UUserWidgetBase * UUIManagementSubsystem::PushPlayerWidget ( const FUIContext Context,
UUILayer *&  OutLayer 
)
113{
114 APlayerController* PlayerController = GetWorld()->GetFirstPlayerController();
115 check(PlayerController);
116
117 if (UUserWidgetBase* CreatedWidget = PushWidget(Context, PlayerController, OutLayer))
118 {
119 return CreatedWidget;
120 }
121
122 LOG_ERROR(LogCK, "Widget 생성 및 UI Layer 에 쌓는데 실패했습니다. ");
123 return nullptr;
124}
UUserWidgetBase * PushWidget(const FUIContext &Context, AActor *OwningActor, UUILayer *&OutLayer)
Definition UIManagementSubsystem.cpp:62
이 함수 내부에서 호출하는 함수들에 대한 그래프입니다.:
이 함수를 호출하는 함수들에 대한 그래프입니다.:

◆ PushWidget()

UUserWidgetBase * UUIManagementSubsystem::PushWidget ( const FUIContext Context,
AActor *  OwningActor,
UUILayer *&  OutLayer 
)
63{
64 if (Context.IsValid() == false)
65 {
66 LOG_ERROR(LogCK, "Context가 잘못되었습니다. ");
67 return nullptr;
68 }
69
70 UWorld* World = GetGameInstance()->GetWorld();
71
72 if (World == nullptr)
73 {
74 LOG_ERROR(LogCK, "World를 가져올 수 없습니다. ");
75 return nullptr;
76 }
77
78 APlayerController* PC = World->GetFirstPlayerController();
79
80 if (PC == nullptr)
81 {
82 LOG_ERROR(LogCK, "PC를 가져올 수 없습니다. ");
83 return nullptr;
84 }
85
86 UUserWidgetBase* Widget = CreateWidget<UUserWidgetBase>(PC, Context.WidgetClass);
87
88 if (Widget == nullptr)
89 {
90 LOG_ERROR(LogCK, "위젯을 생성 할 수 없습니다. ");
91 return nullptr;
92 }
93
94 LOG_INFO(LogCK, "%s이 Layer Stack에 추가되었습니다. ", *Widget->GetName());
95
96 Widget->SetPrimary(Context.Primary);
97
98 if (IsValid(OwningActor))
99 {
100 Widget->SetAbilitySystemComponent(OwningActor);
101 }
102 else
103 {
104 LOG_ERROR(LogCK, "`OwningActor` 가 유효하지 않습니다. ");
105 return nullptr;
106 }
107
108 return PushWidgetToLayer(Widget, Context.LayerTag, Context.ZOrder, OutLayer, Context.bActivateOnPush, Context.bCanIncludeInSnapshot);
109}
UUserWidgetBase * PushWidgetToLayer(UUserWidgetBase *Widget, FGameplayTag LayerTag, int32 ZOrder, UUILayer *&OutLayer, bool bActivateOnPush=true, bool bCanIncludeInSnapshot=false)
Definition UIManagementSubsystem.cpp:520
virtual void SetAbilitySystemComponent(AActor *InOwner)
Definition UserWidgetBase.cpp:42
FORCEINLINE void SetPrimary(const bool InPrimary)
Definition UserWidgetBase.h:67
int32 ZOrder
Definition UIContext.h:24
TSubclassOf< UUserWidgetBase > WidgetClass
Definition UIContext.h:39
FGameplayTag LayerTag
Definition UIContext.h:21
bool IsValid() const
Definition UIContext.h:14
bool bActivateOnPush
Definition UIContext.h:32
bool bCanIncludeInSnapshot
Definition UIContext.h:36
bool Primary
Definition UIContext.h:28
이 함수 내부에서 호출하는 함수들에 대한 그래프입니다.:
이 함수를 호출하는 함수들에 대한 그래프입니다.:

◆ PushWidgetDirect()

void UUIManagementSubsystem::PushWidgetDirect ( UUserWidgetBase Widget,
int32  ZOrder,
UUILayer *&  OutLayer 
)
148{
149 if (IsValid(Widget) == false)
150 {
151 LOG_ERROR(LogCK, "유효하지 않은 Widget 인스턴스입니다. ");
152 return;
153 }
154
155 const FGameplayTag LayerTag = Widget->GetLayerTag();
156
157 if (LayerTag.IsValid() == false)
158 {
159 LOG_ERROR(LogCK, "%s의 LayerTag가 설정되지 않았습니다. ", *Widget->GetName());
160 return;
161 }
162
163 LOG_INFO(LogCK, "%s이 Layer Stack에 추가되었습니다. ", *Widget->GetName());
164 PushWidgetToLayer(Widget, LayerTag, ZOrder, OutLayer);
165}
FORCEINLINE FGameplayTag GetLayerTag() const
Definition UserWidgetBase.h:52
이 함수 내부에서 호출하는 함수들에 대한 그래프입니다.:

◆ PushWidgetInstance()

UUserWidgetBase * UUIManagementSubsystem::PushWidgetInstance ( UUserWidgetBase Widget,
int32  ZOrder,
UUILayer *&  OutLayer 
)
128{
129 if (IsValid(Widget) == false)
130 {
131 LOG_ERROR(LogCK, "유효하지 않은 Widget 인스턴스입니다. ");
132 return nullptr;
133 }
134
135 const FGameplayTag LayerTag = Widget->GetLayerTag();
136
137 if (LayerTag.IsValid() == false)
138 {
139 LOG_ERROR(LogCK, "%s의 LayerTag가 설정되지 않았습니다. ", *Widget->GetName());
140 return nullptr;
141 }
142
143 return PushWidgetToLayer(Widget, LayerTag, ZOrder, OutLayer);
144}
이 함수 내부에서 호출하는 함수들에 대한 그래프입니다.:

◆ PushWidgetToLayer()

UUserWidgetBase * UUIManagementSubsystem::PushWidgetToLayer ( UUserWidgetBase Widget,
FGameplayTag  LayerTag,
int32  ZOrder,
UUILayer *&  OutLayer,
bool  bActivateOnPush = true,
bool  bCanIncludeInSnapshot = false 
)
private
521{
522 UUILayer* Layer = GetOrCreateLayer(LayerTag);
523
524 if (Layer == nullptr)
525 {
526 LOG_ERROR(LogCK, "%s 태그의 위젯을 가져오는데 실패했습ㄴ디ㅏ. ", *LayerTag.ToString())
527 return nullptr;
528 }
529
530 OutLayer = Layer;
531
532 Widget->SetLayerTag(LayerTag);
533 Widget->AddToViewport(ZOrder);
534 Layer->PushWidget(Widget);
535
536 if (bCanIncludeInSnapshot)
537 {
538 USnapshotSubsystem::ProcessNewCommand<UWidgetPushCommand>(this, [this, Widget](UWidgetPushCommand* Command)
539 {
540 Command->Initialize(this, Widget);
541 });
542 }
543
544 if (bActivateOnPush)
545 {
546 if (Layer->IsVisible())
547 {
548 Widget->Activate();
549 }
550 else
551 {
552 Widget->SetVisibility(ESlateVisibility::Collapsed);
553 }
554 }
555
556 Widget->OnPushedToLayer();
558 return Widget;
559}
UUILayer * GetOrCreateLayer(FGameplayTag LayerTag)
Definition UIManagementSubsystem.cpp:562
void Activate()
Definition UserWidgetBase.cpp:53
Definition WidgetPushCommand.h:14
void Initialize(UUIManagementSubsystem *InUISubsystem, UUserWidgetBase *InWidget)
Definition WidgetPushCommand.cpp:9
이 함수 내부에서 호출하는 함수들에 대한 그래프입니다.:
이 함수를 호출하는 함수들에 대한 그래프입니다.:

◆ RemoveLayer()

void UUIManagementSubsystem::RemoveLayer ( UPARAM(meta=(Categories="UI.Layer")) FGameplayTag  LayerTag)
422{
423 int32 Index = LayerStack.IndexOfByPredicate([&LayerTag](const UUILayer* Layer)
424 {
425 return Layer && Layer->GetTag() == LayerTag;
426 });
427
428 if (Index == INDEX_NONE)
429 {
430 LOG_WARNING(LogCK, "%s 레이어가 존재하지 않습니다. ", *LayerTag.ToString());
431 return;
432 }
433
434 UUILayer* Layer = LayerStack[Index];
435 Layer->OnPoppedFromLayerStack();
436 Layer->ClearWidget();
437 LayerStack.RemoveAt(Index);
439}
void ClearWidget()
Definition UILayer.cpp:149
virtual void OnPoppedFromLayerStack()
Definition UILayer.h:40
이 함수 내부에서 호출하는 함수들에 대한 그래프입니다.:
이 함수를 호출하는 함수들에 대한 그래프입니다.:

◆ ShowLayer()

void UUIManagementSubsystem::ShowLayer ( UPARAM(meta=(Categories="UI.Layer")) FGameplayTag  LayerTag)
443{
444 if (UUILayer* Layer = GetLayer(LayerTag))
445 {
446 Layer->ShowLayer();
447 }
448 else
449 {
450 LOG_WARNING(LogCK, "%s 태그 레이어가 설정되어 있시 않습니다. ", *LayerTag.ToString());
451 }
452}
이 함수 내부에서 호출하는 함수들에 대한 그래프입니다.:

◆ UpdateInputMode()

void UUIManagementSubsystem::UpdateInputMode ( )
private
576{
577 APlayerController* PC = GetGameInstance()->GetWorld()->GetFirstPlayerController();
578
579 if (PC == nullptr)
580 {
581 return;
582 }
583
584 // 최상위 우선순위 레이어의 설정으로 입력 모드 판단
585 const UUILayerSettings* Settings = UUILayerSettings::Get();
586 const FUILayerConfig* ActiveConfig = nullptr;
587 const UUILayer* TopLayer = GetTopLayer();
588
589 if (TopLayer)
590 {
591 LOG_INFO(LogCK, "[Top Layer]: %s", *TopLayer->GetTag().ToString());
592
593 if (TopLayer->IsVisible() && TopLayer->WidgetCount() > 0)
594 {
595 ActiveConfig = Settings->LayerConfigs.Find(TopLayer->GetTag());
596 }
597 }
598
599 const FUILayerConfig& ConfigToApply = ActiveConfig ? *ActiveConfig : Settings->DefaultConfig;
600
601 PC->bShowMouseCursor = ConfigToApply.bShowMouseCursor;
602 ApplyLayerTimeScale(ConfigToApply.TimeScale);
603
604 if (PC->GetLocalPlayer())
605 {
606 if (UPlayerManagementSubsystem* PlayerManagement = PC->GetLocalPlayer()->GetSubsystem<UPlayerManagementSubsystem>())
607 {
608 PlayerManagement->ApplyUILayerInputBlockOptions(ConfigToApply.bBlockPlayerMovement, ConfigToApply.bBlockPlayerInput);
609 }
610 else
611 {
612 LOG_WARNING(LogCK, "%s를 찾지 못해 UI 플레이어 입력 차단 옵션을 적용하지 못했습니다.", NAMEOF(UPlayerManagementSubsystem));
613 }
614 }
615
616 if (PC->bShowMouseCursor)
617 {
618 FInputModeGameAndUI InputMode;
619 InputMode.SetLockMouseToViewportBehavior(ConfigToApply.MouseLockMode);
620 InputMode.SetHideCursorDuringCapture(false);
621 PC->SetInputMode(InputMode);
622 }
623 else
624 {
625 PC->SetInputMode(FInputModeGameOnly());
626 }
627}
Definition PlayerManagementSubsystem.h:42
void ApplyLayerTimeScale(float LayerTimeScale)
Definition UIManagementSubsystem.cpp:630
bool bShowMouseCursor
Definition UILayerSettings.h:22
bool bBlockPlayerInput
Definition UILayerSettings.h:34
EMouseLockMode MouseLockMode
Definition UILayerSettings.h:26
bool bBlockPlayerMovement
Definition UILayerSettings.h:30
이 함수 내부에서 호출하는 함수들에 대한 그래프입니다.:
이 함수를 호출하는 함수들에 대한 그래프입니다.:

멤버 데이터 문서화

◆ LayerStack

TArray<TObjectPtr<UUILayer> > UUIManagementSubsystem::LayerStack
private

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