StrikForge 프로젝트/작업일지

StrikForge 6일차 - 오늘 한 일

editor66484 2026. 8. 12. 01:00

오늘 진행한 작업

1. 최신 병합 소스 전체 구조 확인

최신 소스를 기준으로 다음 시스템의 연결 상태를 다시 점검했다.

  • SFGameMode
  • SFGameState
  • SFGameInstance
  • StartWidget
  • LobbyWidget
  • SFResourcePanelWidget
  • DT_SFStage

확인 결과 타이틀, 로비, 인게임 이동 기능은 SFGameInstance를 통하도록 변경돼 있었다.

타이틀 Start 버튼
→ MoveToLobby()

로비 스테이지 버튼
→ SelectStage()
→ MoveToStage()

InGameUI 자원 표시도 Getter, Setter, Delegate 구조로 보완된 것을 확인했다.

GameState 값 변경
→ Delegate Broadcast
→ ResourcePanelWidget 갱신

단, 실제 자원 생산 및 소비 시스템에서 GameState Setter를 호출하는 연결은 아직 남아 있다.


2. GameMode 승리 후 스테이지 클리어 기록 추가

승리가 정상 확정된 이후 현재 선택된 스테이지를 클리어 처리하도록 연결했다.

핵심 건물 파괴
→ ProcessVictory()
→ FinishStage(Victory)
→ GameState 승리 확정
→ GameInstance에서 선택된 RowName 조회
→ MarkStageCleared()

패배 시에는 진행도가 변경되지 않는다.

클리어 기록에 실패하더라도 이미 확정된 승리 결과는 유지하고 경고 로그만 출력하도록 구성했다.

수정 위치:

  • SFGameMode.cpp = 승리 확정 후 클리어 기록
  • SFGameInstance = 스테이지 진행 상태 보관 및 계산

3. 스테이지 진행 규칙 확정

최종 스테이지 개수를 Stage01~Stage06, 총 6개로 정리했다.

최초 로비 상태:

Stage01 = Unlocked
Stage02~06 = Locked

Stage01 클리어 후:

Stage01 = Cleared
Stage02 = Unlocked
Stage03~06 = Locked

이후 스테이지도 같은 규칙으로 한 단계씩 해제된다.

진행 상태:

  • Locked: 잠긴 스테이지
  • Unlocked: 현재 플레이 가능한 스테이지
  • Cleared: 클리어 완료 스테이지

4. Static Mesh 구조를 UI Texture로 수정

처음에는 상태별 외형을 UStaticMesh로 설계했으나, 실제 로비가 3D 액터가 아닌 UMG 버튼으로 구성된 것을 확인했다.

에셋 타입도 모두 Texture였다.

  • LockGround
  • NonWin_Ground
  • WinnerGround

따라서 SFStageData의 상태별 데이터를 다음과 같이 수정했다.

LockedMesh → LockedImage
UnlockedMesh → UnlockedImage
ClearedMesh → ClearedImage

UStaticMesh → UTexture2D

수정 위치:

  • SFStageData.h = 상태별 UI Texture 정보 관리

5. LobbyWidget 상태별 이미지 갱신 구조 추가

로비 위젯이 생성될 때 각 스테이지 상태를 확인하고 버튼 이미지를 변경하도록 구조를 구성했다.

LobbyWidget 생성
→ Stage01~06 순회
→ GameInstance에서 진행 상태 확인
→ DT_SFStage에서 이미지 조회
→ Button Style에 Texture 적용
→ 잠긴 버튼 비활성화

추가한 주요 함수:

RefreshStageButtons()
RefreshStageButton()
ApplyStageButtonTexture()

버튼 동작 규칙:

Locked   → 잠금 이미지, 클릭 불가
Unlocked → 시작 이미지, 클릭 가능
Cleared  → 클리어 이미지, 재도전 가능

수정 위치:

  • LobbyWidget.h = 이미지 갱신 함수 선언
  • LobbyWidget.cpp = 상태 조회 및 버튼 Texture 적용

6. LobbyWidget과 DataTable RowName 통일

DataTable RowName은 Stage01 형식인데 LobbyWidget은 기존에 Stage1 형식을 사용하고 있었다.

FName 기준으로 두 값은 서로 다르기 때문에 다음과 같이 통일했다.

Stage01
Stage02
Stage03
Stage04
Stage05
Stage06

Widget Blueprint의 StageRowNames 배열도 동일한 값으로 설정했다.

버튼 이름은 그대로 유지한다.

Button 이름 = Stage1
DataTable RowName = Stage01

버튼 이름과 RowName은 서로 다른 역할을 한다.


7. WBP_Lobby 연결 상태 확인

WBP_Lobby의 Bind Widgets 상태를 확인했다.

정상 연결 항목:

  • Stage1~Stage6
  • Setting_Btn
  • Back_Btn
  • SettingPanel
  • BackgroundBlur
  • DisplayComboBox
  • FullScreenComboBox

모든 항목에 초록색 체크가 표시되어 C++ 변수와 Widget Blueprint의 이름 및 타입이 정상적으로 연결된 것을 확인했다.


트러블슈팅

1. DataTable에 이미지를 넣어도 화면이 바뀌지 않는 문제

원인

DataTable은 에셋 정보를 보관할 뿐 UI에 자동으로 적용하지 않는다.

DataTable에 Texture 설정
≠ 자동 UI 변경

해결 방향

LobbyWidget에서 직접 다음 흐름을 처리하도록 구성했다.

진행 상태 확인
→ 해당 Row 조회
→ 상태별 Texture 선택
→ Button Style 변경

배운 점

DataTable은 데이터를 제공하고, 실제 화면 표현은 Widget이 담당해야 한다.


2. Stage1과 Stage01 불일치

문제

LobbyWidget:

Stage1

DataTable:

Stage01

두 값이 달라 Row 검색에 실패할 수 있었다.

해결

LobbyWidget의 StageRowNames 배열을 Stage01~Stage06으로 변경했다.

[0] Stage01
[1] Stage02
...
[5] Stage06

3. Failed to load package "" 오류

문제

맵 이동 시 다음 오류가 발생했다.

Failed to load package "". Exiting.

원인

BP_SFGameInstance에 이동할 레벨이 지정되지 않아 빈 맵 경로로 이동을 요청했다.

해결

BP_SFGameInstance의 Class Defaults에서 다음 값을 다시 지정했다.

Title Level = 타이틀 맵
Lobby Level = 로비 맵
Stage Data Table = DT_SFStage

DT_SFStage의 StageLevel도 함께 확인했다.

배운 점

맵 이동 코드가 정상이어도 Soft Object 레벨 설정이 비어 있으면 빈 패키지 로드 오류가 발생한다. 이동 문제 발생 시 코드뿐만 아니라 BP_SFGameInstance의 에디터 설정도 함께 확인해야 한다.


추가 확인이 필요한 부분

  • Stage02~Stage06 DataTable Row 구성
  • 각 Row의 StageOrder, StageLevel, 상태별 이미지 지정
  • Stage01 승리 후 로비 복귀 시 이미지 전환 테스트
  • Stage01 = Cleared, Stage02 = Unlocked 여부 확인
  • GameInstance의 선택된 Stage ID를 GameState::InitializeStage()로 전달
  • 실제 자원 시스템과 GameState Setter 연결
  • 게임 종료 후에도 진행도를 유지하기 위한 SaveGame 적용

다음 테스트 목표

타이틀
→ Start
→ 로비 최초 상태 확인
→ Stage01 선택
→ 인게임 승리
→ Stage01 클리어 로그 확인
→ 로비 복귀
→ Stage01 클리어 이미지 확인
→ Stage02 열린 이미지 확인

현재까지는 스테이지 진행 상태 계산과 UI 이미지 적용 구조를 구성했으며, 다음 작업에서는 전체 흐름을 에디터에서 실제로 검증할 예정이다.