● Fire Rocket 프로젝트 리팩토링 전체 정리


  1. 상태 관리: Boolean 플래그 → State Enum

파일: RocketOrbitController.cs, RocketState.cs (신규)

Before: public bool isOrbiting; public bool isFlying; public bool isFirst;

After: public enum RocketState { Idle, Orbiting, Flying, Crashed } private RocketState currentState;

이유: isOrbiting = true일 때 isFlying = false를 빼먹으면 로켓이 동시에 두 상태가 되는 버그가 발생할 수 있습니다. Enum은 한 번에 하나의 상태만 보장하므로 이런 실수가 구조적으로 불가능합니다.


  1. 매직 넘버 제거 → GameConfig ScriptableObject

파일: GameConfig.cs (신규), GameManager.cs, Player.cs, PlanetSpawner.cs, GameOverLine.cs, InterstitialAdManager.cs

Before: if (comboCount < 5) return 1; // GameManager if (comboCount < 10) return 2; Application.targetFrameRate = 60; float baseSize = 5f; // Player

After: [CreateAssetMenu(fileName = "GameConfig", menuName = "Fire Rocket/Game Config")] public class GameConfig : ScriptableObject { public int comboLevel2Threshold = 5; public int comboLevel3Threshold = 10; public int targetFrameRate = 60; public float cameraBaseSize = 5f; // ... }

이유: 숫자가 코드 곳곳에 흩어져 있으면 밸런싱 조정할 때마다 코드를 수정하고 다시 빌드해야 합니다. ScriptableObject로 빼면 Unity Inspector에서 빌드 없이 실시간으로 값을 조정할 수 있고, 여러 설정 프리셋도 만들 수 있습니다.


  1. 싱글톤 통일

파일: FadeController.cs, SkinActionPanel.cs, Skin_Canvas.cs, SkinEquipManager.cs

Before: public class FadeController : MonoBehaviour { public static FadeController Instance; private void Awake() { if (Instance == null) { Instance = this; DontDestroyOnLoad(gameObject); } else { Destroy(gameObject); } } }

After: public class FadeController : Singleton<FadeController> { protected override bool DontDestroy => true; }

이유: 4개 클래스가 각각 똑같은 싱글톤 코드를 복붙하고 있었습니다. 프로젝트에 이미 Singleton<T> 제네릭 베이스 클래스가 있었는데 사용하지 않고 있었습니다. 통일하면 중복 코드가 제거되고, 싱글톤 로직에 버그가 있을 때 한 곳만 수정하면 됩니다.