오늘 진행한 작업
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 이미지 적용 구조를 구성했으며, 다음 작업에서는 전체 흐름을 에디터에서 실제로 검증할 예정이다.
'StrikForge 프로젝트 > 작업일지' 카테고리의 다른 글
| StrikForge 8일차 - 오늘 한 일 (0) | 2026.08.14 |
|---|---|
| StrikForge 7일차 - 오늘 한 일 (0) | 2026.08.12 |
| StrikeForge 5일차 - 오늘의 한일 (0) | 2026.08.10 |
| StrikForge 4일차 - 오늘 한 일 (0) | 2026.08.06 |
| StrikForge 3일차 - 오늘 한 일 (0) | 2026.08.05 |