Seven-Shards-ORIGIN — 메가 추격 종결 정리 + 로케일 뼈대
1. 주요 변경사항
SessionCoopMegaEntranceVisualOut2D종료 판정 재설계:ServerTryFinalizeMegaChaseEscapeSuccess(caller)시그니처로 집결 좌표 결정 우선순위(앵커 → warp exit → 통과자 평균)를 서버 내부로 캡슐화.LocalPairWarpEntrance2D가 “사망자 이탈도 클리어 인정” 모드(GatherCorpses)에서 필요 인원 1명으로 강제, 생존자 프루닝도 분기별로 스킵.GameLocale+LocalizedStrings+Resources/Localization/{en,es,ko,ja,zh-Hans,zh-Hant}.txt6개 키-값 파일 투입,TMPRuntimeCjkFont가 로케일별 primary 폰트·라틴 폴백 테이블 구성.NetworkBootstrapUI/PlayerHUD/EnemyInfoPanel에 “인스펙터 슬롯 비면 런타임 빌더” 안전망 3중 구현,#if UNITY_EDITOR가드는 제거해 런타임에도 작동..cursor/rules2종 추가(모호 지시 질문, 암시적 폴백 금지) — 에이전트 협업 규약 명시화.
2. 코드 품질 리뷰
메가 추격 종결 로직 정리는 이 스냅샷의 핵심 이득이다. 기존에는 MegaChaseActive = false 와 MegaCoopEventInProgress = false 를 세 군데(경로 무효·길이 0·끝점 도달)에서 각각 끄고 ServerMarkAfterMegaChaseWorldUnlocked() 를 호출했는데, 이번에 ServerTryFinalizeMegaChaseEscapeSuccess(this) 하나로 수렴했고, 외부 MegaChaserController2D.ServerEndChase() 도 같은 진입점을 공유한다. 종료 “누가·언제·어디로” 가 한 함수에서 결정되므로 상태 이중 해제·집결 누락 같은 결함이 줄어든다. 집결 좌표 해결도 escapeGatherWorldAnchor → warp.WarpExitTransform → 통과자 평균 순서로 명시됐고 실패 시 LogError 로 조용히 실패하지 않는다 — .cursor/rules/no-implicit-fallback-branches-ko 와도 일관된다.
다만 품질 리스크는 런타임 UI 빌더 3종의 패턴 중복이다. NetworkBootstrapUI.BuildMinimalBootstrapIfMissing, PlayerHUD.BuildRuntimeHud, EnemyInfoPanel.BuildRuntimePanel 모두 “GameObject+RectTransform+VLG/Image/TMP 를 new 로 조립” 하는 유사 코드다. #if UNITY_EDITOR 가드를 제거하면서 이제 빌드에도 같은 코드가 셋 다 포함되므로, 공통 UI 팩토리(버튼·텍스트·스택)를 한 static 클래스로 뽑지 않으면 스타일·폰트 정책이 세 곳에서 드리프트할 위험이 크다. 프리팹을 꽂는 게 권장이라고 주석도 달려 있는 만큼, “안전망” 이 1급 UI 경로가 되지 않게 선을 그어야 한다.
로케일 레이어는 시작으로는 합리적이지만 한계가 뚜렷하다. LocalizedStrings.T(key) 가 키를 그대로 반환하는 fallback 은 QA 신호를 가리기 쉽고, GameLocale.OnLocaleChanged 이벤트는 TMPRuntimeCjkFont.InvalidateCache 만 호출할 뿐 이미 세팅된 TMP_Text 의 문자열·폰트를 재적용하는 경로가 없다. 언어 토글을 만들어도 현재 HUD 텍스트는 갱신되지 않는다. 또 zh-Hans/zh-Hant/ja 의 primary 폰트가 전부 NotoSansKR-Regular SDF 로 대리되는 점은 출시 전 반드시 교체되어야 한다.
3. 진행도 평가
커밋 2개지만 실제 변경 범위는 넓다. 네트워크 추격 종결이 한 경로로 통합된 것은 의미 있는 전진이고, 로비 안전망과 로케일 뼈대로 “플레이 가능한 빌드” 에 한 발 더 가깝다. 다만 커밋 메시지가 여전히 main 직접 푸시, feature 브랜치 운용 없음이고, 한 커밋이 UI·네트워크·로케일·폰트·에셋을 동시에 건드리는 점은 bisect·리뷰 비용을 지속적으로 늘린다. 진행도 56~60% 대로 판정한다 — 코어 루프는 굴러가나 로컬라이제이션·문서화 축이 크게 뒤처져 있다.
4. 다음 권장사항
LocalizedStrings에 실제 HUD/로비/게임오버 텍스트 키를 이관하고, 누락 키를 Editor 에서 덤프.GameLocale.OnLocaleChanged구독자에서 활성 TMP_Text 를 재적용하는 옵저버/컴포넌트 추가.NetworkBootstrapUI·PlayerHUD·EnemyInfoPanel의 런타임 빌더를 공통 UI 팩토리로 통합.docs/technical.md신설: 메가 추격 종료 경로(Controller/Session/Warp)와 집결 좌표 결정 순서를 다이어그램으로.Resources/Localization을 Addressable/StreamingAssets 로 옮기고, ja/zh 별 폰트 에셋 분리.
5. 문서화 상태
- design (2/10): GDD·컨셉·월드 구조 문서 부재.
.cursor/project-progress-summary.md는 작업 로그이지 디자인 문서가 아니다. - technical (3/10): 아키텍처 문서 없음. 이번 커밋으로 메가 추격 종결 주석이 조밀해지고
.cursor/rules2종이 에이전트 협업 규약을 성문화했지만, 네트워크 권한 경계·씬 전환 시퀀스·UI 3계층 규약은 여전히 코드 내부에만 존재. - spec (2/10): 레벨/레시피/장비/밸런싱 수치 테이블이 전무.
_sample/docs의 rubric 을 기준으로 보면 구조적 공백이 크다.
6. Backlog
- design·spec 축 문서가 사실상 부재, AI_HANDOFF.md 한 편으로는 대체 불가.
- Resources 기반 UI 프리팹·로케일 대량 로딩 — Addressable 전환 미정.
- TrapFieldWest.unity 변경이 Mesh fileID 셔플 위주라 실질 변경 식별 난이도 높음.
- UI Bootstrap/Driver/RootRefs 3계층 규약이 코드 주석/.cursor 룰에만 존재.
- PrefabBaker류 Editor 스크립트 6종 간 유사 로직 중복.
- 플레이테스트 체크리스트가 루트에서 삭제됐는데 후속 위치 불명.
- LocalizedStrings 가 en 이외 fallback 만 지원, 누락 키 수집/리포트 수단 없음.
- 런타임 UI 빌더가 3개 클래스(NetworkBootstrapUI·PlayerHUD·EnemyInfoPanel) 에 중복 구현.
- GameLocale 변경 이벤트가 TMP 캐시만 무효화, 이미 그려진 텍스트는 재갱신 안 됨.
- zh-Hans/zh-Hant/ja 폰트가 KR SDF 로 대리되어 표기 누락 잠재.
7. 이전 Backlog 해결
- “네트워크 권한 모델(호스트 권위 범위) 문서화 공백” 은 부분 해소다.
SessionCoopMegaEntranceVisualOut2D의ServerTryFinalizeMegaChaseEscapeSuccess/ServerFinalizeMegaChaseEscapeSuccess/TryResolveEscapeGatherWorldPosition에 서버 판정 기준과 집결 좌표 결정 순서가 주석·메서드명으로 명확히 드러났다. 별도 technical 문서가 아니므로 완전 해소는 아니고 backlog 전체에서는 제외하지 않는다.