Files
Travel_Run/Docs/refactor-plan.md
T
2026-07-07 15:57:11 +09:00

6.6 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로 묶이지 않고 openingSteps, loopSteps로 직접 연결되어 있습니다.

최종적으로는 CourseProfile을 독립 타입으로 만들고, 맵은 코스 프로필만 참조하게 합니다.

목표 폴더 구조

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
-> CourseStep[]
-> Maps/Definitions/*Map.cs가 맵별 코스 배열을 직접 생성
-> PlatformSpawner가 fallback 패턴도 직접 생성

목표:

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로 옮깁니다.
  • 맵별 난이도 조정은 코스 구조 분리 후 진행합니다.
  • 삭제보다 이동을 우선하고, 빌드가 깨지지 않는 작은 단위로 진행합니다.