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를 세팅 안 하면 마우스 클릭이 게임 월드 조작으로 해석돼서 버튼이 안 눌린다는 걸 로비 작업 때 이미 겪어서 이번엔 바로 챙길 수 있었음
에디터 작업
- WBP_StartWidget 생성, 부모 클래스를 FDStartWidget으로 지정
- Canvas에 버튼 배치, 이름을 StartButton / HowToPlayButton / QuitButton으로 정확히 작성
- BP_FDStartPlayerController 생성 → StartWidgetClass에 WBP 할당
- BP_FDStartGameMode 생성 → PlayerControllerClass를 BP 버전으로 덮어쓰기
- 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);
}
'프로젝트 > Funny Or Die (멀티플레이 술래잡기 게임)' 카테고리의 다른 글
| 인벤토리 개편 (0) | 2026.07.10 |
|---|---|
| 아이템 데이터 정의 (구조체) (0) | 2026.07.09 |
| 에셋 (0) | 2026.07.07 |
| EndMatch 구현 (게임 한 바퀴 완주) (0) | 2026.07.03 |
| 포획/봐주기 팝업 위젯 (0) | 2026.07.03 |
