Add duty free systems and travel stage updates

This commit is contained in:
jongjae0305
2026-07-09 02:50:48 +09:00
parent 445d74d462
commit 750e9ce0a6
340 changed files with 21825 additions and 1197 deletions
+98 -17
View File
@@ -11,6 +11,14 @@
| `Assets/Resources/UI_ResultBoardingPassPanel_New.png` | 현재 적용 중인 결과 화면 보딩패스형 정산 패널 배경 |
| `Assets/Resources/UI_LeftHudPassportHorizontalGridPanel.png` | 현재 적용 중인 가로형 왼쪽 여권 HUD 배경 |
| `Assets/Resources/UI_LeftHudPassportCompactPanel.png` | 오른쪽 빈 장식 영역을 줄인 왼쪽 HUD 전용 컴팩트 여권 배경 |
| `Assets/Resources/UI_PassportHudPhotoFrame.png` | 왼쪽 HUD 사진/정보 박스 프레임 |
| `Assets/Resources/UI_PassportHudPhotoHeader.png` | 왼쪽 HUD 사진/정보 박스 상단 여권 장식 |
| `Assets/Resources/UI_PassportHudPhotoRouteBox.png` | 왼쪽 HUD 안쪽 항공권 경로 박스 선택 리소스 |
| `Assets/Resources/UI_PassportHudPhotoInfoStrip.png` | 왼쪽 HUD 안쪽 항공권 정보줄 선택 리소스 |
| `Assets/Resources/UI_PassportHudLifeCircleFrame.png` | 왼쪽 HUD 오른쪽 영역의 HP 원형 프레임 |
| `Assets/Resources/UI_PassportHudItemSlotFrame.png` | 왼쪽 HUD 오른쪽 영역의 아이템 네모 슬롯 프레임 |
| `Assets/Resources/UI_PassportHudFlightMarker.png` | 왼쪽 HUD 오른쪽 영역의 비행기 표시 라인 |
| `Assets/Resources/UI_PassportHudItemMarker.png` | 왼쪽 HUD 오른쪽 영역의 물건 표시 라인 |
| `Assets/Resources/UI_LeftHudPassportPanel.png` | 이전 큰 세로형 왼쪽 여권 HUD 배경 |
| `Assets/Resources/UI_PassportPanel.png` | 기존 작은 왼쪽 여권 HUD 배경 |
| `Assets/Resources/UI_JJ_PassportPhoto.png` | 현재 적용 중인 JJ 여권사진 UI |
@@ -19,6 +27,13 @@
| `Assets/Resources/UI_DepartureStamp_Red.png` | 배경 없는 출국 도장 |
| `Assets/Resources/UI_PassportItemSlot.png` | 아이템 슬롯 |
| `Assets/Resources/Map_Tutorial_Incheon_Airport.png` | 튜토리얼 인천공항 배경 |
| `Assets/Resources/StageBackgrounds/Incheon/Stage_Incheon_DarkLower_Segment_01_CheckInHall.png` | 현재 적용 중인 인천 튜토리얼 체크인 홀 배경 조각, 임시 카메라 맞춤 캔버스 |
| `Assets/Resources/StageBackgrounds/Incheon/Stage_Incheon_DarkLower_Segment_02_DepartureSecurity.png` | 현재 적용 중인 인천 튜토리얼 출국/보안 통로 배경 조각, 임시 카메라 맞춤 캔버스 |
| `Assets/Resources/StageBackgrounds/Incheon/Stage_Incheon_DarkLower_Segment_03_DutyFreeConcourse.png` | 현재 적용 중인 인천 튜토리얼 면세점 거리 배경 조각, 임시 카메라 맞춤 캔버스 |
| `Assets/Resources/StageBackgrounds/Incheon/Stage_Incheon_DarkLower_Segment_04_MovingWalkwayWindows.png` | 현재 적용 중인 인천 튜토리얼 무빙워크/터미널 창 배경 조각, 임시 카메라 맞춤 캔버스 |
| `Assets/Resources/StageBackgrounds/Incheon/Stage_Incheon_DarkLower_Segment_05_BoardingGate.png` | 현재 적용 중인 인천 튜토리얼 탑승 게이트 배경 조각, 임시 카메라 맞춤 캔버스 |
| `Assets/Resources/Map_Japan_Fukuoka.png` | 일본 후쿠오카 실전맵 배경 |
| `Assets/Resources/Map_China_Beijing.png` | 중국 베이징 실전맵 배경 |
| `Assets/Resources/Map_America_NewYork.png` | 미국 뉴욕 배경 |
| `Assets/Resources/UI_TutorialAirportMonitorFrame.png` | 튜토리얼 설명창용 공항 디지털 안내 패널 프레임 |
| `Assets/Resources/UI_TutorialNextButton.png` | 튜토리얼 안내를 넘기는 확인 버튼 |
@@ -31,6 +46,19 @@
| `Assets/Resources/FinishGate_China_Paifang.png` | 중국 패방 도착 지점 |
| `Assets/Resources/FinishGate_America_Liberty.png` | 미국 자유의 여신상 도착 지점 |
인천 `StageBackgrounds` 조각은 화면 확대를 줄이기 위한 임시 보정본입니다.
상단 늘어남이 보여 최종본은 새 16:9 배경 조각으로 다시 제작합니다.
## Runtime SFX Assets
`Resources.Load<AudioClip>()`로 직접 사용하는 무음성 효과음입니다.
| 파일 | 용도 |
| --- | --- |
| `Assets/Resources/SFX/SFX_Player_Jump.wav` | 기본 점프 효과음 |
| `Assets/Resources/SFX/SFX_Player_DoubleJump.wav` | 2단 점프 효과음 |
| `Assets/Resources/SFX/SFX_Player_Slide.wav` | 슬라이딩 시작 효과음 |
## Intro Assets
| 파일/폴더 | 용도 |
@@ -56,13 +84,24 @@
왼쪽 HUD는 체력 도장과 아이템 슬롯이 잘 보이도록 가로형 여권 페이지 패널로 교체했습니다.
왼쪽 캐릭터 사진 영역은 HP/아이템 2줄 높이에 맞추고, 오른쪽에는 HP 3칸과 아이템 3칸을 같은 열 위치의 2줄 그리드로 배치합니다.
현재 기본 패널은 바깥 여권 테두리와 오른쪽 여행 도장 장식만 포함합니다.
왼쪽 사진/정보 박스 프레임과 상단 장식, 오른쪽의 원형 HP 프레임, 네모 아이템 슬롯, 비행기 표시 라인, 물건 표시 라인은 개별 이미지로 분리했습니다.
실제 목숨 도장, 아이템 슬롯, 얼굴 이미지는 Unity UI로 위에 얹습니다.
| 파일 | 용도 |
| --- | --- |
| `Assets/Resources/UI_LeftHudPassportCompactPanel.png` | 실제 적용하는 컴팩트 가로형 여권 2줄 그리드 HUD 런타임 PNG |
| `Assets/Resources/UI_LeftHudPassportHorizontalGridPanel.png` | 결과 화면과 원본 보관용 가로형 여권 2줄 그리드 HUD PNG |
| `Assets/Resources/UI_LeftHudPassportHorizontalGridPanel.png` | 실제 적용하는 가로형 여권 2줄 그리드 HUD 런타임 PNG |
| `Assets/Resources/UI_LeftHudPassportCompactPanel.png` | 오른쪽 빈 장식 영역을 줄인 컴팩트 가로형 여권 2줄 그리드 HUD PNG |
| `Assets/Resources/UI_PassportHudPhotoFrame.png` | 개별 배치용 왼쪽 사진/정보 박스 프레임 PNG |
| `Assets/Resources/UI_PassportHudPhotoHeader.png` | 개별 배치용 왼쪽 사진/정보 박스 상단 장식 PNG |
| `Assets/Resources/UI_PassportHudPhotoRouteBox.png` | 개별 배치용 왼쪽 항공권 경로 박스 PNG |
| `Assets/Resources/UI_PassportHudPhotoInfoStrip.png` | 개별 배치용 왼쪽 항공권 정보줄 PNG |
| `Assets/Resources/UI_PassportHudLifeCircleFrame.png` | 개별 배치용 HP 원형 프레임 PNG |
| `Assets/Resources/UI_PassportHudItemSlotFrame.png` | 개별 배치용 아이템 네모 슬롯 프레임 PNG |
| `Assets/Resources/UI_PassportHudFlightMarker.png` | 개별 배치용 비행기 표시 라인 PNG |
| `Assets/Resources/UI_PassportHudItemMarker.png` | 개별 배치용 물건 표시 라인 PNG |
| `Assets/ConceptArt/left_hud_passport_horizontal_grid_panel_concept_01.png` | 가로형 여권 2줄 그리드 HUD 컨셉 원본 |
| `Assets/ConceptArt/left_hud_passport_horizontal_grid_panel_split_concept_01.png` | 오른쪽 요소를 비워두고 분리 배치하도록 수정한 현재 컨셉 |
| `Assets/Resources/UI_JJ_PassportPhoto.png` | 오프닝 만화의 JJ를 바탕으로 만든 현재 여권사진 런타임 PNG |
| `Assets/ConceptArt/jj_passport_photo_concept_01.png` | JJ 여권사진 컨셉 원본 |
| `Assets/Resources/UI_LeftHudPassportPanel.png` | 이전 큰 세로형 여권 HUD 배경 |
@@ -128,6 +167,48 @@
- 오른쪽 원 3개: 마일리지, 도착 시간, 이동 거리
- 오른쪽 하단 3칸: 목적지, 보상, 보유 마일리지
## Duty Free UI Assets
`Assets/ConceptArt/duty_free_ui_parts_concept_01.png`에서 배경을 제거하고 분리한 런타임용 PNG입니다.
| 파일 | 용도 |
| --- | --- |
| `Assets/Resources/UI_DutyFreeShopInteriorPanel.png` | 면세점 화면 배경 |
| `Assets/Resources/UI_DutyFreeShopWindowPanel.png` | 현재 적용 중인 면세점 상품 진열 창 패널 |
| `Assets/Resources/UI_DutyFreeProductCard_Brown.png` | 도시락 상품 카드 배경 |
| `Assets/Resources/UI_DutyFreeProductCard_Green.png` | 영양제 상품 카드 배경 |
| `Assets/Resources/UI_DutyFreeProductCard_Blue.png` | 미사용 예비 상품 카드 배경 |
| `Assets/Resources/UI_DutyFreeProductCard_Purple.png` | 마일리지 카드 상품 카드 배경 |
| `Assets/Resources/UI_DutyFreeProductCard_Brown_Clean.png` | 현재 적용 중인 도시락 세로형 상품 카드 배경 |
| `Assets/Resources/UI_DutyFreeProductCard_Green_Clean.png` | 현재 적용 중인 영양제 세로형 상품 카드 배경 |
| `Assets/Resources/UI_DutyFreeProductCard_Blue_Clean.png` | 미사용 예비 세로형 상품 카드 배경 |
| `Assets/Resources/UI_DutyFreeProductCard_Purple_Clean.png` | 현재 적용 중인 마일리지 카드 세로형 상품 카드 배경 |
| `Assets/Resources/UI_DutyFreeProductPriceTag.png` | 상품 아이템 옆 세로형 걸이 가격표 태그 |
| `Assets/Resources/UI_DutyFreeButton_PrimaryYellow.png` | 구매/장착 가능 버튼 배경 |
| `Assets/Resources/UI_DutyFreeButton_DisabledGray.png` | 비활성 버튼 배경 |
| `Assets/Resources/UI_DutyFreeBagSlotPanel.png` | 장착 슬롯 패널 장식 |
| `Assets/Resources/UI_DutyFreeBagSlot_Active.png` | 구매한 가방 슬롯의 빈칸 상태 |
| `Assets/Resources/UI_DutyFreeBagSlot_Inactive.png` | 아직 구매하지 않은 가방 슬롯의 비활성 상태 |
| `Assets/Resources/UI_DutyFreeBagSlot_Occupied.png` | 아이템이 장착된 슬롯의 가방 없는 상태 |
| `Assets/Resources/UI_DutyFreeAirportDirectionSign.png` | 공항 방향 표지판 장식 |
| `Assets/Resources/UI_DutyFreeWoodShelfPanel.png` | 빈 진열대 장식 |
| `Assets/Resources/UI_DutyFreeLockedWideSlot.png` | 잠금 상태 표시 |
| `Assets/Resources/UI_DutyFreeWarningWideSlot.png` | 구매/장착 불가 상태 표시 |
| `Assets/Resources/UI_DutyFreePriceStrip_Blue.png` | 가격/마일리지 표시 띠 |
| `Assets/Resources/UI_DutyFreePriceTag_LightBlue.png` | 가격 태그 장식 |
| `Assets/Resources/UI_DutyFreeItemCarouselStrip.png` | 하단 아이템 목록 장식 |
현재 면세점 상품 아이콘:
| 파일 | 용도 |
| --- | --- |
| `Assets/Sprites/DutyFree/DutyFree_Normal_Lunchbox.png` | 도시락 상품 아이콘 |
| `Assets/Sprites/DutyFree/DutyFree_Normal_Supplement.png` | 영양제 상품 아이콘 |
| `Assets/Sprites/DutyFree/DutyFree_Normal_MileageCard.png` | 마일리지 카드 상품 아이콘 |
| `Assets/Sprites/DutyFree/DutyFree_Normal_Backpack.png` | 가방 업그레이드 아이콘 |
`DutyFree_*_ShieldCharm.png`, `DutyFree_*_Shoes.png`는 이전 기획용 이미지로 남아 있지만 현재 로직에서는 사용하지 않습니다.
## Opening Story Assets
| 파일/폴더 | 용도 |
@@ -149,25 +230,26 @@
| 파일 | 효과 |
| --- | --- |
| `Assets/Sprites/Items/Item_Health_Sushi.png` | 목숨 회복 |
| `Assets/Sprites/Items/Item_Invincible_Ramen.png` | 잠깐 무적 |
| `Assets/Sprites/Items/Item_Shield.png` | 충돌 1회 방어 |
| `Assets/Sprites/Items/Item_Speed_Shoes.png` | 속도 회복 |
| `Assets/Sprites/Items/Item_Mileage_Card.png` | 마일리지 획득량 증가 |
| `Assets/Sprites/Items/Item_Lunchbox.png` | 면세점 도시락 |
| `Assets/Sprites/Items/Item_Backpack.png` | 가방/슬롯 확장 |
| `Assets/Sprites/Items/Item_Health_Sushi.png` | 이전 기본 회복 아이템 |
| `Assets/Sprites/Items/Item_Invincible_Ramen.png` | 이전 기본 무적 아이템 |
| `Assets/Sprites/Items/Item_Mileage_Card.png` | 마일리지 카드 공통 아이콘 |
| `Assets/Sprites/Items/Item_Lunchbox.png` | 이전 도시락 아이콘 |
| `Assets/Sprites/Items/Item_Backpack.png` | 이전 가방/슬롯 확장 아이콘 |
| `Assets/Sprites/Items/Item_Souvenir_Magnet.png` | 기념품 |
`Item_Shield.png`, `Item_Speed_Shoes.png`는 현재 아이템 로직에서 제외한 레거시 이미지입니다.
## Regional Items
`Assets/Sprites/RegionalItems/`에 국가별 음식/소품 아이템이 있습니다.
- 한국: 김밥, 바나나우유, 붕어빵, 교통카드
- 일본: 초밥, 라멘, 말차, 오니기리
- 중국: 만두, 월병, 차, 훠궈
- 미국: 버거, 도넛, 콜라, 핫도그
- 한국/공항: 김밥, 바나나우유, 에너지 드링크
- 일본: 초밥, 라멘, 에너지 드링크
- 중국: 만두, 훠궈, 에너지 드링크
- 미국: 버거, 핫도그, 에너지 드링크
현재 튜토리얼은 기본 아이템 에셋을 사용하고, 이후 스킨으로 교체할 수 있습니다.
현재 `GameplayItemCatalog` 맵 스킨에 따라 회복/무적/에너지 드링크 이미지를 선택합니다.
붕어빵, 교통카드, 말차, 오니기리, 월병, 차, 도넛, 콜라는 이후 보상/수집용으로 활용할 수 있는 예비 에셋입니다.
## Obstacle And Platform Skins
@@ -193,7 +275,6 @@
- 마일리지 획득 반짝임
- 목숨 회복 하트/+1
- 방어막 버블
- 무적/속도감 실루엣
- 속도 바람
- 충돌 폭발
@@ -202,8 +283,8 @@
현재 구현:
- `Assets/Scripts/ItemFeedbackEffect.cs`가 런타임에서 링, 반짝임, 짧은 문구를 생성합니다.
- 아이템 획득 시 `+1`, `SAFE`, `SHIELD`, `SPEED`, `x2` 같은 피드백을 표시합니다.
- 라멘 무적/방어막 방어 성공 시 피격 깜빡임 대신 `SAFE` 또는 `BLOCK` 피드백을 표시합니다.
- 아이템 획득 시 `+1`, `SAFE`, `ENERGY`, `x2` 같은 피드백을 표시합니다.
- 무적 아이템으로 충돌을 통과하면 피격 깜빡임 대신 `SAFE` 피드백을 표시합니다.
다음 방향:
+9 -7
View File
@@ -98,9 +98,10 @@ Intro
1. 완료: `PlatformSpawner.TutorialStep``CourseStep`으로 독립
2. 완료: 맵별 정의를 `Maps/Definitions`로 분리
3. 튜토리얼/일본/중국/미국 코스를 `CourseProfile`로 분리
4. 결과 화면, 면세점, 디버그 메뉴를 화면 View로 분리
5. 게임 HUD와 튜토리얼 안내창을 `GameManager`에서 분리
3. 완료: 튜토리얼/일본/중국/미국 코스를 `CourseProfile`로 분리
4. 완료: `PlatformSpawner`의 fallback 코스를 `FallbackCourseProfile`로 이동
5. 진행: 결과 화면, 면세점, 디버그 메뉴를 화면 View 파일로 분리
6. 게임 HUD와 튜토리얼 안내창을 `GameManager`에서 분리
자세한 기준은 [refactor-plan.md](refactor-plan.md)를 봅니다.
@@ -115,7 +116,8 @@ Intro
## 다음 작업 우선순위
1. 튜토리얼 코스와 일반 맵 코스를 `CourseProfile`로 분리
2. `PlatformSpawner`의 fallback 코스 생성 책임 이동
3. `GameFlowManager`화면 UI를 View 클래스로 분리
4. 면세점 구매 아이템을 장착 슬롯과 연결
1. 인천 튜토리얼 배경을 현재 화면비에 맞춘 새 16:9 배경 조각으로 다시 제작
2. Unity Play 모드에서 결과/면세점/맵 프리뷰 화면의 실제 배치 확인
3. `GameManager`HUD와 튜토리얼 안내창을 별도 스크립트로 분리
4. 일본, 중국, 미국 맵의 반복 패턴과 난이도 미세 조정
5. 인트로/오프닝/맵 프리뷰 화면도 같은 방식으로 View 파일 분리
+7 -4
View File
@@ -65,6 +65,7 @@ HUD:
- 왼쪽 HUD는 가로형 여권 페이지 패널을 사용하고, 왼쪽 캐릭터 사진은 HP/아이템 2줄 높이에 맞춥니다.
- HP 3칸과 아이템 3칸은 오른쪽에서 같은 열 위치의 2줄 그리드로 정렬합니다.
- 왼쪽 HUD는 게임 화면을 가리지 않도록 원본 배치 기준 약 50% 크기로 표시합니다.
- 왼쪽 HUD 배경은 바깥 여권 테두리와 오른쪽 여행 도장 장식만 담고, 왼쪽 사진/정보 박스 프레임과 상단 장식, 오른쪽의 원형 HP 프레임, 네모 아이템 슬롯, 비행기 표시 라인, 물건 표시 라인은 개별 이미지로 분리해 Unity에서 위치와 크기를 조정합니다.
- 필드에서 먹는 아이템은 기존보다 약 2배 크게 표시해 마일리지 토큰/배경과 확실히 구별합니다.
- 오른쪽 HUD 배경은 가로로 긴 수하물 라벨/공항 스티커 이미지를 사용합니다.
- 오른쪽 HUD에는 거리와 이번 판에서 적립한 마일리지만 표시하고, 실제 숫자와 라벨 텍스트는 이미지에 박지 않고 Unity UI 텍스트로 얹습니다.
@@ -121,15 +122,17 @@ HUD:
- 상품 진열 중심
- 보유 마일리지 표시
- 다음 맵 이동은 오른쪽 방향성으로 안내
- 면세점 내부 컨셉 배경 위에 도시락, 방어막, 운동화, 마일리지 카드 상품 카드를 배치
- 면세점 내부 컨셉 배경 위에 도시락, 영양제, 마일리지 카드 상품 카드를 배치
- 상품 카드는 아이템 이미지, 효과, 보유 수량, 가격, 구매 상태를 함께 표시
- 구매 아이템은 실제 장착 슬롯과 연결 예정
- 도시락과 마일리지 카드는 가방 슬롯에 장착하고, 영양제는 누적 구매형 최대 HP 증가로 사용
- 사용자가 조정한 상품/가방/마일리지/다음 여행지 버튼 위치는 이후 리팩터링에서 변경하지 않음
## MapPreview
방향:
- 다음 여행지 목적지 보드
- 목표 거리, 제한 시간, 보상 표시
- 인트로 세계지도 화면을 재사용한 다음 여행지 이동 화면
- 현재 출발지에서 다음 목적지까지 비행기가 이동하는 경로 애니메이션 표시
- 왼쪽 설명 패널은 제거하고 지도와 이동 연출 중심으로 표시
- 해금 상태 표시
- 비행기 이동이나 여권 도장 분위기 활용
+52
View File
@@ -2,6 +2,58 @@
날짜별 수정 내용과 다음 할 일을 기록합니다.
## 2026-07-09
### 수정한 점
- 면세점 아이템 기준을 정리
- 면세점: 도시락, 영양제, 마일리지 카드, 가방 업그레이드
- 플레이 중 필드 아이템: 지역별 회복 음식, 지역별 무적 음식, 국가별 에너지 드링크
- 방어막과 운동화는 현재 로직에서 제외
- 국가별 에너지 드링크 이미지와 영양제 이미지를 추가하고 로직에 연결
- `GameplayItemCatalog`로 맵 스킨별 회복/무적/에너지 드링크 이미지를 선택하도록 정리
- 면세점 구매 제한 적용
- 가방 칸보다 많은 장착형 아이템은 구매 불가
- 도시락은 현재 최대 목숨 수보다 많이 구매 불가
- 마일리지가 부족하면 구매 불가
- 영양제와 마일리지 카드는 한 스테이지당 1개만 구매 가능
- 영양제는 1개당 최대 HP +0.5로 계산하고, 4개 구매 시 최대 HP가 5까지 증가하도록 연결
- 도시락과 마일리지 카드는 가방 슬롯에 장착하고 플레이 중 사용/소모되도록 연결
- 튜토리얼/일본/중국/미국 코스를 `CourseProfile`로 분리
- `PlatformSpawner`의 fallback 코스를 `FallbackCourseProfile`로 이동
- 실전 맵 난이도 기준을 튜토리얼 1 / 일본 3 / 중국 5 / 미국 8로 잡고, 일본/중국/미국 코스 배치를 재구성
- 일본: 안전 발판과 단일 점프/슬라이드 중심의 첫 실전 맵
- 중국: 점프 뒤 슬라이드, 슬라이드 뒤 점프 전환을 늘린 중간 난이도 맵
- 미국: 짧은 간격의 연속 점프/슬라이드와 공중 발판을 섞은 후반 난이도 맵
- 결과 화면, 면세점, 디버그 메뉴 UI 생성 코드를 `Assets/Scripts/Flow/Screens` partial 파일로 분리
- 맵 프리뷰 화면을 인트로 세계지도 기반으로 바꾸고, 현재 출발지에서 다음 목적지까지 비행기가 이동하는 경로 애니메이션을 추가
- 디버그 메뉴에 일본/중국/미국 게임시작과 출국성공 바로가기 버튼을 추가
- 일본/중국 실전맵 배경을 `Resources`로 복사하고 맵 데이터에 연결
- 일반맵에서는 시간 기반 튜토리얼 안내와 아이템 설명 패널이 뜨지 않도록 수정
- 비행기 이동 화면의 왼쪽 설명 패널을 제거
- 점프, 2단 점프, 슬라이딩 효과음을 무음성 SFX로 교체
- `BackgroundLoop`가 맵별 배경 조각 배열을 받아 연속 배경으로 순환할 수 있게 확장
- 인천 튜토리얼 배경 조각 5장을 `Assets/Resources/StageBackgrounds/Incheon/`에 적용
- 인천 배경을 카메라에 맞추기 위해 임시 런타임 캔버스 보정본을 적용했으나, 상단 늘어남이 보여 새 16:9 배경 원화로 다시 제작하기로 결정
- 문서를 현재 아이템/면세점/CourseProfile 구조에 맞게 갱신
- `dotnet build TravelRun.sln --no-restore` 기준 경고 0개 / 오류 0개 확인
### 현재 문제
- Unity Play 모드에서 실제 화면 배치와 버튼 클릭 흐름은 한 번 더 확인해야 함
- `GameFlowManager`에는 아직 인트로/오프닝/맵 프리뷰 UI와 구매/저장 로직이 남아 있음
- `GameManager`에는 HUD, 튜토리얼 안내창, 도착 처리, 아이템 효과가 아직 함께 있음
- 일본, 중국, 미국 맵의 난이도는 코드 배치 기준으로 구성됐지만 실제 플레이 감각 튜닝이 필요함
- 인천 튜토리얼 배경은 현재 임시 보정본이라 상단이 늘어난 것처럼 보이며, 화면비에 맞춘 새 배경으로 교체해야 함
### 다음 할 일
1. 인천 튜토리얼 배경을 현재 화면비에 맞춘 새 16:9 배경 조각으로 다시 제작하고 교체
2. Unity Play 모드에서 결과/면세점/맵 프리뷰 화면과 면세점 구매/장착/소모 흐름 확인
3. `GameManager`의 HUD와 튜토리얼 안내창을 별도 스크립트로 분리
4. 인트로/오프닝/맵 프리뷰 UI도 `Flow/Screens`로 분리
5. 일본, 중국, 미국 맵 난이도를 Unity Play 모드 플레이 기준으로 미세 조정
## 2026-07-08
### 수정한 점
+15 -12
View File
@@ -31,7 +31,7 @@
- 장애물에 맞으면 목숨 감소
- 장애물에 맞으면 속도 감소
- 충돌 후 짧은 무적 시간이 생김
- 라멘 무적이나 방어막으로 막은 충돌은 피격 깜빡임 대신 방어 성공 이펙트로 표시
- 무적 아이템으로 통과한 충돌은 피격 깜빡임 대신 안전 통과 이펙트로 표시
## 튜토리얼 순서
@@ -41,21 +41,23 @@
2. 2단 점프: 멀리 떨어진 발판
3. 슬라이드: 천장 장애물
4. 강제 피격: 낮은 장애물에 일부러 맞아 목숨/속도 감소 체험
5. 아이템: 밥, 라멘, 방어막, 마일리지 카드, 운동화 순서로 효과 체험
5. 아이템: 밥, 바나나우유, 에너지 드링크 순서로 효과 체험
6. 실전 연습: 속도 변화 설명 후 출국 게이트까지 주행
## 아이템
| 아이템 | 효과 | 튜토리얼 체험 |
| 아이템 | 효과 | 등장 위치 |
| --- | --- | --- |
| 초밥 | 목숨 1 회복 | 강제 피격 후 회복 |
| 라멘 | 잠깐 무적 | 먹은 뒤 장애물 통과 |
| 방어막 | 충돌 1회 방어 | 먹은 뒤 다음 충돌 방어 |
| 마일리지 카드 | 마일리지 획득량 증가 | 먹은 뒤 마일리지 수집 |
| 운동화 | 속도 회복 | 피격 후 느려진 속도 회복 |
| 지역별 회복 음식 | 목숨 1 회복 | 플레이 중 |
| 지역별 무적 음식 | 잠깐 무적 | 플레이 중 |
| 국가별 에너지 드링크 | 속도 소량 회복 | 플레이 중 |
| 도시락 | 장착 후 플레이 중 HP 회복 | 면세점 구매 |
| 마일리지 카드 | 장착 후 마일리지 획득량 증가 | 면세점 구매 |
| 영양제 | 최대 HP +0.5, 4개 구매 시 최대 HP +2 | 면세점 구매 |
| 가방 업그레이드 | 장착 슬롯 증가 | 면세점 구매 |
아이템을 먹으면 짧은 링, 반짝임, 문구 이펙트가 떠서 획득 여부를 확인할 수 있습니다.
라멘 무적 아이템의 현재 지속 시간은 `2.2초`이며, 튜토리얼에서는 방어막이 바로 이어지지 않도록 안전 발판을 사이에 둡니다.
무적 아이템의 현재 지속 시간은 `2.2초`니다.
점프 구간의 마일리지 코인은 플레이어가 뛰는 높이에 맞춰 넓고 높은 포물선으로 배치합니다.
게임 속도가 빨라지면 코인 포물선의 가로 폭도 함께 넓혀 점프 타이밍과 맞춥니다.
@@ -65,7 +67,7 @@
현재 방향은 개별 랜덤 생성이 아니라 검증된 코스 조각을 순서대로 배치하는 방식입니다.
코스 조각은 `CourseStep`으로 분리했습니다.
다음 리팩터링에서는 여러 조각의 묶음 `CourseProfile`로 분리니다.
여러 조각의 묶음 `CourseProfile`로 분리했습니다.
패턴 예시:
@@ -79,7 +81,7 @@
이 방식은 쿠키런식으로 계속 이어지는 기본 발판을 유지하면서도, 장애물과 아이템은 상황에 맞게 배치할 수 있습니다.
## CourseProfile 방향
## CourseProfile 구조
튜토리얼과 일반 맵의 코스 목적을 분리합니다.
@@ -91,7 +93,8 @@
| `AmericaCourseProfile` | 빠른 속도와 후반 난이도 |
현재 `PlatformSpawner``CourseStep` 배열을 순서대로 실행합니다.
다음 목표는 코스 내용을 `CourseProfile`로 묶어, 스포너가 맵별 코스 정의를 직접 만들지 않게 하는 것입니다.
`PlatformSpawner`는 맵별 `CourseProfile`에서 opening/loop 코스를 받아 실행합니다.
fallback 코스도 `FallbackCourseProfile`에서 받아오므로 스포너가 코스 내용을 직접 만들지 않습니다.
튜토리얼 전용 요소:
+52 -14
View File
@@ -13,16 +13,19 @@
- `routeName`
- `platformSkin`
- `backgroundResourcePath`
- `backgroundResourcePaths`
- `backgroundFitScaleMultiplier`
- `backgroundVerticalOffset`
- `finishGateStyle`
- `targetDistance`
- `timeLimit`
- `clearMileageReward`
- `openingSteps`
- `loopSteps`
- `courseProfile`
- `openingSteps`, `loopSteps` fallback
리팩터링 목표:
- `openingSteps`, `loopSteps``CourseProfile` 기반 이름으로 정리합니다.
- `CourseProfile` 기반 코스 구조를 사용합니다.
- `PlatformSpawner.TutorialStep``CourseStep`으로 독립시켰습니다.
- `MapDatabase`는 맵 목록 관리만 담당하고, 실제 맵 정의는 맵별 파일로 나눴습니다.
@@ -52,9 +55,18 @@ Course
| Japan | 첫 일반 맵, 쉬운 점프/슬라이드 반복 패턴 |
| China | 간격 변화, 연속 슬라이드/점프 확장 |
| America | 빠른 속도, 후반 난이도, 긴 주행 압박 |
난이도 기준:
| 맵 | 난이도 |
| --- | --- |
| Tutorial / Incheon | 1 / 10 |
| Japan | 3 / 10 |
| China | 5 / 10 |
| America | 8 / 10 |
현재 `PlatformSpawner`는 맵이 가진 `CourseStep` 배열을 실행합니다.
다음 목표는 맵별 코스 `CourseProfile`로 묶어, 스포너가 현재 맵의 프로필만 실행하게 만드는 것입니다.
현재 `PlatformSpawner`는 맵이 가진 `CourseProfile`을 실행합니다.
맵별 opening/loop 코스와 fallback 코스 `Course/Profiles`에서 관리합니다.
## Tutorial / Incheon
@@ -65,7 +77,15 @@ Course
배경:
- `Assets/Resources/Map_Tutorial_Incheon_Airport.png`
- 현재 런타임 적용: `Assets/Resources/StageBackgrounds/Incheon/Stage_Incheon_DarkLower_Segment_01_CheckInHall.png`
- 현재 런타임 적용: `Assets/Resources/StageBackgrounds/Incheon/Stage_Incheon_DarkLower_Segment_02_DepartureSecurity.png`
- 현재 런타임 적용: `Assets/Resources/StageBackgrounds/Incheon/Stage_Incheon_DarkLower_Segment_03_DutyFreeConcourse.png`
- 현재 런타임 적용: `Assets/Resources/StageBackgrounds/Incheon/Stage_Incheon_DarkLower_Segment_04_MovingWalkwayWindows.png`
- 현재 런타임 적용: `Assets/Resources/StageBackgrounds/Incheon/Stage_Incheon_DarkLower_Segment_05_BoardingGate.png`
- 이전 단일 배경: `Assets/Resources/Map_Tutorial_Incheon_Airport.png`
현재 인천 배경 조각은 화면비 보정을 위해 임시 런타임 캔버스로 적용되어 있습니다.
상단 늘어남이 보여 최종본은 현재 화면비에 맞춘 새 16:9 배경 조각으로 다시 제작합니다.
도착 지점:
@@ -78,12 +98,13 @@ Course
2. 2단 점프
3. 슬라이드
4. 강제 피격
5.
6. 라멘
7. 방어막
8. 마일리지 카드
9. 운동화
10. 실전 연습 후 출국 게이트
5.
6. 바나나우유
7. 에너지 드링크
8. 실전 연습 후 출국 게이트
튜토리얼 필드 아이템은 한국/공항 스킨 기준으로 표시합니다.
일반 맵에서는 같은 효과가 맵별 음식/음료 스킨으로 바뀝니다.
## Japan
@@ -93,6 +114,10 @@ Course
- 튜토리얼에서 배운 조작을 반복 패턴으로 사용
- 튜토리얼 설명, 강제 피격 체험, 아이템 설명 트리거는 사용하지 않음
배경:
- `Assets/Resources/Map_Japan_Fukuoka.png`
도착 지점:
- `Assets/Resources/FinishGate_Japan_Torii.png`
@@ -110,6 +135,9 @@ Course
- 낮은 점프 장애물과 짧은 슬라이드를 번갈아 배치
- 마일리지 코인은 점프 아크와 안전 라인 중심
- 튜토리얼보다 긴 반복 패턴을 사용하되 난이도는 낮게 유지
- 필드 아이템은 일본 스킨의 초밥, 라멘, 에너지 드링크를 사용
- 난이도 3 기준으로, 액션 뒤에는 대체로 회복용 안전 발판을 둠
- 석등 점프와 표지판 슬라이드는 한 번에 하나씩 읽히게 배치
## China
@@ -119,6 +147,10 @@ Course
- 슬라이드와 점프 패턴 확장
- 일본보다 장애물 간격 변화가 큼
배경:
- `Assets/Resources/Map_China_Beijing.png`
도착 지점:
- `Assets/Resources/FinishGate_China_Paifang.png`
@@ -135,6 +167,9 @@ Course
- 점프 뒤 슬라이드, 슬라이드 뒤 점프처럼 전환 패턴을 늘림
- 마일리지 라인은 안전 구간과 위험 보상 구간을 구분
- 튜토리얼용 강제 피격 패턴은 사용하지 않음
- 필드 아이템은 중국 스킨의 만두, 훠궈, 에너지 드링크를 사용
- 난이도 5 기준으로, 점프와 슬라이드가 이어지는 구간을 루프마다 포함
- 공중 발판 간격은 일본보다 짧게 잡아 착지 타이밍을 더 요구
## America
@@ -165,6 +200,9 @@ Course
- 넓은 점프와 짧은 슬라이드가 빠르게 이어짐
- 안전 발판 비중은 줄이고 패턴 반복 속도를 올림
- 도착 지점 전 마지막 구간은 시야가 복잡하지 않게 정리
- 필드 아이템은 미국 스킨의 햄버거, 핫도그, 에너지 드링크를 사용
- 난이도 8 기준으로, 짧은 간격의 점프/슬라이드 연속 패턴을 사용
- 회복 아이템은 루프 안에 있지만 액션 밀도를 낮추지는 않음
## 맵 추가 규칙
@@ -172,8 +210,8 @@ Course
1. `MapId` 추가
2. `Maps/Definitions`에 맵별 정의 파일 추가
3. 배경 이미지를 `Assets/Resources/Map_*.png`로 저장
3. 단일 배경은 `Assets/Resources/Map_*.png` 저장하고, 연결 배경 조각은 `Assets/Resources/StageBackgrounds/<MapName>/` 저장
4. 도착 지점 이미지를 `Assets/Resources/FinishGate_*.png`로 저장
5. `backgroundResourcePath`, `finishGateStyle` 연결
5. `backgroundResourcePath` 또는 `backgroundResourcePaths`, `finishGateStyle` 연결
6. `Course` 폴더에 해당 맵의 `CourseProfile` 추가
7. `MapDatabase` 목록에 새 맵 연결
+11 -8
View File
@@ -51,9 +51,9 @@
`PlatformSpawner.TutorialStep`은 독립 `CourseStep` 타입으로 분리했습니다.
맵별 생성 코드는 `Maps/Definitions/*Map.cs`로 분리했습니다.
아직 코스 배열은 `CourseProfile`로 묶이지 않고 `openingSteps`, `loopSteps`로 직접 연결되어 있습니다.
튜토리얼/일본/중국/미국 코스는 `CourseProfile`로 묶었고, fallback 코스는 `FallbackCourseProfile`로 이동했습니다.
최종적으로는 `CourseProfile`독립 타입으로 만들고, 맵은 코스 프로필만 참조하게 합니다.
`MapDefinition` `courseProfile`우선 사용하고, 예전 `openingSteps`, `loopSteps`는 호환용 fallback으로만 남깁니다.
## 목표 폴더 구조
@@ -144,7 +144,7 @@ Assets/Scripts
| --- | --- |
| 거리/시간/클리어 판정 | `StageProgressTracker` |
| 도착 게이트 생성/정리 | `FinishGateController` |
| 목숨/피격/무적/방어막 | `DamageController` |
| 목숨/피격/무적 | `DamageController` |
| 아이템 효과 | `ItemEffectController` |
| 왼쪽/오른쪽 HUD | `GameplayHudView` |
| 튜토리얼 안내창 표시 | `TutorialGuideView` |
@@ -159,9 +159,10 @@ Assets/Scripts
```text
MapDefinition
-> CourseProfile
-> CourseStep[]
-> Maps/Definitions/*Map.cs가 맵별 코스 배열을 직접 생성
-> PlatformSpawner fallback 패턴도 직접 생성
-> Maps/Definitions/*Map.cs가 맵별 CourseProfile을 참조
-> PlatformSpawner fallback도 FallbackCourseProfile에서 받음
```
목표:
@@ -194,13 +195,15 @@ MapDefinition
- `MapDatabase.cs`는 목록 관리만 담당
- `TutorialIncheonMap`, `JapanMap`, `ChinaMap`, `AmericaMap`으로 나눔
3. 다음: 코스 프로필 분리
3. 완료: 코스 프로필 분리
- 튜토리얼 코스와 일반 맵 코스를 각각 `CourseProfile`로 분리
- 일본, 중국, 미국은 튜토리얼 패턴을 복붙하지 않음
4. `GameFlowManager` 화면 View 분리
4. 진행: `GameFlowManager` 화면 View 분리
- 결과 화면, 면세점, 디버그 메뉴부터 분리
- 위치 조정 중인 UI 값은 유지한 채 파일만 나눔
- 현재 결과/면세점/디버그 메뉴 UI 생성 코드는 `Flow/Screens` partial 파일로 이동
- 구매/저장/장착 로직은 아직 `GameFlowManager` 본체에 남겨 안정성을 유지
5. `GameManager` UI/진행 분리
- HUD와 튜토리얼 안내창을 먼저 분리
@@ -214,6 +217,6 @@ MapDefinition
## 주의 사항
- 기능 변경과 파일 분리를 동시에 많이 하지 않습니다.
- UI 위치 조정이 끝난 화면은 좌표를 유지한 채 View로 옮깁니다.
- UI 위치 조정이 끝난 화면은 좌표를 유지한 채 View로 옮깁니다. 사용자가 직접 맞춘 면세점 위치값은 변경하지 않습니다.
- 맵별 난이도 조정은 코스 구조 분리 후 진행합니다.
- 삭제보다 이동을 우선하고, 빌드가 깨지지 않는 작은 단위로 진행합니다.
+44 -16
View File
@@ -5,7 +5,7 @@
## Scene Flow
`GameFlowManager`가 전체 흐름을 관리합니다.
다음 리팩터링 이후에는 `GameFlowManager`가 화면을 직접 그리지 않고, 화면별 View를 호출하는 구조로 정리합니다.
결과 화면, 면세점, 디버그 메뉴의 UI 생성 코드는 `Flow/Screens` partial 파일로 분리했습니다.
```text
Intro
@@ -30,6 +30,9 @@ Intro
- 해금된 맵 인덱스
- 총 마일리지
- 면세점 구매 아이템 수량
- 가방 슬롯 수와 장착 슬롯 상태
- 영양제 구매 수
- 스테이지별 마일리지 카드/영양제 1회 구매 제한 상태
## Map Data
@@ -53,9 +56,9 @@ Intro
- 다음 맵
- 코스 패턴
현재는 `MapDefinition`이 독립 타입인 `CourseStep[]` 형태의 `openingSteps`, `loopSteps`를 들고 있습니다.
맵 생성 코드는 `Maps/Definitions/*Map.cs`로 분리했니다.
다음 리팩터링에서는 `CourseProfile`을 만들고 맵별 파일에서 코스 프로필을 연결합니다.
`MapDefinition` `CourseProfile`을 우선 참조합니다.
맵 생성 코드는 `Maps/Definitions/*Map.cs`로 분리했고, 각 맵은 `Course/Profiles/*CourseProfile.cs`를 연결합니다.
`openingSteps`, `loopSteps`는 이전 구조와의 호환용 fallback으로 남겨 둡니다.
목표 구조:
@@ -67,11 +70,10 @@ MapDatabase
-> AmericaMap.Create()
MapDefinition
-> CourseProfile openingCourse
-> CourseProfile loopCourse
-> CourseProfile
PlatformSpawner
-> CourseProfile 실행
-> CourseProfile opening/loop 실행
```
## Gameplay Runtime
@@ -105,7 +107,7 @@ PlatformSpawner
| 플레이 세션 총괄 | `GameManager` |
| 거리/시간/클리어 판정 | `StageProgressTracker` |
| 도착 게이트 생성/정리 | `FinishGateController` |
| 목숨/피격/무적/방어막 | `DamageController` |
| 목숨/피격/무적 | `DamageController` |
| 아이템 효과 | `ItemEffectController` |
| 왼쪽/오른쪽 HUD | `GameplayHudView` |
| 튜토리얼 안내창 | `TutorialGuideView` |
@@ -115,8 +117,11 @@ PlatformSpawner
현재 상태:
- `GameFlowManager` 안에 결과 화면, 면세점, 인트로, 맵 프리뷰, 디버그 메뉴 UI 생성 코드가 들어 있음
- `GameFlowManager` 안에 인트로, 오프닝 스토리, 맵 프리뷰 UI 생성 코드가 남아 있음
- 공통 UI 오브젝트 생성과 에셋 로딩도 같은 파일에 있음
- 결과 화면, 면세점, 디버그 메뉴 UI 생성 코드는 `Assets/Scripts/Flow/Screens`로 먼저 이동함
- 구매/저장/장착 로직은 안정성을 위해 아직 본체에 남아 있음
- 맵 프리뷰는 인트로 세계지도 리소스와 비행기 경로 모션을 재사용해 다음 여행지 이동을 보여주며, 왼쪽 설명 패널은 표시하지 않음
목표 구조:
@@ -133,7 +138,8 @@ PlatformSpawner
| 공통 UI 생성 | `FlowUiFactory` |
| UI 에셋 로딩 | `FlowAssetLoader` |
디버그 메뉴는 현재 `Esc`로 열며, 인트로/게임 시작/출국 실패/출국 성공/면세점/지도 화면으로 바로 이동합니다.
디버그 메뉴는 현재 `Esc`로 열며, 인트로/현재 맵 시작/출국 실패/출국 성공/면세점/지도 화면으로 바로 이동합니다.
일본, 중국, 미국은 각각 게임시작과 출국성공 프리뷰 버튼을 따로 제공합니다.
리팩터링 후에도 개발 빌드 전용 기능으로 유지합니다.
## DutyFreeShop
@@ -142,15 +148,37 @@ PlatformSpawner
- 화면 흐름은 있음
- 코드 오버레이 화면은 면세점 내부 배경과 상품 카드형 UI로 표시함
- 도시락, 방어막, 운동화, 마일리지 카드의 보유 수량과 가격을 표시함
- 구매 데이터 저장은 있음
- 실제 장착 슬롯과 플레이 시작 전 준비 구조는 아직 미완성
- 판매 아이템은 도시락, 영양제, 마일리지 카드, 가방 업그레이드
- 도시락과 마일리지 카드는 가방 슬롯에 장착해서 다음 스테이지에서 사용
- 영양제는 장착 아이템이 아니라 누적 구매형 최대 HP 증가 아이템
- 가방 업그레이드는 활성 슬롯을 최대 3칸까지 늘림
- 구매 데이터와 장착 슬롯은 저장/로드됨
구매 제한:
1. 가방 칸보다 많은 장착형 아이템은 살 수 없음
2. 도시락은 현재 최대 목숨 수보다 많이 살 수 없음
3. 보유 마일리지가 부족하면 살 수 없음
4. 영양제와 마일리지 카드는 한 스테이지당 1개만 살 수 있음
다음 방향:
1. 스테이지 시작 전 장착 슬롯에 넣기
2. 가방 업그레이드로 슬롯 수 증가
3. 스테이지 중 장착 아이템 사용/소모
1. Unity Play 모드에서 구매/장착/소모 흐름 확인
2. 면세점 UI에서 부족/슬롯 가득/1회 완료 상태가 잘 읽히는지 확인
3. 필요하면 구매 피드백 효과 추가
## Stage Backgrounds
현재 맵별 런타임 배경:
- 튜토리얼/인천: `StageBackgrounds/Incheon/Stage_Incheon_DarkLower_Segment_*`
- 일본: `Map_Japan_Fukuoka`
- 중국: `Map_China_Beijing`
- 미국: `Map_America_NewYork`
`BackgroundLoop`는 단일 `backgroundResourcePath`와 여러 장의 `backgroundResourcePaths`를 모두 처리합니다.
여러 배경 조각이 들어오면 왼쪽/오른쪽 배경 오브젝트에 순서대로 스프라이트를 배정하고, 루프될 때 다음 조각으로 넘깁니다.
인천 배경은 현재 임시 캔버스 보정본이 적용되어 있으므로 최종 16:9 원화로 다시 교체할 예정입니다.
## Finish Gate