오늘 진행한 작업
1. 핵심 건물 파괴 기반 승패 처리 테스트
임시 Actor Blueprint에 다음 컴포넌트를 추가하여 핵심 건물 파괴 흐름을 테스트했다.
- HealthComponent
- CoreObjectiveComponent
- StaticMeshComponent
K 키 입력 시 Apply Combat Damage로 충분한 대미지를 전달하도록 구성했다.
K 입력
→ CoreObjective에 대미지 적용
→ Health가 0이 됨
→ CoreObjectiveComponent가 파괴 감지
→ SFGameMode가 승리·패배 판정
→ 스테이지 종료
→ 로비 이동 요청
이를 통해 핵심 건물의 체력이 0이 되었을 때 CoreObjectiveComponent → SFGameMode → SFGameState로 승패 결과가 정상 전달되는 것을 확인했다.
2. 승리 후 로비 이동 흐름 확인
임시 테스트 Blueprint에서 승리 처리 후 SFGameInstance::MoveToLobby()를 호출하도록 연결했다.
로비 이동 과정에서 설정된 맵을 찾지 못하는 오류가 발생했지만, 승리 판정과 레벨 이동 요청까지는 정상적으로 실행된 것을 확인했다.
3. CoreObjective 변수 이름 검토
CoreObjectiveComponent의 LoserTeam과 SFGameMode의 DestroyedTeamIndex를 비교했다.
두 값은 별개의 기능이 아니라 동일한 팀 번호가 함수 호출 과정에서 다른 이름으로 사용된 것이었다.
LoserTeam
→ ProcessCoreDestroyed()에 전달
→ DestroyedTeamIndex로 사용
실제 판정 전에는 패배 팀이 확정된 것이 아니라 파괴된 코어의 팀을 의미하므로, DestroyedTeamIndex로 통일하는 것이 의미상 더 명확하다고 판단했다.
4. 타이틀 UI 코드 및 맵 이동 구조 확인
현재 StartWidget의 기능을 확인했다.
- Start 버튼: OpenLevel("Lobby") 직접 호출
- Setting 버튼: 설정 패널 표시 및 숨김
- 해상도 설정: 변경·적용·저장
- 화면 모드 설정: 변경·적용·저장
- Exit 버튼: 게임 종료
- ESC: 설정 패널 닫기
현재 Start 버튼은 SFGameInstance를 거치지 않고 직접 맵을 열고 있다.
맵 이동 경로를 한곳에서 관리하기 위해 다음 구조가 더 적합하다고 판단했다.
타이틀 Start 버튼
→ SFGameInstance::MoveToLobby()
로비 스테이지 선택
→ SelectStage(RowName)
→ MoveToStage()
UI는 맵 경로를 직접 관리하지 않고 Stage01 같은 RowName만 전달하며, 실제 맵은 DataTable에서 찾도록 구성하는 것이 유지보수에 유리하다.
5. 순차적 스테이지 진행 구조 조사 및 설계
스테이지를 Stage01~Stage07까지 순서대로 진행하는 구조를 검토했다.
최초:
Stage01 = Unlocked
Stage02~07 = Locked
Stage01 클리어 후:
Stage01 = Cleared
Stage02 = Unlocked
Stage03~07 = Locked
DataTable에는 상태별 표시 Mesh와 스테이지 순서를 보관하도록 구성했다.
- StageOrder
- LockedMesh
- UnlockedMesh
- ClearedMesh
실제 클리어 진행도는 DataTable을 변경하지 않고, 맵 이동 후에도 유지되는 SFGameInstance에서 관리하는 방향으로 결정했다.
게임을 완전히 종료한 뒤에도 진행도를 유지하려면 추후 SaveGame 적용이 필요하다.
트러블슈팅
1. Cast To CoreObjectiveComponent 오류
문제
임시 Actor Blueprint에서 Cast To CoreObjectiveComponent의 Object가 연결되지 않아 컴파일 오류가 발생했다.
The type of Object is undetermined
원인
테스트 Actor Blueprint가 이미 CoreObjectiveComponent를 직접 소유하고 있었기 때문에 Cast가 필요하지 않았다.
해결
Components 목록의 CoreObjective를 그래프로 직접 가져와 Apply Combat Damage의 Target에 연결했다.
K Pressed
→ Apply Combat Damage
CoreObjective → Target
Get Player Pawn → In Instigator
배운 점
자신이 직접 보유한 컴포넌트는 별도의 Cast 없이 컴포넌트 참조를 직접 사용할 수 있다.
2. 로비 이동 시 맵 로드 실패
문제
승리 후 로비 이동 과정에서 다음 오류가 발생했다.
Failed to load package
/Game/Developers/LJW/LJW/LJW_TESTLEVEL
원인
DefaultEngine.ini의 기본 맵이 다른 작업자의 개인 테스트 맵을 가리키고 있었으며, 현재 환경에서 해당 에셋을 불러올 수 없었다.
GameDefaultMap=/Game/Developers/LJW/LJW/LJW_TESTLEVEL.LJW_TESTLEVEL
EditorStartupMap=/Game/Developers/LJW/LJW/LJW_TESTLEVEL.LJW_TESTLEVEL
확인 결과
이 오류는 승패 판정 실패가 아니라 레벨 이동 대상 설정 문제였다.
코어 파괴
→ 승리 판정
→ 스테이지 종료
→ 맵 이동 요청
→ 대상 맵 로드 실패
승리 처리와 이동 요청 자체는 정상적으로 실행됐다.
배운 점
GameDefaultMap, EditorStartupMap, SFGameInstance::LobbyLevel은 서로 다른 설정이므로 구분해서 확인해야 한다.
3. DataTable을 사용하면서 RowName을 코드에 고정할 위험
문제
로비 UI 예시 코드에 다음처럼 스테이지 ID를 직접 작성하면 스테이지가 늘어날 때 반복 코드가 발생한다.
SelectStage(TEXT("Stage01"));
개선 방향
각 스테이지 UI 항목이 자신의 StageRowName을 보관하고 공용 함수를 통해 전달하도록 구성한다.
DataTable에서 Row 조회
→ 스테이지 UI 항목 생성
→ 각 항목이 RowName 보관
→ 클릭 시 SelectStage(StageRowName)
→ MoveToStage()
UI는 맵 경로를 알 필요가 없으며, GameInstance가 RowName을 이용해 DataTable에서 실제 맵을 찾는다.
4. 잠긴 스테이지 선택 가능성 발견
문제
클리어 기록에서는 순서 건너뛰기를 차단하지만, 현재 SelectStage()는 Row와 맵 존재 여부만 검사한다.
따라서 외부에서 Stage07을 직접 전달하면 잠긴 상태에서도 입장할 가능성이 있다.
개선 방향
SelectStage()에서 다음 조건을 추가해야 한다.
GetStageProgressState(StageRowName) == Locked
→ 선택 실패
이 부분은 다음 작업에서 보완하고 실제 Stage01~07 DataTable과 Mesh를 적용하여 테스트할 예정이다.
다음 작업
- UI·맵 담당자와 타이틀 및 로비 이동 방식 확인
- SelectStage()의 잠긴 스테이지 선택 차단
- 승리 확정 시 현재 Stage Row 클리어 기록
- 로비에서 Locked/Unlocked/Cleared 상태별 Mesh 적용
- Stage01~07 순차 해제 테스트
- 게임 재실행 후 진행도 유지를 위한 SaveGame 적용 검토
'StrikForge 프로젝트 > 작업일지' 카테고리의 다른 글
| StrikForge 7일차 - 오늘 한 일 (0) | 2026.08.12 |
|---|---|
| StrikForge 6일차 - 오늘 한 일 (0) | 2026.08.12 |
| StrikForge 4일차 - 오늘 한 일 (0) | 2026.08.06 |
| StrikForge 3일차 - 오늘 한 일 (0) | 2026.08.05 |
| StrikeForge 오늘 한 일 2일차 (0) | 2026.08.04 |