Refactor course maps and travel UI

This commit is contained in:
jongjae0305
2026-07-07 15:57:11 +09:00
parent 74498dcf87
commit a708f18499
37 changed files with 1983 additions and 1633 deletions
+22 -1
View File
@@ -9,11 +9,13 @@
| 파일 | 용도 |
| --- | --- |
| `Assets/Resources/UI_LeftHudPassportHorizontalGridPanel.png` | 현재 적용 중인 가로형 왼쪽 여권 HUD 배경 |
| `Assets/Resources/UI_LeftHudPassportCompactPanel.png` | 오른쪽 빈 장식 영역을 줄인 왼쪽 HUD 전용 컴팩트 여권 배경 |
| `Assets/Resources/UI_LeftHudPassportPanel.png` | 이전 큰 세로형 왼쪽 여권 HUD 배경 |
| `Assets/Resources/UI_PassportPanel.png` | 기존 작은 왼쪽 여권 HUD 배경 |
| `Assets/Resources/UI_JJ_PassportPhoto.png` | 현재 적용 중인 JJ 여권사진 UI |
| `Assets/Resources/UI_JJ_Face.png` | 플레이어 얼굴 UI |
| `Assets/Resources/UI_LifeStamp.png` | 목숨 도장 |
| `Assets/Resources/UI_DepartureStamp_Red.png` | 배경 없는 출국 도장 |
| `Assets/Resources/UI_PassportItemSlot.png` | 아이템 슬롯 |
| `Assets/Resources/Map_Tutorial_Incheon_Airport.png` | 튜토리얼 인천공항 배경 |
| `Assets/Resources/Map_America_NewYork.png` | 미국 뉴욕 배경 |
@@ -57,7 +59,8 @@
| 파일 | 용도 |
| --- | --- |
| `Assets/Resources/UI_LeftHudPassportHorizontalGridPanel.png` | 실제 적용하는 가로형 여권 2줄 그리드 HUD 런타임 PNG |
| `Assets/Resources/UI_LeftHudPassportCompactPanel.png` | 실제 적용하는 컴팩트 가로형 여권 2줄 그리드 HUD 런타임 PNG |
| `Assets/Resources/UI_LeftHudPassportHorizontalGridPanel.png` | 결과 화면과 원본 보관용 가로형 여권 2줄 그리드 HUD PNG |
| `Assets/ConceptArt/left_hud_passport_horizontal_grid_panel_concept_01.png` | 가로형 여권 2줄 그리드 HUD 컨셉 원본 |
| `Assets/Resources/UI_JJ_PassportPhoto.png` | 오프닝 만화의 JJ를 바탕으로 만든 현재 여권사진 런타임 PNG |
| `Assets/ConceptArt/jj_passport_photo_concept_01.png` | JJ 여권사진 컨셉 원본 |
@@ -96,6 +99,24 @@
| `Assets/ConceptArt/right_hud_luggage_label_china_concept_01.png` | 가로형 중국 버전 컨셉 원본 |
| `Assets/ConceptArt/right_hud_luggage_label_america_concept_01.png` | 가로형 미국 버전 컨셉 원본 |
## Result UI Assets
결과 화면은 여권 정산표처럼 필요한 정보만 간추려 보여줍니다.
| 파일 | 용도 |
| --- | --- |
| `Assets/Resources/UI_LeftHudPassportHorizontalGridPanel.png` | 결과 화면 여권 정산표 배경 |
| `Assets/Resources/UI_DepartureStamp_Red.png` | `출국 성공!` 클리어 도장 |
| `Assets/Sprites/UIIcons/UI_ClearRank.png` | 클리어 배지 |
| `Assets/Sprites/UIIcons/UI_Mileage.png` | 마일리지 스탯 |
| `Assets/Sprites/UIIcons/UI_Timer.png` | 도착 시간 스탯 |
| `Assets/Sprites/UIIcons/UI_Checkpoint.png` | 이동 거리/목적지 스탯 |
| `Assets/Sprites/UIIcons/UI_DutyFreeShop.png` | `면세점으로` 버튼 아이콘 |
| `Assets/Sprites/UIIcons/UI_AirplaneTravel.png` | `다음 여행지 가기` 버튼 아이콘 |
| `Assets/Resources/UI_TutorialNextButton.png` | 결과 화면 버튼 배경 |
| `Assets/Resources/Map_Tutorial_Incheon_Airport.png` | 결과 화면 뒤 인천공항 배경 |
| `Assets/Sprites/Souvenirs/` | 맵별 보상 기념품 표시 |
## Opening Story Assets
| 파일/폴더 | 용도 |
+23 -3
View File
@@ -19,6 +19,7 @@ README.md
| [gameplay.md](gameplay.md) | 조작, 장애물, 아이템, 클리어 조건 |
| [maps.md](maps.md) | 맵별 배경, 도착 지점, 패턴 방향 |
| [systems.md](systems.md) | 씬 흐름, 저장/로드, 면세점, 맵 해금 |
| [refactor-plan.md](refactor-plan.md) | 스크립트 책임 분리와 리팩터링 순서 |
| [feedback.md](feedback.md) | 날짜별 수정 기록과 다음 할 일 |
## 게임 핵심
@@ -73,6 +74,9 @@ Intro
랜덤 배치가 아니라 검증된 패턴을 이어붙이는 방식으로 갑니다.
튜토리얼 코스와 일반 여행 맵 코스는 분리합니다.
튜토리얼은 조작 학습과 아이템 체험을 담당하고, 일본/중국/미국은 일반 반복 패턴과 맵별 난이도 차이를 담당합니다.
```text
기본 발판
-> 점프 장애물
@@ -85,6 +89,21 @@ Intro
이 방식은 플레이어가 왜 그 조작을 해야 하는지 실제로 체험하게 만듭니다.
## 현재 구조 정리 방향
현재 `GameFlowManager`, `GameManager`, `MapDatabase`, `PlatformSpawner`에 책임이 크게 모여 있습니다.
동작을 바꾸기보다 책임을 분리하는 방향으로 정리합니다.
우선순위:
1. 완료: `PlatformSpawner.TutorialStep``CourseStep`으로 독립
2. 완료: 맵별 정의를 `Maps/Definitions`로 분리
3. 튜토리얼/일본/중국/미국 코스를 `CourseProfile`로 분리
4. 결과 화면, 면세점, 디버그 메뉴를 화면 View로 분리
5. 게임 HUD와 튜토리얼 안내창을 `GameManager`에서 분리
자세한 기준은 [refactor-plan.md](refactor-plan.md)를 봅니다.
## 문서 운영 규칙
- `README.md`는 짧은 입구로 유지합니다.
@@ -96,6 +115,7 @@ Intro
## 다음 작업 우선순위
1. 면세점 구매 아이템을 장착 슬롯과 연결
2. 일본, 중국, 미국 맵의 실제 반복 패턴과 난이도 차별화
3. 도착 지점 이미지의 실제 화면 크기를 플레이하면서 세부 조정
1. 튜토리얼 코스와 일반 맵 코스를 `CourseProfile`로 분리
2. `PlatformSpawner`의 fallback 코스 생성 책임 이동
3. `GameFlowManager`의 화면 UI를 View 클래스로 분리
4. 면세점 구매 아이템을 장착 슬롯과 연결
+13 -4
View File
@@ -97,10 +97,17 @@ HUD:
방향:
- 여행 정산표 느낌
- 클리어/실패
- 획득 마일리지
- 보상 기념품
- 면세점/다음 맵/재도전 버튼
- 클리어 문구는 `출국 성공!`
- 필요한 정보만 표시
- 목적지
- 획득 마일리지
- 도착 시간
- 이동 거리
- 보상 기념품
- 버튼은 클리어 시 `면세점으로`, 실패 시 `다시 도전`
- 보조 버튼은 `인트로` 대신 `다음 여행지 가기`
- 배경은 인천공항 배경을 사용
- 여권 페이지, 출국 도장, 마일리지/시간/체크포인트/기념품 아이콘, 공항 안내 패널 버튼을 사용
## DutyFreeShop
@@ -110,6 +117,8 @@ HUD:
- 상품 진열 중심
- 보유 마일리지 표시
- 다음 맵 이동은 오른쪽 방향성으로 안내
- 면세점 내부 컨셉 배경 위에 도시락, 방어막, 운동화, 마일리지 카드 상품 카드를 배치
- 상품 카드는 아이템 이미지, 효과, 보유 수량, 가격, 구매 상태를 함께 표시
- 구매 아이템은 실제 장착 슬롯과 연결 예정
## MapPreview
+31 -3
View File
@@ -19,18 +19,46 @@
- 오른쪽 HUD에는 거리와 이번 판 적립 마일리지만 표시
- 오른쪽 HUD는 맵에 따라 한국/일본/중국/미국 라벨을 자동으로 바꾸고, 원본 기준 약 60% 크기로 표시
- 오른쪽 HUD 글자는 부모 스케일 축소 대신 실제 크기로 배치해 회색 번짐을 줄임
- 튜토리얼 설명창 글자 위치를 오른쪽으로 조정
- 슬라이드 안내 이미지를 더 낮게 숙인 프레임으로 교체
- 라멘 무적 체험 뒤 방어막이 바로 나오지 않도록 안전 발판 간격 추가
- 튜토리얼 아이템 순서를 `초밥 -> 라멘 -> 방어막 -> 마일리지 카드 -> 운동화`로 조정
- 운동화 뒤에 속도 변화 설명과 출국 게이트까지 실전 연습 안내를 추가
- `Platform.prefab`에서 내장 장애물을 제거하고 발판 전용 프리팹으로 정리
- 출국 버튼 도장은 종이 배경이 같이 찍히지 않도록 투명 배경의 빨간 잉크 리소스로 교체
- 2단 점프 설명 이미지의 `X2` 표시를 더 크게 조정하고 외곽선을 추가
- 강제 피격 구간에서 점프 장애물과 슬라이드 장애물이 같은 위치에 겹치지 않도록 슬라이드 장애물 생성을 제거
- 결과 화면을 `출국 성공!` 여권 정산표 형태로 변경하고, 마일리지/시간/거리/보상만 간추려 표시
- 결과 화면 배경을 인천공항으로 바꾸고, 아이콘/글자/도장 위치를 여권 슬롯에 맞춰 재배치
- 결과 화면의 `인트로` 버튼을 `다음 여행지 가기`로 바꾸고 기존 공항 안내 버튼 에셋을 적용
- 결과 화면에서 `No cameras rendering` 경고가 뜨지 않도록 플로우 카메라를 보장하고, 버튼 글자를 밝은 색/외곽선으로 보정
- 왼쪽 HUD는 오른쪽 빈 장식 영역을 줄인 컴팩트 여권 배경으로 교체하고, HP/아이템 슬롯 비율과 간격을 재조정
- 면세점 화면을 내부 배경과 상품 카드형 UI로 교체하고, 도시락/방어막/운동화/마일리지 카드 구매 상태를 표시
- `Esc` 디버그 메뉴로 인트로, 게임 시작, 출국 실패, 출국 성공, 면세점, 지도 화면을 바로 확인할 수 있게 수정
- 스크립트 책임 분리 방향을 `Docs/refactor-plan.md`에 정리
- 맵별 정의와 코스 패턴을 `CourseStep` / `CourseProfile` 중심으로 나누는 리팩터링 방향을 문서화
- `PlatformSpawner.TutorialStep`을 독립 `CourseStep`, `CourseStepKind`, `CoursePlatformType` 파일로 분리
- `MapDefinition`, `MapDatabase`, `GameManager`가 새 `CourseStep` 타입을 참조하도록 정리
- `MapDatabase`의 맵별 생성 코드를 `Maps/Definitions/*Map.cs` 파일로 분리
- 공통 코스 조각 생성과 복제 로직을 `CourseStepFactory`로 이동
### 현재 문제
- `GameFlowManager`에 화면 흐름과 UI 생성 코드가 함께 몰려 있음
- `GameManager`에 플레이 진행, HUD, 튜토리얼, 도착 처리 코드가 함께 몰려 있음
- 코스 배열은 아직 `CourseProfile`로 묶이지 않고 `openingSteps`, `loopSteps`로 직접 연결됨
- `PlatformSpawner`에 fallback 코스 생성 코드가 아직 남아 있음
- 면세점 구매 아이템이 아직 장착 슬롯과 연결되지 않음
- 일본, 중국, 미국 맵의 실제 패턴과 난이도 차별화가 더 필요함
- 새 HUD 이미지들은 실제 플레이 화면에서 위치와 글자 크기를 한 번 더 미세 조정할 수 있음
### 다음 할 일
1. 면세점 구매 아이템을 장착 슬롯과 연결
2. 일본, 중국, 미국 맵의 실제 패턴과 난이도 차별화
3. 새 HUD와 튜토리얼 안내창의 실제 플레이 화면 가독성 최종 확인
1. 튜토리얼 코스와 일본/중국/미국 일반 코스를 `CourseProfile`로 분리
2. `PlatformSpawner`의 fallback 코스 생성 책임을 `Course` 쪽으로 이동
3. `GameFlowManager`의 결과 화면, 면세점, 디버그 메뉴 UI를 View 클래스로 분리
4. `GameManager`의 HUD와 튜토리얼 안내창을 별도 스크립트로 분리
5. 면세점 구매 아이템을 장착 슬롯과 연결
## 2026-07-06
+35 -4
View File
@@ -40,8 +40,9 @@
1. 점프: 낮은 장애물 1개
2. 2단 점프: 멀리 떨어진 발판
3. 슬라이드: 천장 장애물
4. 강제 피격: 일부러 맞아 목숨/속도 감소 체험
5. 아이템: 각 아이템을 먹고 효과 체험
4. 강제 피격: 낮은 장애물에 일부러 맞아 목숨/속도 감소 체험
5. 아이템: 초밥, 라멘, 방어막, 마일리지 카드, 운동화 순서로 효과 체험
6. 실전 연습: 속도 변화 설명 후 출국 게이트까지 주행
## 아이템
@@ -50,11 +51,11 @@
| 초밥 | 목숨 1 회복 | 강제 피격 후 회복 |
| 라멘 | 잠깐 무적 | 먹은 뒤 장애물 통과 |
| 방어막 | 충돌 1회 방어 | 먹은 뒤 다음 충돌 방어 |
| 운동화 | 속도 회복 | 피격 후 느려진 속도 회복 |
| 마일리지 카드 | 마일리지 획득량 증가 | 먹은 뒤 마일리지 수집 |
| 운동화 | 속도 회복 | 피격 후 느려진 속도 회복 |
아이템을 먹으면 짧은 링, 반짝임, 문구 이펙트가 떠서 획득 여부를 확인할 수 있습니다.
라멘 무적 아이템의 현재 지속 시간은 `2.2초`니다.
라멘 무적 아이템의 현재 지속 시간은 `2.2초`이며, 튜토리얼에서는 방어막이 바로 이어지지 않도록 안전 발판을 사이에 둡니다.
점프 구간의 마일리지 코인은 플레이어가 뛰는 높이에 맞춰 넓고 높은 포물선으로 배치합니다.
게임 속도가 빨라지면 코인 포물선의 가로 폭도 함께 넓혀 점프 타이밍과 맞춥니다.
@@ -63,6 +64,8 @@
## 코스 생성
현재 방향은 개별 랜덤 생성이 아니라 검증된 코스 조각을 순서대로 배치하는 방식입니다.
코스 조각은 `CourseStep`으로 분리했습니다.
다음 리팩터링에서는 여러 조각의 묶음을 `CourseProfile`로 분리합니다.
패턴 예시:
@@ -75,3 +78,31 @@
- Finish
이 방식은 쿠키런식으로 계속 이어지는 기본 발판을 유지하면서도, 장애물과 아이템은 상황에 맞게 배치할 수 있습니다.
## CourseProfile 방향
튜토리얼과 일반 맵의 코스 목적을 분리합니다.
| 프로필 | 목적 |
| --- | --- |
| `TutorialCourseProfile` | 조작 학습, 강제 피격, 아이템 체험, 실전 연습 |
| `JapanCourseProfile` | 쉬운 일반 반복 패턴 |
| `ChinaCourseProfile` | 간격 변화와 점프/슬라이드 전환 |
| `AmericaCourseProfile` | 빠른 속도와 후반 난이도 |
현재 `PlatformSpawner``CourseStep` 배열을 순서대로 실행합니다.
다음 목표는 코스 내용을 `CourseProfile`로 묶어, 스포너가 맵별 코스 정의를 직접 만들지 않게 하는 것입니다.
튜토리얼 전용 요소:
- 조작 안내 문구
- 강제 피격 체험
- 아이템 설명 트리거
- 출국 게이트 전 실전 연습 안내
일반 맵 전용 요소:
- 반복 가능한 점프/슬라이드 조합
- 맵별 장애물 스킨
- 맵별 속도와 간격 차이
- 보상 마일리지와 도착 지점 연출
+64 -4
View File
@@ -20,6 +20,42 @@
- `openingSteps`
- `loopSteps`
리팩터링 목표:
- `openingSteps`, `loopSteps``CourseProfile` 기반 이름으로 정리합니다.
- `PlatformSpawner.TutorialStep``CourseStep`으로 독립시켰습니다.
- `MapDatabase`는 맵 목록 관리만 담당하고, 실제 맵 정의는 맵별 파일로 나눴습니다.
현재 구조:
```text
MapDatabase
-> Definitions/TutorialIncheonMap.cs
-> Definitions/JapanMap.cs
-> Definitions/ChinaMap.cs
-> Definitions/AmericaMap.cs
Course
-> TutorialCourseProfile.cs
-> JapanCourseProfile.cs
-> ChinaCourseProfile.cs
-> AmericaCourseProfile.cs
```
## 코스 분리 기준
튜토리얼과 일반 맵은 같은 구조를 복사하지 않습니다.
| 코스 | 목적 |
| --- | --- |
| Tutorial / Incheon | 조작 학습, 강제 피격, 아이템 효과 체험, 출국 게이트 실전 연습 |
| Japan | 첫 일반 맵, 쉬운 점프/슬라이드 반복 패턴 |
| China | 간격 변화, 연속 슬라이드/점프 확장 |
| America | 빠른 속도, 후반 난이도, 긴 주행 압박 |
현재 `PlatformSpawner`는 맵이 가진 `CourseStep` 배열을 실행합니다.
다음 목표는 맵별 코스를 `CourseProfile`로 묶어, 스포너가 현재 맵의 프로필만 실행하게 만드는 것입니다.
## Tutorial / Incheon
역할:
@@ -45,8 +81,9 @@
5. 초밥
6. 라멘
7. 방어막
8. 운동화
9. 마일리지 카드
8. 마일리지 카드
9. 운동화
10. 실전 연습 후 출국 게이트
## Japan
@@ -54,6 +91,7 @@
- 첫 일반 여행 맵
- 튜토리얼에서 배운 조작을 반복 패턴으로 사용
- 튜토리얼 설명, 강제 피격 체험, 아이템 설명 트리거는 사용하지 않음
도착 지점:
@@ -66,12 +104,20 @@
- 석등 낮은 장애물
- 배너/표지판 슬라이드 장애물
코스 방향:
- 안전 발판으로 시작
- 낮은 점프 장애물과 짧은 슬라이드를 번갈아 배치
- 마일리지 코인은 점프 아크와 안전 라인 중심
- 튜토리얼보다 긴 반복 패턴을 사용하되 난이도는 낮게 유지
## China
역할:
- 붉은색/금색 지역감
- 슬라이드와 점프 패턴 확장
- 일본보다 장애물 간격 변화가 큼
도착 지점:
@@ -84,12 +130,19 @@
- 시장 상자 낮은 장애물
- 홍등 슬라이드 장애물
코스 방향:
- 점프 뒤 슬라이드, 슬라이드 뒤 점프처럼 전환 패턴을 늘림
- 마일리지 라인은 안전 구간과 위험 보상 구간을 구분
- 튜토리얼용 강제 피격 패턴은 사용하지 않음
## America
역할:
- 뉴욕 도착 맵
- 자유의 여신상에 도착하면 클리어되는 느낌
- 후반 맵답게 속도와 반응 시간을 더 강하게 사용
배경:
@@ -107,13 +160,20 @@
- 콘/도로 장애물
- 배너/표지판 슬라이드 장애물
코스 방향:
- 넓은 점프와 짧은 슬라이드가 빠르게 이어짐
- 안전 발판 비중은 줄이고 패턴 반복 속도를 올림
- 도착 지점 전 마지막 구간은 시야가 복잡하지 않게 정리
## 맵 추가 규칙
새 맵을 추가할 때:
1. `MapId` 추가
2. `MapDatabase``CreateMap()` 추가
2. `Maps/Definitions`에 맵별 정의 파일 추가
3. 배경 이미지를 `Assets/Resources/Map_*.png`로 저장
4. 도착 지점 이미지를 `Assets/Resources/FinishGate_*.png`로 저장
5. `backgroundResourcePath`, `finishGateStyle` 연결
6. `openingSteps`, `loopSteps` 구성
6. `Course` 폴더에 해당 맵의 `CourseProfile` 추가
7. `MapDatabase` 목록에 새 맵 연결
+219
View File
@@ -0,0 +1,219 @@
# Refactor Plan
스크립트가 커진 이유와 앞으로 나눌 구조를 정리합니다.
이 문서는 실제 리팩터링 기준과 진행 상태를 함께 정리합니다.
## 목표
현재 목표는 기능을 바꾸는 것이 아니라 책임을 분리하는 것입니다.
- `GameFlowManager`는 화면 흐름만 관리
- `GameManager`는 플레이 세션의 큰 흐름만 관리
- 화면 UI는 화면별 View 클래스로 분리
- 맵 데이터는 맵별 파일로 분리
- 코스 패턴은 튜토리얼 전용과 일반 맵 전용으로 분리
- `PlatformSpawner`는 코스를 직접 정의하지 않고 받은 코스만 실행
## 현재 문제
### GameFlowManager
현재 `GameFlowManager`가 담당하는 일이 너무 많습니다.
- 씬 흐름
- 저장 데이터 처리
- 결과 화면 UI 생성
- 면세점 UI 생성
- 인트로 UI 생성
- 맵 프리뷰 UI 생성
- 디버그 메뉴
- 공통 UI 오브젝트 생성
- 이미지/스프라이트 로딩
최종적으로는 흐름 제어만 남기고 화면 생성 코드는 `Flow/Screens`로 옮깁니다.
### GameManager
현재 `GameManager`도 플레이와 UI가 섞여 있습니다.
- 게임 시작/종료
- 거리/시간/점수 계산
- 목숨/피격/무적
- 아이템 효과
- 튜토리얼 설명창
- 왼쪽/오른쪽 HUD
- 도착 게이트 생성
- 코스 미니맵 내부 클래스
최종적으로는 플레이 세션 관리만 남기고 HUD, 튜토리얼, 도착 게이트, 아이템 효과를 분리합니다.
### Map / Course
`PlatformSpawner.TutorialStep`은 독립 `CourseStep` 타입으로 분리했습니다.
맵별 생성 코드는 `Maps/Definitions/*Map.cs`로 분리했습니다.
아직 코스 배열은 `CourseProfile`로 묶이지 않고 `openingSteps`, `loopSteps`로 직접 연결되어 있습니다.
최종적으로는 `CourseProfile`을 독립 타입으로 만들고, 맵은 코스 프로필만 참조하게 합니다.
## 목표 폴더 구조
```text
Assets/Scripts
├─ Flow
│ ├─ GameFlowManager.cs
│ ├─ FlowScreen.cs
│ ├─ FlowScreenContext.cs
│ ├─ Screens
│ │ ├─ IntroScreenView.cs
│ │ ├─ OpeningStoryScreenView.cs
│ │ ├─ ResultScreenView.cs
│ │ ├─ DutyFreeShopView.cs
│ │ ├─ MapPreviewScreenView.cs
│ │ └─ DebugMenuView.cs
│ └─ UI
│ ├─ FlowUiFactory.cs
│ └─ FlowAssetLoader.cs
├─ Gameplay
│ ├─ GameManager.cs
│ ├─ GameplaySession.cs
│ ├─ StageProgressTracker.cs
│ ├─ FinishGateController.cs
│ ├─ ItemEffectController.cs
│ └─ DamageController.cs
├─ Gameplay/UI
│ ├─ GameplayHudView.cs
│ ├─ TutorialGuideController.cs
│ ├─ TutorialGuideView.cs
│ └─ CourseMinimapView.cs
├─ Maps
│ ├─ MapId.cs
│ ├─ MapDefinition.cs
│ ├─ MapDatabase.cs
│ └─ Definitions
│ ├─ TutorialIncheonMap.cs
│ ├─ JapanMap.cs
│ ├─ ChinaMap.cs
│ └─ AmericaMap.cs
└─ Course
├─ CourseStep.cs
├─ CourseStepKind.cs
├─ CoursePlatformType.cs
├─ CourseStepFactory.cs
├─ CourseProfile.cs
├─ TutorialCourseProfile.cs
├─ JapanCourseProfile.cs
├─ ChinaCourseProfile.cs
└─ AmericaCourseProfile.cs
```
## 책임 분리 기준
### Flow
`GameFlowManager`는 다음만 담당합니다.
- 현재 화면 상태
- 씬 이동
- 저장 데이터 로드/저장
- 게임 시작 요청
- 결과 화면으로 이동
- 다음 맵 선택
화면 구성은 각 View가 담당합니다.
| 화면 | 분리 대상 |
| --- | --- |
| Intro | `IntroScreenView` |
| Opening Story | `OpeningStoryScreenView` |
| Result | `ResultScreenView` |
| DutyFreeShop | `DutyFreeShopView` |
| MapPreview | `MapPreviewScreenView` |
| Debug Menu | `DebugMenuView` |
공통 UI 생성은 `FlowUiFactory`, 에셋 로딩은 `FlowAssetLoader`로 옮깁니다.
### Gameplay
`GameManager`는 플레이 세션의 큰 흐름만 담당합니다.
| 책임 | 분리 대상 |
| --- | --- |
| 거리/시간/클리어 판정 | `StageProgressTracker` |
| 도착 게이트 생성/정리 | `FinishGateController` |
| 목숨/피격/무적/방어막 | `DamageController` |
| 아이템 효과 | `ItemEffectController` |
| 왼쪽/오른쪽 HUD | `GameplayHudView` |
| 튜토리얼 안내창 표시 | `TutorialGuideView` |
| 튜토리얼 단계 제어 | `TutorialGuideController` |
| 코스 미니맵 | `CourseMinimapView` |
### Maps / Course
맵 데이터와 코스 실행을 분리합니다.
현재:
```text
MapDefinition
-> CourseStep[]
-> Maps/Definitions/*Map.cs가 맵별 코스 배열을 직접 생성
-> PlatformSpawner가 fallback 패턴도 직접 생성
```
목표:
```text
MapDefinition
-> CourseProfile
-> CourseStep[]
-> PlatformSpawner는 CourseStep을 실행만 함
```
튜토리얼과 일반 맵은 역할이 다릅니다.
| 코스 | 역할 |
| --- | --- |
| `TutorialCourseProfile` | 조작 학습, 강제 피격, 아이템 체험, 실전 연습 |
| `JapanCourseProfile` | 첫 일반 맵, 쉬운 반복 패턴 |
| `ChinaCourseProfile` | 간격 변화와 슬라이드/점프 확장 |
| `AmericaCourseProfile` | 빠른 속도와 후반 난이도 |
## 진행 순서
1. 완료: `CourseStep` 분리
- `PlatformSpawner.TutorialStep`을 독립 파일로 이동
- `TutorialStep` 이름을 `CourseStep`으로 변경
- `CourseStepKind`, `CoursePlatformType`도 독립 파일로 이동
- 남은 이름 정리는 `CourseProfile` 분리 때 함께 진행
2. 완료: 맵 정의 파일 분리
- `MapDatabase.cs`는 목록 관리만 담당
- `TutorialIncheonMap`, `JapanMap`, `ChinaMap`, `AmericaMap`으로 나눔
3. 다음: 코스 프로필 분리
- 튜토리얼 코스와 일반 맵 코스를 각각 `CourseProfile`로 분리
- 일본, 중국, 미국은 튜토리얼 패턴을 복붙하지 않음
4. `GameFlowManager` 화면 View 분리
- 결과 화면, 면세점, 디버그 메뉴부터 분리
- 위치 조정 중인 UI 값은 유지한 채 파일만 나눔
5. `GameManager` UI/진행 분리
- HUD와 튜토리얼 안내창을 먼저 분리
- 이후 도착 게이트, 아이템, 피격 처리 분리
6. 검증
- 각 단계마다 `dotnet build Assembly-CSharp.csproj`
- Unity Play 모드에서 `Esc` 디버그 메뉴로 화면 확인
- 튜토리얼, 일본, 중국, 미국 맵 진입 확인
## 주의 사항
- 기능 변경과 파일 분리를 동시에 많이 하지 않습니다.
- UI 위치 조정이 끝난 화면은 좌표를 유지한 채 View로 옮깁니다.
- 맵별 난이도 조정은 코스 구조 분리 후 진행합니다.
- 삭제보다 이동을 우선하고, 빌드가 깨지지 않는 작은 단위로 진행합니다.
+68 -4
View File
@@ -5,6 +5,7 @@
## Scene Flow
`GameFlowManager`가 전체 흐름을 관리합니다.
다음 리팩터링 이후에는 `GameFlowManager`가 화면을 직접 그리지 않고, 화면별 View를 호출하는 구조로 정리합니다.
```text
Intro
@@ -37,6 +38,8 @@ Intro
- `Assets/Scripts/Maps/MapId.cs`
- `Assets/Scripts/Maps/MapDefinition.cs`
- `Assets/Scripts/Maps/MapDatabase.cs`
- `Assets/Scripts/Maps/Definitions/*.cs`
- `Assets/Scripts/Course/*.cs`
역할:
@@ -50,6 +53,27 @@ Intro
- 다음 맵
- 코스 패턴
현재는 `MapDefinition`이 독립 타입인 `CourseStep[]` 형태의 `openingSteps`, `loopSteps`를 들고 있습니다.
맵 생성 코드는 `Maps/Definitions/*Map.cs`로 분리했습니다.
다음 리팩터링에서는 `CourseProfile`을 만들고 맵별 파일에서 코스 프로필을 연결합니다.
목표 구조:
```text
MapDatabase
-> TutorialIncheonMap.Create()
-> JapanMap.Create()
-> ChinaMap.Create()
-> AmericaMap.Create()
MapDefinition
-> CourseProfile openingCourse
-> CourseProfile loopCourse
PlatformSpawner
-> CourseProfile 실행
```
## Gameplay Runtime
관련 파일:
@@ -73,20 +97,60 @@ Intro
- 아이템 획득/방어 성공 이펙트
- 도착 지점 통과 시 클리어
현재 `GameManager`는 플레이 진행과 UI를 함께 담당합니다.
리팩터링 후에는 아래처럼 책임을 나눕니다.
| 책임 | 목표 스크립트 |
| --- | --- |
| 플레이 세션 총괄 | `GameManager` |
| 거리/시간/클리어 판정 | `StageProgressTracker` |
| 도착 게이트 생성/정리 | `FinishGateController` |
| 목숨/피격/무적/방어막 | `DamageController` |
| 아이템 효과 | `ItemEffectController` |
| 왼쪽/오른쪽 HUD | `GameplayHudView` |
| 튜토리얼 안내창 | `TutorialGuideView` |
| 튜토리얼 단계 제어 | `TutorialGuideController` |
## Flow UI
현재 상태:
- `GameFlowManager` 안에 결과 화면, 면세점, 인트로, 맵 프리뷰, 디버그 메뉴 UI 생성 코드가 들어 있음
- 공통 UI 오브젝트 생성과 에셋 로딩도 같은 파일에 있음
목표 구조:
| 책임 | 목표 스크립트 |
| --- | --- |
| 흐름 제어 | `GameFlowManager` |
| 현재 화면 상태와 공통 데이터 | `FlowScreenContext` |
| 인트로 화면 | `IntroScreenView` |
| 오프닝 스토리 | `OpeningStoryScreenView` |
| 결과 화면 | `ResultScreenView` |
| 면세점 화면 | `DutyFreeShopView` |
| 맵 프리뷰 | `MapPreviewScreenView` |
| 디버그 메뉴 | `DebugMenuView` |
| 공통 UI 생성 | `FlowUiFactory` |
| UI 에셋 로딩 | `FlowAssetLoader` |
디버그 메뉴는 현재 `Esc`로 열며, 인트로/게임 시작/출국 실패/출국 성공/면세점/지도 화면으로 바로 이동합니다.
리팩터링 후에도 개발 빌드 전용 기능으로 유지합니다.
## DutyFreeShop
현재 상태:
- 화면 흐름은 있음
- 코드 오버레이 화면은 면세점 내부 배경과 상품 카드형 UI로 표시함
- 도시락, 방어막, 운동화, 마일리지 카드의 보유 수량과 가격을 표시함
- 구매 데이터 저장은 있음
- 실제 장착 슬롯과 플레이 시작 전 준비 구조는 아직 미완성
다음 방향:
1. 면세점 구매 아이템을 보유 수량으로 표시
2. 스테이지 시작 전 장착 슬롯에 넣기
3. 가방 업그레이드로 슬롯 수 증가
4. 스테이지 중 장착 아이템 사용/소모
1. 스테이지 시작 전 장착 슬롯에 넣기
2. 가방 업그레이드로 슬롯 수 증가
3. 스테이지 중 장착 아이템 사용/소모
## Finish Gate