# UI 레이아웃/기술 상세 > 메인 문서: [game-system-overhaul-index.md](game-system-overhaul-index.md) --- ## 1. UI 레이아웃/네비게이션 ### 1.1 메인 게임 화면 레이아웃 ``` ┌─────────────────────────────────────────────────────────┐ │ [메뉴] CodeSlayer Lv.25 💰 15,420 [알림] [설정] │ ← 헤더 ├─────────────────────────────────────────────────────────┤ │ │ │ ┌─ 캐릭터 ─────┐ ┌─ 전투 영역 ──────────────────┐ │ │ │ │ │ │ │ │ │ HP ████░░ │ │ ╔═══╗ ╔═══╗ │ │ │ │ MP ███░░░ │ │ ║ ☺ ║ VS ║ ☠ ║ │ │ │ │ │ │ ╚═══╝ ╚═══╝ │ │ │ │ STR: 25 │ │ │ │ │ │ CON: 20 │ │ Syntax Error Lv.24 │ │ │ │ DEX: 18 │ │ HP ██████░░░░ │ │ │ │ INT: 15 │ │ │ │ │ │ WIS: 12 │ │ [45 데미지!] │ │ │ │ CHA: 10 │ │ │ │ │ └──────────────┘ └───────────────────────────────┘ │ │ │ │ ┌─ 장비 ───────────────────────────────────────────┐ │ │ │ ⚔️ 디버거의 검 🛡️ 강철 갑옷 🎩 마법 투구 ... │ │ │ └───────────────────────────────────────────────────┘ │ │ │ │ ┌─ 진행 상황 ──────────────────────────────────────┐ │ │ │ 🗡️ 버그 처치 중... [일시정지] │ │ │ │ ████████████████░░░░░░░░ 60% │ │ │ └───────────────────────────────────────────────────┘ │ │ │ ├─────────────────────────────────────────────────────────┤ │ [전투] [인벤] [스킬] [퀘스트] [더보기] │ ← 탭 바 └─────────────────────────────────────────────────────────┘ ``` ### 1.2 화면 구성 | 화면 | 접근 방법 | 주요 기능 | |------|----------|----------| | **메인 (전투)** | 기본 화면 | 전투 진행, 스탯, 장비 | | **인벤토리** | 탭 바 | 아이템 관리, 장착 | | **스킬** | 탭 바 | 스킬 관리, 빌드 | | **퀘스트** | 탭 바 | 퀘스트 목록, 진행 | | **더보기** | 탭 바 | 도감, 업적, 통계, 상점 등 | | **지역** | 더보기 | 월드맵, 던전 | | **설정** | 헤더 | 게임 설정 | ### 1.3 네비게이션 흐름 ```mermaid graph TD A[앱 시작] --> B{세이브 존재?} B -->|No| C[세이브 슬롯 선택] B -->|Yes| D[세이브 슬롯 선택] C --> E[캐릭터 생성] D --> F{튜토리얼 완료?} E --> F F -->|No| G[튜토리얼] F -->|Yes| H[메인 게임] G --> H H --> I[인벤토리] H --> J[스킬] H --> K[퀘스트] H --> L[더보기] L --> M[도감] L --> N[업적] L --> O[통계] L --> P[상점] L --> Q[지역] L --> R[명예의 전당] ``` ### 1.4 모달/오버레이 | 타입 | 사용 상황 | |------|----------| | **풀스크린 모달** | 사망 화면, 레벨업, 업적 달성 | | **바텀 시트** | 아이템 상세, 스킬 상세, 퀵 액션 | | **다이얼로그** | 확인, 경고, 선택 | | **토스트** | 간단한 알림, 획득 메시지 | | **툴팁** | 스탯 설명, 효과 설명 | ### 1.5 반응형 레이아웃 ```dart class ResponsiveLayout extends StatelessWidget { @override Widget build(BuildContext context) { return LayoutBuilder( builder: (context, constraints) { if (constraints.maxWidth < 360) { return CompactLayout(); // 소형 모바일 } else if (constraints.maxWidth < 600) { return MobileLayout(); // 일반 모바일 } else if (constraints.maxWidth < 900) { return TabletLayout(); // 태블릿 } else { return DesktopLayout(); // 데스크톱 } }, ); } } ``` --- ## 2. 기술적 상세 ### 2.1 State Management ```dart // Riverpod 사용 권장 final gameStateProvider = StateNotifierProvider( (ref) => GameStateNotifier(), ); class GameStateNotifier extends StateNotifier { GameStateNotifier() : super(GameState.initial()); void tick() { /* 게임 틱 처리 */ } void attack() { /* 공격 처리 */ } void useSkill(String skillId) { /* 스킬 사용 */ } void equip(Equipment item) { /* 장비 장착 */ } } // 분리된 Provider들 final combatProvider = ...; // 전투 상태 final inventoryProvider = ...; // 인벤토리 상태 final questProvider = ...; // 퀘스트 상태 final settingsProvider = ...; // 설정 상태 ``` ### 2.2 에러 처리 전략 ```dart class AppException implements Exception { final String code; final String message; final dynamic originalError; AppException(this.code, this.message, [this.originalError]); } // 에러 타입 class SaveLoadException extends AppException { ... } class MigrationException extends AppException { ... } class NetworkException extends AppException { ... } // 향후 온라인용 // 전역 에러 핸들러 void handleError(AppException e, StackTrace stack) { // 1. 로깅 Logger.error(e.code, e.message, stack); // 2. 사용자 알림 showErrorDialog(e.message); // 3. 복구 시도 (가능한 경우) attemptRecovery(e); } ``` ### 2.3 에러 UI ``` ┌─────────────────────────────────────┐ │ │ │ ⚠️ 오류가 발생했습니다 │ │ │ │ 세이브 데이터를 불러오는 중 │ │ 문제가 발생했습니다. │ │ │ │ 오류 코드: SAVE_LOAD_001 │ │ │ │ [ 다시 시도 ] [ 백업 복원 ] │ │ [ 새 게임 ] [ 문의하기 ] │ │ │ └─────────────────────────────────────┘ ``` ### 2.4 로깅 전략 ```dart class Logger { static LogLevel currentLevel = kDebugMode ? LogLevel.debug : LogLevel.warning; static void debug(String message) { ... } static void info(String message) { ... } static void warning(String message) { ... } static void error(String code, String message, StackTrace? stack) { ... } } enum LogLevel { debug, info, warning, error } // 로그 출력 예시 // [DEBUG] 2024-03-15 14:30:00 - Combat: Player attacks for 45 damage // [INFO] 2024-03-15 14:30:01 - Level up: 24 -> 25 // [WARN] 2024-03-15 14:30:02 - Low HP warning: 15% // [ERROR] 2024-03-15 14:30:03 - SAVE_001: Failed to save game ``` ### 2.5 성능 모니터링 ```dart class PerformanceMonitor { /// FPS 측정 double get currentFps => ...; /// 메모리 사용량 int get memoryUsageMb => ...; /// 틱 처리 시간 Duration get averageTickTime => ...; /// 성능 경고 void checkPerformance() { if (currentFps < 30) { Logger.warning('Low FPS: $currentFps'); } if (memoryUsageMb > 500) { Logger.warning('High memory usage: $memoryUsageMb MB'); } } } ``` ---