6.9 KiB
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로 묶었고, fallback 코스는 FallbackCourseProfile로 이동했습니다.
MapDefinition은 courseProfile을 우선 사용하고, 예전 openingSteps, loopSteps는 호환용 fallback으로만 남깁니다.
목표 폴더 구조
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
맵 데이터와 코스 실행을 분리합니다.
현재:
MapDefinition
-> CourseProfile
-> CourseStep[]
-> Maps/Definitions/*Map.cs가 맵별 CourseProfile을 참조
-> PlatformSpawner는 fallback도 FallbackCourseProfile에서 받음
목표:
MapDefinition
-> CourseProfile
-> CourseStep[]
-> PlatformSpawner는 CourseStep을 실행만 함
튜토리얼과 일반 맵은 역할이 다릅니다.
| 코스 | 역할 |
|---|---|
TutorialCourseProfile |
조작 학습, 강제 피격, 아이템 체험, 실전 연습 |
JapanCourseProfile |
첫 일반 맵, 쉬운 반복 패턴 |
ChinaCourseProfile |
간격 변화와 슬라이드/점프 확장 |
AmericaCourseProfile |
빠른 속도와 후반 난이도 |
진행 순서
-
완료:
CourseStep분리PlatformSpawner.TutorialStep을 독립 파일로 이동TutorialStep이름을CourseStep으로 변경CourseStepKind,CoursePlatformType도 독립 파일로 이동- 남은 이름 정리는
CourseProfile분리 때 함께 진행
-
완료: 맵 정의 파일 분리
MapDatabase.cs는 목록 관리만 담당TutorialIncheonMap,JapanMap,ChinaMap,AmericaMap으로 나눔
-
완료: 코스 프로필 분리
- 튜토리얼 코스와 일반 맵 코스를 각각
CourseProfile로 분리 - 일본, 중국, 미국은 튜토리얼 패턴을 복붙하지 않음
- 튜토리얼 코스와 일반 맵 코스를 각각
-
진행:
GameFlowManager화면 View 분리- 결과 화면, 면세점, 디버그 메뉴부터 분리
- 위치 조정 중인 UI 값은 유지한 채 파일만 나눔
- 현재 결과/면세점/디버그 메뉴 UI 생성 코드는
Flow/Screenspartial 파일로 이동 - 구매/저장/장착 로직은 아직
GameFlowManager본체에 남겨 안정성을 유지
-
GameManagerUI/진행 분리- HUD와 튜토리얼 안내창을 먼저 분리
- 이후 도착 게이트, 아이템, 피격 처리 분리
-
검증
- 각 단계마다
dotnet build Assembly-CSharp.csproj - Unity Play 모드에서
Esc디버그 메뉴로 화면 확인 - 튜토리얼, 일본, 중국, 미국 맵 진입 확인
- 각 단계마다
주의 사항
- 기능 변경과 파일 분리를 동시에 많이 하지 않습니다.
- UI 위치 조정이 끝난 화면은 좌표를 유지한 채 View로 옮깁니다. 사용자가 직접 맞춘 면세점 위치값은 변경하지 않습니다.
- 맵별 난이도 조정은 코스 구조 분리 후 진행합니다.
- 삭제보다 이동을 우선하고, 빌드가 깨지지 않는 작은 단위로 진행합니다.