UNSEEN 리팩토링의 마지막 단계입니다.
충돌부터 UI, 상호작용 없는 UI를 모두 HUD로 옮기는 것까지 대략 1주간 모든 작업을 수행했습니다!
부족함을 알고, 제 자신을 뒤돌아보기 위한 작업이었고 앞으로는 더 나은 개발자가 될 수 있도록 노력할 예정입니다.
참고자료:
Unreal Engine 공식 유투브
https://www.youtube.com/watch?v=OyY3OYbNK7s
새 위젯을 생성하려면, 비용이 많이 든다.
이를 방지하기 위해서, 풀링 시스템을 구축합니다.
즉, 게임 시작시 CreateWidgets를 반복적으로 호출해서, POOL을 채우고, 런타임 시에는 풀에 채운 위젯을 요청하고, 재활용한다.
for (const auto& HUD : HUDClass)
{
UUserWidget* Widget = CreateWidget<UUserWidget>(GetWorld(), HUD.Value);
Widget->AddToViewport(0);
Widget->SetVisibility(ESlateVisibility::Hidden);
HUDs.Add(HUD.Key, Widget);
}
//게임 시작시 미리 생성한 후
//아래 함수를 사용해서, 활성화 시킬지 말지만 정한다.
void AQLHUD::SetHiddenHUD(EHUDType UItype)
{
if (HUDs.Find(UItype))
{
HUDs[UItype]->SetVisibility(ESlateVisibility::Hidden);
}
}
void AQLHUD::SetVisibilityHUD(EHUDType UItype)
{
if (HUDs.Find(UItype))
{
HUDs[UItype]->SetVisibility(ESlateVisibility::Visible);
}
}
DrawWindow
Widget::Paint (재귀적으로 호출)
각각의 위젯의 블루프린트의 Tick&Native Tick 내부적으로 호출
Rebuild the hit test grid
adds items to the element batcher in SlateRHIRender
위젯 트리의 레벨을 낮추는 방법
Why?
Paint 함수는 재귀적으로 호출되기 때문에, 각 컨테이너에 호출
즉, 컨테이너 안에 컨테이너를 넣고, 그 컨테이너 안에 또 컨테이너를 넣으면 재귀적인 함수 호출 수가 늘어나게 된다.
⇒ 위젯 트리가 평탄화되어 있을 수록 재귀 횟수도 줄어든다.
USE Visible/Hit-Test-In-Visible 대신에 Self-Hit-Test-In-Visible 을 이용하는 것.

Tick 함수를 삭제하는 방법

현재 레벨 최대, 6레벨, HUD 의 최대 4까지 줄이기.

WidgetSwitchWeapon 내부에서 4레벨을 더 사용,즉 8레벨. => 이를 Overlay 와 HorizontalBox로 3레벨 줄임.

위 ui 레벨에서 아래 ui로 단순화작업 수행
