본문 바로가기

Unreal

[Unreal] Lyra 프로젝트 분석 - 11. Common UI

Common UI

UMG를 래핑한 UI 플러그인

 

UIManagerSubSystem

GameUIPolicy를 설정한다.

 

GameUIPolicy 

PrimaryGameLayout - 로컬플레이어에 바인딩하는 UI의 Layout

RootViewportLayoutInfo - 로컬플레이어와 PrimaryGameLayout 매핑 

 

CommonGameInstance::AddLocalPlayer에서 로컬플레이어 추가할 때 

UIManagerSubsystem->NotifyPlayerAdded()호출로 GameLayOut을 추가한다.

 

UIManagerSubsystem->NotifyPlayerAdded()은 UIGamePolicy->NotifyPlayerAdded()를 실행하고

레이아웃을 추가한다. 그리고 OnPlayerControllerSet 람다식을 추가하는데 PlayerController가

업데이트될 때 GameLayout을 업데이트해주기 위한 Delegate다.

 

CommonPlayerController은 ModularPlayerController을 상속받고 

PlayerController가 LocalPlayer에 붙으면 활성화되는 이벤트 ReceivedPlayer을 가진다.

ReceivedPlayer에서 OnPlayerControllerSet 델리게이트를 Broadcast한다.

 

PrimaryGameLayout에 Common Activatable Widget Stack을 종류별로 추가한다. (Game,Menu,Modal)

PrimaryGameLayout::RegisterLayer에서 태그와 위젯을 매핑한다.

 

 

 

GameFeatureAction_AddWidget

LayOutRequest - CommonActivatableWidget 과 태그 매핑

ElementEntry - 레이아웃에 올라갈 위젯과 태그 매핑

 

FPerContextData(월드별 데이터)에서 HUDElement는 UIExtensionHandle으로 관리한다.

월드별 데이터는 subsystem도 다를 것이므로 UIExtensionHandle은 UIExtensionSubsystem과 UIExtension을 가진다.

 

GFA_AddWidget은 GFA_AddInputConfig와 마찬가지로 AddToWorld에서 UI를 추가한다.

GameFrameworkComponentManager에 HandleActorExtension함수를 바인드한다.

Widget을 추가하는 대상으로 DlkHUD로 설정하고 DlkHUD를 GameFrameworkComponentManager에 등록해 에디터에서 위젯 추가할 수 있게 한다.

 

LayoutRequest를 순회하며 CommonUIExtensions::PushContentToLayer_ForPlayer로 레이아웃 장착하고

HUDElementEntry를 순회하며 UIExtensionSubsystem의 Extension에 추가한다.(RegisterExtensionAsWidgetForExtension)

 

 

CommonActivatable Widget

런타임 중 생성/제거는 무겁지만 Activate/Deactivate로 가볍게 껐다 켰다 가능

Input 처리 방식 (Game,Menu,GameAndMenu..), Mouse 처리 방법 정의

 

 

 

PointWidget

UIExtension이 장비라면 PointWidget은 장비창이라고 할 수 있다.

태그와 태그매칭방식(완전히같아야함 or 포함관계가능), 결합 허용 클래스 , 장착 위젯, 위젯 핸들값을 가지고 있다.

 

UIExtensionSubsystem

UIExtension을 등록한것처럼 (RegisterExtension...) UIExtensionPoint를 등록 한다. (RegisterExtensionPoint...)

 

NotifyExtensionPointOfExtensions

Extension들을 순회하며 Extension과 태그가 같다면 ExtensionPointWidget의 Add를 실행한다.

RegisterExensionPoint 마지막에 등록이 끝났으니 이 함수를 실행한다.

 

NotifyExtensionPointsOfExtension

같은 방식인데 이번에는 ExtensionPoint 순회하며 태그가 같다면 Extension 의 Add를 실행한다.

RegisterExension 마지막에 등록이 끝났으니 이 함수를 실행한다.

 

UIExtension을 subsystem으로 뺀 이유는 순서를 보장하기 위함이다. 

 

UIExtensionPointWidget::RegisterExtensionPoint에서 OnAddOrRemoveExtension을 델리게이트 호출한다.

RegisterExtensionPointForPlayerState할 때는 플레이어 스테이트에서 호출하기 위해 CommonLocalPlayer에서 OnPlayerSet 델리게이트 만들고 CallAndRegister_OnPlayerStateSet에서 PlayerState가 설정되어 있으면

바로 델리게이트 실행하고 아니라면 델리게이트에 등록해준다.

 

RebuildWidget은 PointWidget의 Initialize 같은 함수다.

ResetExtensionPoint로 전부 초기화하고 RegisterExtensionPoint로 등록한다.