UI 추가, 삭제
게임 스코어를 표시하는 UI가 아니라, 게임 재시작을 표시하는 UI를 띄우고자 할 때에는 게임 스코어 UI를 화면에서 안 보이게 한 후, 게임 재시작 UI를 화면에 표시해야 한다.
void ASpartaPlayerController::ShowMainMenu(bool bIsRestart)
{
if (HUDWidgetInstance)
{
HUDWidgetInstance->RemoveFromParent();
HUDWidgetInstance = nullptr;
}
if (MainMenuWidgetInstance)
{
MainMenuWidgetInstance->RemoveFromParent();
MainMenuWidgetInstance = nullptr;
}
if (MainMenuWidgetClass)
{
MainMenuWidgetInstance = CreateWidget<UUserWidget>(this, MainMenuWidgetClass);
if (MainMenuWidgetInstance)
{
MainMenuWidgetInstance->AddToViewport();
bShowMouseCursor = true;
SetInputMode(FInputModeUIOnly());
}
if (UTextBlock* TextBlock = Cast<UTextBlock>(MainMenuWidgetInstance->GetWidgetFromName(TEXT("StartButtonText"))))
{
if (bIsRestart)
{
TextBlock->SetText(FText::FromString(TEXT("Restart")));
}
else
{
TextBlock->SetText(FText::FromString(TEXT("Start")));
}
}
}
}
이전 UI를 삭제한 후 띄워야 하는 UI를 새로 생성하는 방식의 코드이다.
ESC키를 눌러서 설정 창을 띄우는 경우에 위와 같이 코드를 작성하면, 삭제-추가 작업이 빈번하게 발생하므로 Visibility만 조정하는 것도 좋은 방법이다.
MainMenuWidgetInstance->SetVisibility(ESlateVisibility::Hidden);
MainMenuWidgetInstance->SetVisibility(ESlateVisibility::Visible);
알아두면 좋을 메서드
USpartaGameInstance* GameInstance = Cast<USpartaGameInstance>(UGameplayStatics::GetGameInstance(this));
UGamePlayStatics로 게임 내의 Instance를 가져온 후 캐스팅하는 작업을 하면, 내가 구현한 GameInstance를 불러올 수 있다.
UGameplayStatics::OpenLevel(GetWorld(), FName("BasicLevel"));
FName으로 지정한 레벨을 로드하는 코드이다. FName은 실수의 여지가 있으니 변수를 인자로 넘겨주는 방식이 더 적합한 것 같다.
느낀 점
위의 UI를 추가, 삭제하는 부분을 정석 코드로 인식해서 모든 UI에 적용해야지 ! 보다는 왜 UI를 출력할 때마다 삭제, 추가하는 방식을 썼을까? Visibility만 바꿔주면 되는거 아닐까? 처럼 다른 사람이 작성한 코드를 분석하는 태도를 갖추는 것이 개발자 역량을 높이기 좋은 것 같습니다.
앞으로도 코드 구현에 있어서 막힌 부분이 생길 때, 다른 사람의 코드를 참고하는 과정에서 무조건적으로 받아들이지 않고 분석하는 습관을 형성해야겠네요.
'언리얼 엔진 > 스파르타코딩클럽' 카테고리의 다른 글
[언리얼엔진] 4-4. 파티클과 사운드 구현 (0) | 2025.02.11 |
---|---|
[언리얼엔진] 4-3. UI 애니메이션 효과 구현 (0) | 2025.02.11 |
[언리얼엔진] 4-1. UI 위젯 설계와 실시간 데이터 연동 (0) | 2025.02.10 |
[언리얼엔진] 3-5. 게임 루프 설계 (0) | 2025.02.07 |
[언리얼엔진] 3-4. 캐릭터 체력 및 점수 시스템 구현 (0) | 2025.02.06 |