Refactor course maps and travel UI
This commit is contained in:
+22
-1
@@ -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
@@ -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
@@ -97,10 +97,17 @@ HUD:
|
||||
방향:
|
||||
|
||||
- 여행 정산표 느낌
|
||||
- 클리어/실패
|
||||
- 획득 마일리지
|
||||
- 보상 기념품
|
||||
- 면세점/다음 맵/재도전 버튼
|
||||
- 클리어 문구는 `출국 성공!`
|
||||
- 필요한 정보만 표시
|
||||
- 목적지
|
||||
- 획득 마일리지
|
||||
- 도착 시간
|
||||
- 이동 거리
|
||||
- 보상 기념품
|
||||
- 버튼은 클리어 시 `면세점으로`, 실패 시 `다시 도전`
|
||||
- 보조 버튼은 `인트로` 대신 `다음 여행지 가기`
|
||||
- 배경은 인천공항 배경을 사용
|
||||
- 여권 페이지, 출국 도장, 마일리지/시간/체크포인트/기념품 아이콘, 공항 안내 패널 버튼을 사용
|
||||
|
||||
## DutyFreeShop
|
||||
|
||||
@@ -110,6 +117,8 @@ HUD:
|
||||
- 상품 진열 중심
|
||||
- 보유 마일리지 표시
|
||||
- 다음 맵 이동은 오른쪽 방향성으로 안내
|
||||
- 면세점 내부 컨셉 배경 위에 도시락, 방어막, 운동화, 마일리지 카드 상품 카드를 배치
|
||||
- 상품 카드는 아이템 이미지, 효과, 보유 수량, 가격, 구매 상태를 함께 표시
|
||||
- 구매 아이템은 실제 장착 슬롯과 연결 예정
|
||||
|
||||
## MapPreview
|
||||
|
||||
+31
-3
@@ -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
@@ -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
@@ -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` 목록에 새 맵 연결
|
||||
|
||||
@@ -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
@@ -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
|
||||
|
||||
|
||||
Reference in New Issue
Block a user