# Unity 6000.1.0f1 + URP 프로젝트 규칙 ## 기술 스택 - Unity 버전: 6000.1.0f1 - 렌더링 파이프라인: Universal Render Pipeline (URP) ## 코딩 원칙 ### 1. 아키텍처 설계 - 모듈화된 컴포넌트 기반 아키텍처 적용 - MVVM 패턴 적극 활용 - GameState, GameEvent, GameFlow, GameFramework 구조 활용 - Restaurant 관련 시스템 모듈화 (RestaurantState, RestaurantEvent, RestaurantCharacter 등) - 레이어 간 의존성 최소화 ### 2. 종속성 관리 - 인터페이스 기반 설계 우선 - 구체 클래스보다 추상화 선호 - Dependency Injection 패턴 활용 - 강한 결합도 지양, 느슨한 결합도 지향 ### 3. 유지보수성 - SOLID 원칙 준수 - 단일 책임 원칙 (SRP) 엄격 적용 - 개방-폐쇄 원칙 (OCP) 준수 - 코드 재사용성 극대화 ### 4. 확장성 - 플러그인 아키텍처 패턴 적용 - 이벤트 기반 시스템 활용 - 모듈화된 컴포넌트 설계 - 새로운 기능 추가 시 기존 코드 수정 최소화 ### 5. 명명 규칙 (Naming Conventions) - **변수명**: 의미있는 단어 사용, 줄임말 지양 - ❌ `btn`, `txt`, `obj`, `go`, `ui`, `mg`, `ctrl`, 'kvp' (kvp같은 경우 key 또는 value가 무엇인지 알 수 있는 변수명 사용) - ✅ `button`, `text`, `object`, `gameObject`, `userInterface`, `manager`, `controller` - ✅ `keyValuePair`, `tabValueButton`, `enumValueTabButton` (구체적인 의미 표현) - **함수명**: 동사로 시작하는 명확한 의미 표현 - ❌ `Init()`, `Setup()`, `Get()`, `Set()` - ✅ `Initialize()`, `SetupComponents()`, `GetPlayerData()`, `SetPlayerHealth()` ### 6. 코드 스타일 - **논리 연산자**: `!` 키워드 대신 `== false` 사용 - ❌ `if (!isActive)`, `if (!hasComponent)` - ✅ `if (isActive == false)`, `if (hasComponent == false)` - **문자열**: 리터럴보다 상수 사용 권장 - **컬렉션 타입**: 성능상 우월한 경우가 아닌 이상 `List<>` 사용 권장 - ❌ `int[]`, `string[]`, `GameObject[]` (일반적인 경우) - ✅ `List`, `List`, `List` (일반적인 경우) - ⚠️ `int[]` (고정 크기, 성능이 중요한 경우만) ## Unity 특화 규칙 ### URP 최적화 - URP 렌더링 파이프라인 최적화 우선 - Shader Graph 활용 권장 - Volume 시스템 적극 활용 - 렌더링 성능 모니터링 ### 성능 고려사항 - Object Pooling 패턴 적용 - 메모리 할당 최소화 - 적절한 Update/LateUpdate 사용 - Addressables 시스템 활용 ## 프로젝트 구조 - Assets/_DDD: 프로젝트 핵심 시스템 (프로젝트명) - Assets/_ScriptAssets: 스크립트 에셋 및 ScriptableObject - Assets/_Scripts: 모듈화된 스크립트 시스템들 - GameFramework: 게임 프레임워크 핵심 - GameState: 게임 상태 관리 - GameEvent: 게임 이벤트 시스템 - GameFlow: 게임 플로우 제어 - Restaurant*: 레스토랑 시뮬레이션 관련 시스템 - InputSystem: 입력 시스템 - Audio: 오디오 시스템 - 각 폴더별 명확한 책임 분리 ## 프레임워크 활용 - 기존 프레임워크와의 통합 방법 - 커스텀 프레임워크 확장 방법