1. 디자이너 탭 구성
- 아래와 같은 계층구조로 구성
2. Menu 전용 맵
게임이 시작하면 Menu Level에서 위에서 만든 UI가 실행된 후 Start 버튼을 누르면 게임이 시작되는 로직으로 제작할 것이다.
- 새로운 맵을 만들어 MenuLevel이라는 이름으로 저장 후, default 맵으로 지정해준다.
3. 게임 루프와 UI 연동
이번 로직 또한 PlayerController에서 구현할 것이다.
- 로직
- 게임 시작 시 Menu UI 출력
- start 버튼 누르면 Menu UI 사라지고, HUD 출력
- Menu UI 뜨면, 게임 내 입력을 받지 않도록 처리
- 게임이 종료되며 다시 Menu UI 출력 (이때는 Restart 버튼 출력)
- PlayerController 코드
- HUD를 켜고, MainMenu를 켜는 함수를 두개 만들어, GameState에서 해당 함수를 통해 게임 시작 시 적합한 Menu를 켤수 있도록 구현
- StartGame 함수는 BP에서 Start 버튼과 binding 하여 call 하였다.
- 추가적으로 SetPause 함수를 통해 게임을 멈추고 켜주었다.
//playercontroller.h
UFUNCTION(BlueprintCallable, Category = "HUD")
void ShowGameHUD();
UFUNCTION(BlueprintCallable, Category = "Menu")
void ShowMainMenu(bool bIsReStart);
UFUNCTION(BlueprintCallable, Category = "Menu")
void StartGame();
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Menu")
TSubclassOf<UUserWidget> MenuWidgetClass;
UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = "Menu")
TObjectPtr<UUserWidget> MenuWidgetInstance;
//playercontroller.cpp
void APlayerCharacterController::ShowMainMenu(bool bIsReStart)
{
//MainMenu 켤때 HUD 있으면 없애기
if (HUDWidgetInstance)
{
HUDWidgetInstance->RemoveFromParent();
HUDWidgetInstance = nullptr;
}
//MainMenu 켤때 MainMenu 있으면 없애기
if (MenuWidgetInstance)
{
MenuWidgetInstance->RemoveFromParent();
MenuWidgetInstance = nullptr;
}
//Menu UI 생성
if (MenuWidgetClass)
{
MenuWidgetInstance = CreateWidget<UUserWidget>(this, MenuWidgetClass);
if (MenuWidgetInstance)
{
MenuWidgetInstance->AddToViewport();
//게임 조작 불가능하게 처리
bShowMouseCursor = true;
SetInputMode(FInputModeUIOnly());
}
if (UTextBlock* ButtonText = Cast<UTextBlock>(MenuWidgetInstance->GetWidgetFromName(TEXT("StartButtonText"))))
{
if (bIsReStart)
{
ButtonText->SetText(FText::FromString(TEXT("ReStart")));
}
else
{
ButtonText->SetText(FText::FromString(TEXT("Start")));
}
}
}
}
void APlayerCharacterController::StartGame()
{
if (UDefaultGameInstance* DefaultGameInstance = Cast<UDefaultGameInstance>(UGameplayStatics::GetGameInstance(this)))
{
DefaultGameInstance->CurrentLevel = 0;
DefaultGameInstance->TotalScore = 0;
}
UGameplayStatics::OpenLevel(GetWorld(), FName("Level1"));
SetPause(false);
}
- GameState 코드
- StartLevel과 OnGameOver 함수에서 playerController에서 구현한 함수를 Call 해주기
void ADefaultGameState::StartLevel()
{
if (APlayerController* PlayerController = GetWorld()->GetFirstPlayerController())
{
if (APlayerCharacterController* PlayerCharacterController = Cast<APlayerCharacterController>(PlayerController))
{
PlayerCharacterController->ShowGameHUD();
}
}
...
}
void ADefaultGameState::OnGameOver()
{
if (APlayerController* PlayerController = GetWorld()->GetFirstPlayerController())
{
if (APlayerCharacterController* PlayerCharacterController = Cast<APlayerCharacterController>(PlayerController))
{
PlayerCharacterController->ShowMainMenu(true);
PlayerCharacterController->SetPause(true);
}
}
}
- 동작 모습
'Unreal Engine' 카테고리의 다른 글
Unreal Engine - 3D UI (0) | 2025.02.13 |
---|---|
Unreal Engine - UI Animation (0) | 2025.02.13 |
Unreal Engine - 간단한 UI 만들기 (HUD) (0) | 2025.02.12 |
UE5 Issues : Complex Collision (0) | 2025.02.11 |
UE5 Issues : Look Action (bUsePawnControlRotation) (0) | 2025.02.11 |