Unreal Engine - Main Menu UI (Start, Restart)

2025. 2. 12. 20:58·Unreal Engine

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
'Unreal Engine' 카테고리의 다른 글
  • Unreal Engine - 3D UI
  • Unreal Engine - UI Animation
  • Unreal Engine - 간단한 UI 만들기 (HUD)
  • UE5 Issues : Complex Collision
gbleem
gbleem
gbleem 님의 블로그 입니다.
  • gbleem
    gbleem 님의 블로그
    gbleem
  • 전체
    오늘
    어제
    • 분류 전체보기 (176)
      • Unreal Engine (66)
      • C++ (19)
      • 알고리즘(코딩테스트) (26)
      • TIL (60)
      • CS (4)
      • 툴 (1)
  • 블로그 메뉴

    • 홈
    • 카테고리
  • 링크

    • 과제용 깃허브
    • 깃허브
    • velog
  • 공지사항

  • 인기 글

  • 태그

    additive animation
    gamestate
    Vector
    매크로 지정자
    BFS
    map을 vector로 복사
    const
    DP
    character animation
    actor 클래스
    enhanced input system
    blend pose
    C++
    cin함수
    applydamage
    상속
    템플릿
    addonscreendebugmessage
    싱글턴
    motion matching
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
gbleem
Unreal Engine - Main Menu UI (Start, Restart)
상단으로

티스토리툴바