Funny or Die 게임의 첫 화면 구성

그러니까 게임을 딱 켰을 때 나오는 "게임 입장 / 게임 설명 / 게임 종료" 메뉴를 만드는 작업을 함 

 

코드 작업 해서 WBP 대강 만들어두고 디자인 담당 팀원에게 넘기는 구조

 

1. 위젯 코드 작업

// FDStartWidget.h
UPROPERTY(meta = (BindWidget))
UButton* StartButton;

UPROPERTY(meta = (BindWidget))
UButton* HowToPlayButton;

UPROPERTY(meta = (BindWidget))
UButton* QuitButton;

 

 

설명 패널처럼 아직 구현을 어떻게 할지는 안 정했지만 필요한 위젯은 BindWidgetOptional로 뒀다

UPROPERTY(meta = (BindWidgetOptional))
UWidget* HowToPlayPanel;   // 버튼이 아니라 UWidget인 이유: 이미지든 박스든 뭐가 와도 되게

UPROPERTY(meta = (BindWidgetOptional))
UButton* CloseHowToPlayButton;
void UFDStartWidget::OnHowToPlayClicked()
{
    if (!HowToPlayPanel) return;

    const bool bCurrentlyVisible = HowToPlayPanel->GetVisibility() == ESlateVisibility::Visible;
    HowToPlayPanel->SetVisibility(bCurrentlyVisible
        ? ESlateVisibility::Collapsed
        : ESlateVisibility::Visible);
}

 

뒤집기 함수

현재 상태를 읽어서 반대로 바꾸는 거라 같은 코드가 첫 클릭엔 열기가 되고 다음 클릭엔 닫기가 됨

void AFDStartPlayerController::BeginPlay()
{
    Super::BeginPlay();

    if (IsLocalController() && StartWidgetClass)
    {
       StartWidget = CreateWidget<UFDStartWidget>(this, StartWidgetClass);
       StartWidget->AddToViewport();

       FInputModeUIOnly InputMode;
       InputMode.SetWidgetToFocus(StartWidget->TakeWidget());
       InputMode.SetLockMouseToViewportBehavior(EMouseLockMode::DoNotLock);
       SetInputMode(InputMode);

       bShowMouseCursor = true;
    }
}

void AFDStartPlayerController::EndPlay(const EEndPlayReason::Type EndPlayReason)
{
    if (IsLocalController())
    {
       SetInputMode(FInputModeGameOnly());
       bShowMouseCursor = false;
    }

    Super::EndPlay(EndPlayReason);
}

 

FInputModeUIOnly를 세팅 안 하면 마우스 클릭이 게임 월드 조작으로 해석돼서 버튼이 안 눌린다는 걸 로비 작업 때 이미 겪어서 이번엔 바로 챙길 수 있었음

 

에디터 작업

  1. WBP_StartWidget 생성, 부모 클래스를 FDStartWidget으로 지정
  2. Canvas에 버튼 배치, 이름을 StartButton / HowToPlayButton / QuitButton으로 정확히 작성
  3. BP_FDStartPlayerController 생성 → StartWidgetClass에 WBP 할당
  4. BP_FDStartGameMode 생성 → PlayerControllerClass를 BP 버전으로 덮어쓰기
  5. Start 맵 World Settings에 GameMode 지정



접속 방식이 어느 쪽으로 확정될지 몰라서 설계는 주석으로 남김

void UFDStartWidget::OnStartClicked()
{
    // 구현 전까지 확인용 로그
    UE_LOG(LogTemp, Warning, TEXT("게임 입장 클릭"));
}

void UFDStartWidget::OnHowToPlayClicked()
{
    if (!HowToPlayPanel) return;

    // 현재 상태를 파악해서 bCurrentlyVisible 변수에 넣고
    const bool bCurrentlyVisible = HowToPlayPanel->GetVisibility() == ESlateVisibility::Visible;
    
    // 닫혀있으면 패널 열고 열려있으면 패널 닫음
    HowToPlayPanel->SetVisibility(bCurrentlyVisible
       ? ESlateVisibility::Collapsed
       : ESlateVisibility::Visible);
}

// 이건 열려 있을 때 닫힘 버튼 없으면 플레이어가 당황할수도 있으니까 닫힘 버튼도 만든 것
void UFDStartWidget::OnCloseHowToPlayClicked()
{
    if (HowToPlayPanel)
    {
       HowToPlayPanel->SetVisibility(ESlateVisibility::Collapsed);
    }
}

void UFDStartWidget::OnQuitClicked()
{
    // 게임 프로세스 종료
    UKismetSystemLibrary::QuitGame(
       this,
       GetOwningPlayer(),
       EQuitPreference::Quit,
       false);
}

 

+ Recent posts