개인프로젝트/IronBird

[IronBird #6] 메인화면 + 점수 시스템 + 게임오버/클리어

Client Side 2026. 5. 28. 22:19

IronBird 개발일지 #6

메인화면 + 점수 시스템 + 게임오버/클리어

MainMenuHUD · GameState · DrawText · FInputModeGameAndUI

🎯 목표

게임의 시작부터 끝까지 순환 구조를 완성한다. 메인화면 → 게임플레이 → 게임오버/클리어 → 메인화면으로 돌아오는 흐름과 점수 시스템을 구현한다.

메인화면 → GAME START → 게임플레이 → GAME OVER/CLEAR → MAIN MENU → 메인화면

🔧 구현 내용

클래스 역할
AMainMenuHUD IRONBIRD 타이틀, GAME START / QUIT GAME 버튼
AMainMenuGameMode 메인화면 전용 GameMode, 마우스 입력 설정
AIronBirdGameState 점수 관리 (적 100점, 보스 1000점)
AIronBirdHUD 수정 SCORE 우측상단, GAME OVER/CLEAR 오버레이, MAIN MENU 버튼
배경 SM_SkySphere + Galaxy_Mat_Inst, Tick 회전으로 스크롤 효과
Main Menu

점수 시스템 구조

// Bullet Tick → Enemy 감지 → 점수 추가
Enemy->bKilledByPlayer = true;
Enemy->ReturnToPool();

// Enemy ReturnToPool()에서
if (bKilledByPlayer)
    GS->AddScore(100);

// Boss 처치 시
GS->AddScore(1000);

🔥 트러블슈팅

문제 1. 메인화면 버튼 클릭이 동작하지 않음

원인: BeginPlay에서 FInputModeUIOnly를 설정하면 모든 마우스 입력이 Slate UI로만 전달된다. 이 모드에서는 IsInputKeyDown이 항상 false를 반환한다.

해결: FInputModeGameAndUI로 변경. 게임 입력 시스템과 Slate를 동시에 활성화해 IsInputKeyDown이 정상 동작하게 했다.

- FInputModeUIOnly InputMode;
+ FInputModeGameAndUI InputMode;
+ InputMode.SetHideCursorDuringCapture(false);

문제 2. 적 처치해도 점수가 오르지 않음

원인: Bullet 메시가 NoCollision이라 Enemy::OnOverlapBegin이 절대 호출되지 않았다. bKilledByPlayer 플래그 세팅 없이 ReturnToPool만 호출되어 점수가 항상 0이었다.

해결: Bullet Tick 수동 쿼리에서 Enemy->ReturnToPool() 직전에 bKilledByPlayer = true 추가.

+ Enemy->bKilledByPlayer = true;
Enemy->ReturnToPool();

문제 3. HDR Cubemap 텍스처를 배경 Plane에 적용 불가

원인: milkywaysky_HDR는 Cubemap 형식이라 일반 TextureSample2D 노드와 타입 불일치. Plane 메시에 직접 적용 불가.

해결: Background_Plane 제거. 레벨의 SM_SkySphere에 Galaxy_Mat_Inst 적용 후 Tick에서 X축 회전으로 별이 흘러가는 스크롤 효과 구현.

💡 배운 것

• FInputModeUIOnly는 게임 입력을 차단한다. HUD에서 마우스 클릭을 감지하려면 FInputModeGameAndUI를 써야 한다.

• 충돌 감지 흐름이 바뀌면 플래그 세팅 위치도 같이 바뀌어야 한다. 수동 쿼리 방식은 이벤트 방식과 호출 경로가 다르다.

• HDR Cubemap은 Skybox 전용이다. 일반 메시에 적용하려면 별도 노드가 필요하다.

• GameMode Tick은 기본 비활성이다. PrimaryActorTick.bCanEverTick = true를 생성자에서 명시해야 한다.

📌 다음 작업

[IronBird #7] 난이도 조정 + 하트 아이템 + BGM + 이펙트 + 틸팅 + HUD 정리

게임 완성도를 높이고 Android 빌드 준비.