2D Action Platformer · Solo Dev · Unity 2026
우산
아래
UNDER THE UMBRELLA

9년 전, 현은 연서에게 우산을 씌워줬다.
9년 후, 그는 그 이유를 모른 채 돌아온다.

단도와 블링크로 싸우는 사이버네틱 요원.
복종 회로, 설계된 감정, 그리고 빨간 우산 하나.
설계든 아니든, 지금 이 마음은 내 거야.

횡스크롤 액션 스토리 위주 12 챕터 엔딩 분기 A / B 사이버네틱 느와르
01 · TODO
TODO LIST
28개 태스크
단계별 개발 체크리스트
02 · DASH
DASHBOARD
시스템 완성도
보스 5인 현황
03 · DESIGN
LEVEL DESIGN
12챕터 완전 설계
보스 페이즈 & 엔딩 분기
04 · LOG
DEV LOGS
개발 일지 9회차
2026.03.28 → 진행 중

Null — 개발 TODO

체크 상태는 브라우저 로컬 스토리지에 자동 저장됩니다.

전체 진행도
0% 0 / 28
즉시 — 코드만, 에셋 불필요 지금 바로 0/7
Ground Mask 이중화 전역 상수 통합버그 예방
PlayerMovement2D + PlayerStateMachine → Layers.cs 상수 하나로 묶기.
SlamImpactJuice → HitStopManager + CameraShaker 연결코드
WeaponData 수치 기반 타격감 즉시 구현. (약 2시간)
SoundManager PlaySFX 빈 메서드 자리 박기코드
Blink/Grab/Slam/Parry/Death 호출 위치 먼저 심기.
BossStateMachine Animator 트리거 자리 박기코드
TransitionToPhase/Grabbed 호출부에 트리거 심기.
PlayerStateMachine 각 State Enter()에 트리거 자리코드
Idle/Run/Blink 등 상태별 애니 파라미터.
Object Pooling — DaggerProjectile2D + Effect성능
Instantiate 호출부를 Pool로 교체. GC 폭탄 선제 차단.
점선 스프라이트 교체아트
EnemyLineOfSight2D 실선 → 빨간 점선(----) 교체.
단기 — 플레이어블 데모 (1~2주) 데모 목표 0/8
플레이어 스프라이트 최소 세트아트
Idle / Run / Blink / 투척 4개면 데모 가능.
플레이어 Animator Controller 구성 + 연결아트
미리 박아둔 트리거와 애니메이터 연결.
하운드 보스 스프라이트 최소 세트아트
Idle/Charge/Claw/ExposePiston 최소 동작.
보스 체력바 UI 구현코드
BossHealth 이벤트를 UI Slider에 구독 연결.
SlamState 카메라 쉐이크 + 히트스톱 연결코드
EffectManager.SpawnEffect 실전 연동.
1장 오프닝 컷씬 테스트 플레이QA
StoryDatabase 1장 기반 스킵 불가 플로우 검증.
1장 씬 레이아웃 + 타일맵 최소 제작아트
빗속 학교 앞 → 하운드 아레나 구성.
CheckpointManager 씬 배치 테스트QA
실제 씬에서 저장 및 복구 로직 최종 확인.
중기 — 트레일러 촬영 가능 (1~2달) 트레일러 목표 0/8
보스 2~5 스프라이트 + 애니메이터 전부아트
서류/형/그림자/설계자 각 보스 최소 세트.
타격음 + 블링크음 + 보스 보이스 에셋오디오
PlaySFX 자리에 실제 클립 연결 작업.
BGM 챕터별 구성 + SoundManager 연결오디오
BGM/SFX 슬롯 뼈대에 실제 트랙 에셋 붙이기.
VFX 실전 연동 — 파티클 에셋 연결아트
블링크 잔상 / 슬램 임팩트 / 피격 파티클.
전체 12챕터 씬 구성 + TriggerCutscene 배치
ChapterStoryLoader 드롭다운 씬 작업.
DesignerUmbrella 빨간 우산 비주얼 + 연출아트
12장 핵심. 단도 반사 메커닉 및 스프라이트.
엔딩 컷씬 A/B 풀 테스트QA
EndingUSBItem 및 플로우, Race condition 검증.
2회차 자동 스킵 검증QA
PlaythroughTracker 기반 자동 스킵 동작 확인.
장기 — 출시 준비 런치 목표 0/5
Steam 위시리스트 페이지 오픈마케팅
"단도로 9년을 싸운 사람이 우산을 집는다."
트레일러 촬영 + 편집마케팅
오프닝 → 전투 몽타주 → 빨간 목도리 → 우산꽂이.
퍼블리싱 전략 결정마케팅
트레일러 → 위시리스트 → 킥스타터 순서 권장.
전체 QA — 보스 5인 엔드투엔드 플레이스루QA
1~12장 처음부터 끝까지 전체 클리어 검증.
빌드 최적화 + 플랫폼 타겟 확정빌드
SimpleGameObjectPool 적용 확인 및 프로파일링.
Null — 개발 현황
2026-03-28 ~ 2026-04-02 · 6일차
Grey-Box Complete
5 / 5
보스 코드 완성
~25
신규 파일 (4월 2일)
12
챕터 스토리 내장
2
엔딩 분기 구현
플레이어 FSM
92%
단도 블링크
95%
레벨 디자인
97%
그랩 / 슬램
80%
보스 프레임워크
90%
스토리 파이프라인
88%
엔딩 시스템
85%
스프라이트 / 애니
10%
오디오
5%
하운드
블링크 입문
로직✓ / 주스✗
서류
패리 + 드론
코드 완성
구속 탈출
코드 완성
그림자
잔상 퍼즐
코드 완성
설계자
군단+2페이즈
코드 완성
카메라 쉐이크히트스톱 연출애니메이터 연동VFX 실전 연동 보스 체력바 UI타격음 시스템오브젝트 풀링점선 스프라이트 플레이어 FSM ✓전 보스 AI ✓엔딩 분기 ✓ 대화 파이프라인 ✓세이브 뼈대 ✓레벨 디자인 ✓
Game Level Design Document · v1.0

우산
아래

2D 액션 플래포머 · 횡스크롤 · 스토리 위주
Unity 2D · 1인 개발 기준 · 챕터 12개 완전 설계

총 챕터 12 Chapters
예상 플레이타임 4 ~ 6 시간
주인공 현 (사이버네틱)
엔딩 분기 A / B
핵심 메카닉
THROW
단도 투척
Rigidbody2D 발사. 박힌 위치로 블링크 트리거.
BLINK
블링크
단도 위치로 순간이동. 게이지 소모. 잔상 0.3초.
PARRY
패리
단도로 적 공격 쳐냄. 블링크 게이지 즉시 충전.
GRAB
그랩
사이버네틱 팔로 적 포획 → 투척. 체인 콤보용.
GHOST
잔상
블링크 시 이전 위치에 반투명 디코이. 적 AI 혼란.
SURGE
충격파
고공 강하착지 시 AOE. 리미터 해제 후 사용 가능.
구간 범례
전투
연출/스토리
탐색/이동
컷씬/암전
차례
01 반만요 튜토리얼 10 ~ 15 min
02 금고 스토리 5 ~ 8 min
03 작전명 우산 액션 8 ~ 12 min
04 하운드 보스 15 ~ 20 min
05 감금 스토리 5 ~ 8 min
06 서류 보스 12 ~ 18 min
07 0x03 탐색 5 ~ 8 min
08 옥상 액션 8 ~ 12 min
09 야장 탐색 5 ~ 8 min
10 보스 15 ~ 20 min
11 그림자 특수 12 ~ 18 min
12 설계자 최종 보스 20 ~ 30 min
01
Tutorial
반만요
9년 전 플래시백 — 현재 메인 스토리의 감정 원점
POV: 현 (9년 전)
배경
비오는 학교 앞 골목 → 분식집 → 인생네컷 → 집
톤/분위기
따뜻한 단색 조명, 낮은 채도, 노란 가로등, 흑백 전환
도입 메카닉
이동 / 점프 / 단도 투척 기초
예상 시간
10 ~ 15분
레벨 구간
연출
오프닝 컷씬. 비오는 학교 앞. 아이들이 부모에게 픽업되는 소란. 처마 아래 혼자 서 있는 연서. 신발 끝을 보는 눈.
이동
[이동 튜토리얼] 골목 진입. 현이 비속을 걸어 연서에게 도착. 우산 씌워주는 연출. 이동/점프 기본 조작 안내 (텍스트 아닌 환경 유도). 적 없음.
연출
분식집. 떡볶이 먹는 짧은 정지 연출. "많이 먹어." 플레이어 조작 없음. 감정 안착 구간. BGM: 잔잔한 피아노 + 빗소리만.
이동
가을 골목 귀갓길. 빨간 목도리 구입 연출. 인생네컷 부스 → 사진 찰칵 → 화면 잠깐 흑백 처리 후 컬러 복귀. 연서 소리없이 웃는 장면.
전투
[전투 튜토리얼] 귀갓길 골목. 불량배 2명 등장 (사실상 허수아비). 단도 투척 → 블링크 기본 흐름 체험. 적은 맞으면 바로 쓰러짐. 히트스톱 0.1초 첫 경험.
컷씬
레벨 종료. 집 도착. 다음날 새벽: 현의 방 문 → 비어있는 침대 → 없어진 재킷. 연서 굳어진 얼굴. 빨간 목도리 꽉 쥠. 화면 페이드아웃. 타이틀 출력: 우산 아래
이동 / 점프 / 이단점프 단도 투척 기초 블링크 (1회 체험)
설계 의도: 전투 없이 감정선 먼저 쌓는다. 플레이어가 연서와 현의 관계를 직접 경험한 뒤 현재 스토리로 진입해야 이후 모든 선택이 의미를 가진다. 이 챕터가 약하면 12장 엔딩 분기의 감정 충격이 절반으로 줄어든다.
///
02
Story
금고
현재 — 연서 시점 도입, 납치
POV: 연서 (현재)
배경
집 → 아빠 서재 → 납치 후 감금실
톤/분위기
조용하고 무거움. 먼지 쌓인 방, 낡은 금고
조작 방식
연서 조작 (전투 없음) — 탐색 + 대화만
예상 시간
5 ~ 8분
레벨 구간
연출
열아홉 번째 생일 아침. 케이크 없음. 연서 혼자 금고 앞 앉음. 눈 감기 → 눈 뜨기 → 여는 인터랙션 (E 또는 F키).
탐색
서류 묶음 읽기. 페이지 넘기기로 정보 공개: 아빠가 9년간 뒤진 것들. 복종 회로. 별표 세 개. 플레이어가 직접 텍스트 읽는 속도 조절 가능.
컷씬
문 두드리는 소리. 똑. 똑. 똑. 연서 일지 품에 넣음. 일어서는 연서. 문이 열림. 암전.
연출
납치 후 감금실. 하얀 천장. 손목 케이블타이. 연서 품 안 일지 확인. 목도리 안쪽 사진 확인. 창문 없음. 기다리는 연서. 현재 현 시점으로 전환 준비.
설계 의도: 연서를 플레이어블로 잠깐 운영해 플레이어가 그녀의 감정 상태에 직접 이입하게 한다. 전투 없음 — 이 챕터에서 전투가 나오면 스토리 리듬이 깨진다. 일지 읽기 속도를 플레이어가 조절하게 해야 한다.
///
03
Action
작전명 우산
현 이탈 — 조직 탈출 시작
POV: 현 (현재)
배경
조직 시설 내부 복도 → 계단 → 2층 복도 → 비상구
톤/분위기
형광등 깜빡임, 빛/어둠 교차, 붉은 비상등
신규 메카닉
블링크 + 잔상 본격 도입
예상 시간
8 ~ 12분
레벨 구간
연출
메시지 수신. 현 빗속 창문 바라봄. CCTV 캡처 — 빨간 목도리. "작전명 우산. 네가 알지." 현 단도 쥠. 출발.
전투
[구간 1] 복도 탈출. 요원 4명. 진압봉 적 첫 등장. 어둠 구간에서 잔상이 특히 유효함을 플레이어가 자연스럽게 발견하도록 구성. 블링크 게이지 UI 첫 표시.
전투
[구간 2] 계단 + 2층 복도. 요원 6명 혼합 배치. 패리 메카닉 튜토리얼 — 막아선 요원이 방어 자세 취함. 패리 성공 시 블링크 게이지 즉시 충전. 시각적 피드백 명확히.
컷씬
비상구 탈출. 빗속으로 걸어나가는 현. 뛰지 않음. "임무라고 했다. 임무여서 가는 게 아니었다." 텍스트 오버레이. 도시 전경으로 전환.
블링크 게이지 시스템 잔상 디코이 패리 (기초)
///
04
Boss Chapter
하운드
항구 창고 침투 — 중간 보스 하운드
POV: 현
배경
항구 근처 낡은 창고 — 녹슨 외벽, 형광등, 빗소리
톤/분위기
산업적. 습기. 아래서 올라오는 붉은 네온 반사.
신규 메카닉
그랩 본격 도입
예상 시간
15 ~ 20분
레벨 구간
전투
[구간 1] 입구 ~ 1층 복도. 요원 5명 혼합. 형광등 절반 꺼진 구간 진입. 어둠 활용 블링크 숙달. 던지고-블링크-척살-회수 리듬 완성.
탐색
계단 이동. 전투 없음. 빗소리만. 연서가 있는 층 향해 이동. "연서가 이 건물 어딘가에 있었다." 짧은 독백 텍스트.
전투
[구간 2] 2층 복도. 요원 6명. 그랩 튜토리얼 — 한 요원이 방어막 자세를 취할 때 단도로 닿으면 그랩으로만 처리 가능. "잡아서 던지기" 시각 유도.
보스전
하운드 등장. 기계 갑주. 유압 피스톤 양팔.
하운드
NULL 소속 · 기계 갑주 · 유압 피스톤
P1
유압 주먹 슬램. 벽을 뚫는 주먹. 회피 후 단도 투척 → 블링크로 측면/후방 접근. 단도만으로는 죽지 않음 → 그랩으로 유압 관절 포박 유도.
P2
피스톤 어긋난 후 분노. 한쪽 팔 파괴 후 패턴 변화. 더 빠르고 불규칙한 돌진. 취약 부위: 노출된 유압 관절 틈새.
피니쉬
양쪽 관절 파괴 → 무릎 꿇음 → 헬멧 틈새에 단도 박기 → 블링크 피니쉬 연출.
컷씬
레벨 종료. 단도가 현이 명령하지 않아도 손가락 사이에 끼워짐. "(현이 명령한 게 아니었다) (그냥 움직였다)" — 복종 회로 첫 복선.
그랩 → 투척 부위 파괴 시스템 도입
///
05
Story · Interlude
감금
연서 시점 — 일지 계속 읽기
POV: 연서 (감금실)
배경
창문 없는 감금실 — 형광등 하나, 묶인 손목
조작
연서 — 페이지 넘기기 + 소리 감지
연출
일지 계속 읽기. 아빠가 자기 이름이 목록에 오른 걸 알면서도 멈추지 않은 이유. 내부 고발자. 오작동 실험체. 연서 아빠 이름 목록에서 발견.
연출
멀리서 충돌음. 점점 가까워지는 발소리. "저벅. 저벅." 연서 문을 봄. 문이 열림. 챕터 4 현의 클리어와 연결. 암전으로 6장 진입.
설계 의도: 챕터 4 보스전의 긴장감 이후 호흡 조절 구간. 연서 시점을 삽입해 플레이어가 두 인물의 시간이 교차하고 있음을 느끼게 한다. 현이 싸우는 동안 연서는 일지를 읽고 있었다는 대비 구도.
///
06
Boss Chapter
서류
드론 + 전기 격자 + 서류 보스
POV: 현
배경
창고 1층 — 천장 높음, 형광등 여러 개, 전기 격자 바닥
신규 메카닉
전기 격자 밟기 (체력 소모) / 패리 반사
서류
군-기업 측 분석관 · 서류판 방어막 · 드론 무한 호출
P1
드론 웨이브. 4개 드론 내려옴 → 처리하면 계속 추가 호출. 끝이 없음. 단도 직격 시 척살. 바닥 전기 격자 위 단도 회수 시 체력 소모.
P2
구조물 낙하. 천장 금속 구조물 낙하 패턴. 블링크 잔상으로 구조물을 서류 쪽으로 유도하는 게 클리어 조건. 서류판 떨어뜨리면 취약 상태.
P3
전기 방어막 패리. 서류가 전기 방어막 활성화. 단도 투척 시 튕김 → 패리 타이밍에 단도로 쳐서 전기를 서류에게 반사. 그랩으로 벽에 꽂기.
컷씬
레벨 종료. 서류 "처리 완료" 중얼거리며 쓰러짐. 단도에서 미세하게 찌릿한 전기. "(이상한 단어가 머릿속에 떠올랐다)" — 복종 회로 복선 2. 연서가 있는 방향으로 걸어감.
패리 반사 (전기) 잔상 유도 전략
///
07
Exploration
0x03
빈 방 — 견장 발견 — 추적 시작
POV: 현
배경
감금실이 있던 복도 → 빈 방 → 계단 입구
전투
없음 — 완전 탐색 챕터
탐색
빈 감금실 도착. 끊어진 케이블타이. 의자 위에 손 얹음 — 따뜻함. 방금까지 여기 있었음. 바닥: 빨간 실 조각 발견 → 빨간 목도리 복선.
탐색
복도 발자국 추적. 빗물 발자국 방향: 오른쪽. 계단 입구에서 검은 견장 발견. NULL · 0x03. 플래시백: 9년 전 같이 싸운 형.
컷씬
"이 새끼가." — 말하지 않음, 생각만 함. 텍스트 처리 없음, 현의 표정 클로즈업. 단도 확인. 계단 위를 올려다봄. 계단 진입.
설계 의도: 보스전 연속 후 호흡 조절 + 정보 전달. 빨간 실이라는 작은 오브젝트로 목도리와의 연결을 무언으로 전달. 탐색 챕터이므로 BGM 없이 빗소리와 발소리만.
///
08
Action
옥상
헬기 이륙 목격 — NULL 사이보그 전투
POV: 현
배경
옥상 — 빗물 바닥, 붉은 네온 상향, 헬기 이륙
감정 포인트
연서 목격 (1초) → 닿을 수 없음 → 단도 내림
적 타입
NULL 사이보그 (현과 같은 종류) — 맷집 있음
예상 시간
8 ~ 12분
컷씬
헬기 이륙. 이미 뜬 헬기. 열린 문 안의 흰 셔츠 + 빨간 목도리. 굳어진 얼굴. 헬기가 방향 트는 순간 안이 안 보임. 현 단도 들었다 내림. "못 닿았다." — 처음으로 무력감 표현.
전투
NULL 사이보그 3명. 현보다 빠름. 블링크해도 단번에 척살 안 됨. 그랩 활용 필수. 적끼리 충돌시키기 전략 유도. 패리 타이밍이 맞으면 블링크 게이지 즉시 충전.
컷씬
레벨 종료. 주머니 속 빨간 실. 견장 NULL 0x03. 헬기 사라진 방향 응시. "암시장은 도시 동쪽이었다." → 9장으로 이동.
NULL 사이보그 패턴 학습 적 충돌 체인 전략
///
09
Exploration · Rest
야장
할아버지 — 정보 획득 — 리미터 해제
POV: 현
배경
골목 어귀 노천 작업장 — 천막, 낡은 공구, 빗속
전투
없음 — 대화 + 선택지
핵심 이벤트
리미터 해제 → 충격파 언락 / 신호 발신 경고
예상 시간
5 ~ 8분
대화
할아버지와 대화. 견장 제시 → 0x03의 위치 획득. "북쪽 아파트. 녹슨 데. 5층." 아이들이 현의 사이버네틱 팔 보고 숨었다가 다시 나옴. 2년 전 오작동 사건 피해자 가족임을 무언으로 전달.
이벤트
리미터 해제. "신호 가. 알지?" 현 고개 끄덕임. 작업 완료. 이동이 달라짐 — 짧고 폭발적. 손목 LED 점멸 시작. 충격파 메카닉 언락.
컷씬
현 걸어가다 멈춤. 할아버지 손녀의 빨간 목도리 보임. "데려와. 네가 찾는 거." 현 돌아보지 않고 걸어감. 북쪽으로.
충격파 (고공 강하착지 AOE) 손목 LED 타이머 (긴장감 추가)
설계 의도: 리미터 해제는 10장 보스전을 위한 파워업이지만 동시에 타이머(신호)가 켜지는 페널티다. 플레이어에게 "강해지는 대신 시간이 없다"는 압박을 줌. 아이들 장면은 설명 없이 오작동 사건의 실재를 전달하는 환경 스토리텔링.
///
10
Boss Chapter
0x03 — 진실 폭로 — 연서와 재회
POV: 현
배경
북쪽 낡은 아파트 1~5층 — 각 층마다 적 배치
타이머
손목 LED 점멸 간격 짧아짐 — 조직이 오고 있다
플래시백
전투 중 0.5초 ~ 1초 하얀 방 플래시백 삽입
예상 시간
15 ~ 20분
층별 구성
1층
어두운 복도. NULL 사이보그 2명. 그랩 필수. 전투 중 플래시백 0.5초 — 하얀 방, 같은 자세로 잡혀있던 현.
2층
일반 요원 4명. 잔상 활용 숙달. 빠른 클리어 유도 (LED 타이머).
3층
NULL 사이보그 3명. 더 빠름. 플래시백 0.5초 — 전기, 측정, 버텨라.
4층
아무도 없음. 조용. LED 점멸 간격 2초. "더 빨리 걸었다." — 현의 심리.
5층 보스
0x03 (형) 보스전.
0x03 — 형
NULL 소속 · 왼팔 기계 · 얇은 블레이드 · 현보다 빠름
P1
블레이드 공격 + 그랩 역이용. 단도 던지면 기계팔로 막음. 패리 → 블링크 게이지 → 등 공격이 핵심 루프.
P2
리미터 풀출력 트리거. 형이 현을 벽에 밀 때 플래시백 1초 — "연서를 생각해." → 현이 폭발적으로 밀어냄. 이후 빠른 콤보 루프.
클리어
블링크 게이지 풀 → 등 뒤 피니쉬. 형 무릎 꿇음. 웃음.
대화
진실 폭로. "그날 네가 신호 누른 거 아니야. 복종 회로야." / "우리 다 있어. 너만 빼고 알고 있었어." 현 창밖 응시. 9년이었다.
컷씬
연서 등장. 복도에 언제부터 서있었는지 모름. 전부 들었다. 현 눈과 연서 눈 마주침. "그날. 신호 누른 게 오빠예요?" — "응." — "…모르겠어." 연서 돌아섬. "가요."
설계 의도: 형의 마지막 대사 "회로 없어도 눌렀을 것 같아, 너"는 플레이어에게 남겨지는 질문이다. 현이 "모르겠어"라고 답하는 것이 이 게임의 도덕적 중심. 연서가 전부 들었다는 것은 12장 분기의 씨앗.
///
11
Special — Inner World
그림자
복종 회로 발동 — 현의 내면 세계
POV: 현 (내면)
배경
내면 공간 — 추상적. 문들. 기억 장면. 하얀 방.
회색/흑백 기조. 기억 장면만 색깔.
핵심 메카닉
블링크 규칙 변경 (내면 세계)
보스
그림자 (현 자신)
레벨 구간
진입
복종 회로 발동. 계단 5층에서 현 무릎 꿇음. 연서 목소리 멀어짐. 암전. 내면 공간 진입.
탐색
기억의 문들. 여러 문. 하나는 자물쇠. 첫 번째 문: 학교 앞 9년 전 장면 → 장애물 뚫으며 연서 앞 도달. 두 번째 문: 분식집 → 적 6명 처치. 세 번째 문: 금고 방 → 일지의 마지막 페이지.
보스전
그림자 등장. 자물쇠 잠긴 문에서 나옴. 현이랑 똑같이 생김. 차가운 눈빛. 블링크 불가 공간 — 단도 투척만 가능.
그림자
현 자신 · 내면 공간 · 죽일 수 없음
P1
단도 투척 + 직접 타격. 죽지 않음 — "죽일 수 없어. 나니까." 쓰러뜨리는 게 목표가 아님. 버티며 대화 트리거 발동.
결말
그림자가 현을 쓰러뜨림 → 현 무릎 꿇음 → 그림자 "눌렀잖아" → 현 "응. 눌렀어. 모르는 게 맞아. 그래도 아빠가 죽었어. 그게 나야. 부정 안 해." → 그림자 단도를 현에게 건넴 → 사라짐.
진실
자물쇠 문 열림. 하얀 방. 9년 전 수술대의 현. "연서를 생각해. 더 잘 싸울 거야." — 신호 누르는 손. 설계의 전모 공개.
복귀
내면에서 복귀. 계단 5층. 연서 현 앞에 앉아있음. "우산 없었겠지. 저렇게 됐으면." — 9년 전이 없었다면. 현 일어섬. 단도 쥠. "가자."
설계 의도: 이 챕터는 전투 챕터가 아니라 심리 챕터. 블링크를 막아서 플레이어를 불편하게 만드는 것이 의도적 설계 — 현이 자기 무기를 믿지 못하는 상태를 조작감으로 전달. 그림자를 죽이려 하면 안 된다는 걸 플레이어 스스로 깨닫게 유도.
///
12
Final Boss · Branch Ending
설계자
옥상 최종전 — USB 선택 — 엔딩 분기
POV: 현 / 연서
배경
옥상 — 비, 붉은 네온, 바람, 도시 야경
웨이브 구성
1웨이브 일반 → 2웨이브 NULL → 3웨이브 0x01 → 설계자
설계자 무기
검은 우산 (단도 반사) → 2페이즈 사이버네틱 팔
클리어 후
USB 선택 → 엔딩 A / B 분기
웨이브 구성
1웨이브
일반 요원 다수. 잔상 디코이 활용 최대화. 엘리베이터/계단/가장자리 3방향 동시 등장. 지금까지 배운 모든 기술 종합.
2웨이브
NULL 사이보그 3명. 현과 같은 종류. 그랩 체인. 패리 반격. 빠른 처리 필요.
3웨이브
0x01. 양팔 사이버네틱 + 블레이드 6개. 블레이드 방어로 단도 접근 어려움 → 어깨 관절 내측이 취약점. 블레이드 아래로 파고드는 패턴 학습 필요.
설계자 (0x00)
원점 · 검은 우산 + 숨겨진 사이버네틱 팔 · 현의 패턴 전부 인지
P1
검은 우산 반사. 단도 투척 시 우산으로 막아 튕김 → 블링크 불가. 패리 타이밍 공략 필요 — 우산 펼치는 순간 단도로 쳐서 전기 반사. 블링크 게이지 → 등 뒤 공격.
P2
우산 버림 → 사이버네틱 팔. "저도 실험체예요. 0x00." 더 빠른 패턴. 카운터 공격 강화. 단도 + 블링크 + 그랩 종합 활용. 체력 바 2단계.
클리어
설계자 쓰러짐 → USB 내밀며 "어차피 당신이 가져갈 거였어요. 처음부터." → 빨간 우산 우산꽂이에 있음. 현 우산 집음 → 연서에게 걸어감 → USB 들고 서있는 현.
선택 분기

셧다운 프로토콜. 복종 회로 전체 비활성화. 경고: 대상자 사이버네틱 전체 정지 포함.

USB 텍스트
엔딩 A — 연서가 막는다
연서가 USB를 현 손에서 꺼냄. "누르지 마요. 그거 누르면 오빠도 꺼지잖아요."

연서가 우산 살을 현 쪽으로 밈. "그때 내가 뭐라고 했는지 알아요?"

"…반만요."

둘이 우산 아래 반씩 비를 맞으며 서있음. 빗소리. 연서가 처음으로 이름을 부름 — "현아."

그게 전부였다. 그게 전부이기에 충분했다.
엔딩 B — 연서가 누른다
연서 USB 잡음. "회로가 한 거라는 거 알아요. 오빠가 나쁜 사람이 아닌 것도."

"엄마 아빠 생각하면."

현이 USB 놓음. 연서 누름. 현 멈춤. 우산 기울어짐. 현 눈 감김. 빨간 우산 바닥에 펼쳐진 채 떨어짐.

연서 우산 집음. 들지 않음. 그냥 쥐고 있음. 빗속에서 혼자.

아무도 가리지 않는.
설계 의도: 선택지를 직접 누르게 하지 않는다. 연서의 반응을 보고 플레이어가 이 상황이 어떻게 될지 직감할 때 — 그 직전 1초의 침묵이 이 게임의 클라이맥스. 두 엔딩 모두 틀리지 않다는 것이 이 게임의 주제.
///
전체 설계 원칙
아트 방향
반실사 2D 일러스트. 키 컬러: 빨간(감정) / 회색-파란(세계관) / 흰(기억). 픽셀 비권장 — 감정선이 프레임 수에 잠식됨.
개발 순서
그레이박스 완성 → 조작감 고정 → 감정 포인트 연출 → 아트 입히기 순서. 아트 먼저 시작하면 레벨 갈아엎을 때 전부 날림.
BGM 원칙
탐색/감정 챕터: 빗소리 + 최소 피아노. 전투: 신스웨이브 + 드럼. 보스: 긴장감 있는 전자음악. 대화: 무음 또는 앰비언트만.
MVP 범위
챕터 1 + 4 + 12 세 개가 완성도 있으면 Steam 데모 가능. 챕터 1은 감정 원점, 챕터 4는 게임플레이 정체성, 챕터 12는 목적지.
우산 아래 — Level Design Document v1.0 12 Chapters · Unity 2D · Solo Dev
Development Journal · Null

개발 일지

2026.03.28 ~ 진행 중  ·  Unity 2D  ·  1인 개발

총 13회차
Grey-Box Complete
2026-03-28
Dagger Blink System 기틀 마련 및 벽 타기 구현
블링크벽타기시스템
2026-03-29
산나비식 기동성 개편 및 자동 블링크 도입
기동성자동블링크이동
2026-03-31
코드 리팩토링
리팩토링구조
2026-04-01
코드 리팩토링 2
리팩토링정리
2026-04-01
FSM 안정화 및 전투 입력
FSM전투입력시스템
2026-04-02
Boss 설계, 엔딩 크레딧 설계
보스AI엔딩크레딧
2026-04-03
컴파일 · Safe Mode 에러 수정
버그수정컴파일SafeMode
2026-04-03
Ground 마스크 · 단검 풀 · 사운드 · Animator 인프라
인프라풀링사운드Animator
2026-04-04
Git 정리 · Unity 씬/폴더 구조 · Pixel Perfect · 단검 물리
Git씬구조PixelPerfect물리
2026-04-12
챕터 1 그레이박스 · 공간·시스템·환경
GrayBoxOpeningEventInputLockNPCRain
2026-04-18
오프닝 시퀀스 데이터 파이프라인 · 폰트 베이킹 · UI 방어
StoryJsonManagerAutoStartTMP베이킹FadeManager누아르템포
2026-04-19
오프닝 감독(GameInitializer) · Cutscene Resume 방어 · 조작권 Handoff · 스토리 트리거
GameInitializerPlayUntilResumeFromIDHandoff암전버그
2026-04-21
코드 리뷰 기반 버그 수정 & 리팩터링 — 암전 잔상·Confirm 플래그·무적 레이어·패리 버퍼
BugFixCutscenePlayerStoryEventTriggerBlinkStateStoryLineLoader
각 일지를 클릭하면 상세 내용으로 연결됩니다.
DEVLOG · 2026-03-28 · 토

Dagger Blink System 기틀 마련 및 벽 타기 구현

블링크벽타기투사체FSM
1부 Dagger Blink System The Spike
핵심 구현

Dagger & Blink — 투사체 기반 위치 이동 시스템 기틀 마련.

공중 블링크 1회 제한 — 착지/벽 점착 시 리셋. 무한 체공 방어.

Juice — 타격감

Hit-Stop — 블링크 직후 시간 왜곡, 공간 절단 타격감.

Ghost Fade — 검붉은 #800000 잔상, 누아르 톤 비주얼 피드백.

I-frame — 이동 경로 및 도착 직후 짧은 무적 프레임.

방어 설계 Anti-Bug
Collision Filter
단검이 플레이어 본인에게 부딪혀 블링크 카운트가 씹히던 현상 해결 — Layer Collision Matrix 최적화.
Wall Safe Offset
텔레포트 시 벽 내부에 끼이는 현상 — 콜라이더 두께 기반 오프셋 계산으로 해결.
Anti-Tunneling
고속 투사체 벽 관통 현상 — Continuous 충돌 감지로 원천 차단.
2부 기동성 혁신 — Wall Climb & Jump The Spike
6-Ray Wall Probe

발·허리·머리 높이에서 좌우 6개 레이로 연속된 벽을 정밀 감지. 반쪽 벽 매달리기 시각 버그 방어.

Vertical Mobility

벽 부착 상태에서 W/S 키 자유로운 상하 이동 구현 gravityScale = 0.

Wall Jump & Input Lock

벽 점프 시 반대 방향 힘 + 0.15초 입력 잠금. 조작의 쫀득함과 수직 상승 버그 동시 방어.

시스템 통합 Integration
Resource Reset

벽에 붙는 순간 공중 블링크 횟수 즉시 초기화. 벽-블링크-벽 무한 기동 발판 마련.

State-Based Architecture

Grounded / Air / WallClimb 상태 명확 분리. 복합 이동 상황에서도 물리 로직 충돌 없음.

Layer Matrix

Player, Dagger, Wall, Ground 간 상호작용 우선순위 확립.

DEVLOG · 2026-03-29 · 일

산나비식 기동성 개편 및 자동 블링크 도입

자동블링크Air-BlinkLineOfSight물리버그
1 핵심 구현 The Spike
무한 공중 투척 Air-Blink

공중 1회 제한 해제 → Time.time 기반 0.5초 쿨타임. 사슬팔 스윙 같은 연속 기동 확보.

Anti-Helicopter

공중 무한 투척 시 제자리 체공 방지. 투척 순간 velocity.y 강제 하강 → 묵직한 조작감.

자동 블링크 Auto-Retract

단검이 Enemy 레이어 충돌 시 Shift 없이 TryBlinkToDagger 자동 호출. 편의성·속도감 극대화.

2 3대 핵심 버그 수정 Bug Fix
Grounded Check
지상 점프 불능 — 수치 조정으로 조작감 정상화.
Dagger Friction
단검 지면 미끄러짐 — Rigidbody 제어로 해결.
Wall-Blink Block
벽 부착 중 블링크 발동 차단 로직 수정 완료.
3 조준선 Line of Sight 시스템 Architecture
LineRenderer 조준선

LineRenderer로 적↔플레이어 실시간 거리·방향 레이저 시각화.

UI 실험

텍스트 인디케이터 '나 여깄어!' 구현 후 시각적 노이즈 판정으로 비활성화.

4 물리 버그 & 트러블슈팅 Physics Fix
포물선 비행
RigidbodyType2D.Dynamic 기본 중력으로 단검이 포물선 낙하. → Launch 시 rb.gravityScale = 0f 강제 주입, 직진 궤적 완성.
Material 숙달

Project 창(창고) vs Hierarchy(무대) 구조 이해. Unlit/Transparent·Sprites/Default 쉐이더 특성 및 텍스처 타일링 확립.

미해결 — 점선 비주얼: 빨간색+투명 스프라이트로 실선 → 점선 교체 예정.
유도 단검(Magnetic Aim): 플레이어 100% 수동 컨트롤 재미 위해 기획적 제외 결정.
DEVLOG · 2026-03-31 · 화

시스템 아키텍처 리팩토링 및 2D 물리 표준화

리팩토링2D표준화GC최적화Layers.cs
1 구조 모순 해결 Critical
IProjectile2D 도입

기존 3D 기반(Vector3, RaycastHit) 인터페이스 폐기 → Vector2Collision2D 사용 2D 전용 계약 재정의.

ProjectileBase2D 재작성

3D Rigidbody 의존성 완전 제거 → Rigidbody2D 기반 표준화. IProjectile2D 구현, EffectManager와 정상 연결.

DaggerProjectile2D 연동

베이스 클래스와 인터페이스를 실제 동작부와 연결 — 아키텍처 정합성 확보.

2 성능 최적화 Performance
FindFirstObjectByType 탐색 남용 해결

DaggerProjectile2D.Awake에서 PlayerBlinkController2D 1회 캐싱, Launch 시점 null 재확인 이중 방어막. 매 충돌 씬 전체 탐색 오버헤드 제거.

Layers.cs 정수 상수화

문자열 비교 방식 지양 → static readonly int 상수 시스템. 오타로 인한 Silent Bug 원천 차단. 비트 연산 기반 레이어 마스크로 교체.

3 메모리 & API Memory
파티클 메모리 누수 방지

EffectManager.SpawnEffect 호출 시 ps.main.duration + 유예 시간 즉시 파괴 로직. 장시간 파티클 오브젝트 누적 크래시 리스크 해결.

ImmediateBlink() 공개 API

단검 적중 시 외부에서 즉시 호출 가능. 공중 블링크 소모 규칙·코요테 타임 준수하며 속도감 있는 기동 가능.

4 향후 과제 To-do
  • 점선 에셋 교체 — Aseprite 빨간 점선(----) 스프라이트 제작
  • 리팩토링 후 레이어 충돌 예외 상황 및 메모리 점유율 엣지 케이스 검증
DEVLOG · 2026-04-01 · 수

코드 리팩토링 2 — .cursorrules 2.0 전역 감사

GC제거WeaponDataLayers.cs메모리
목적: .cursorrules 2.0 도입에 따른 전역 코드 감사 및 성능 최적화.
핵심 키워드: GC 할당 제거, 매직 넘버 에셋화, 레이어 타입 안정성 확보.
A WeaponData & PlayerBlinkController2D Performance
데이터 기반 설계

하드코딩 수치(쿨타임·히트스톱·오프셋 등) → WeaponData.cs로 이관. 밸런싱 효율 증대.

레이어 참조 시스템

string 기반 레이어 비교 완전 제거 → Layers.cs 정적 상수. 오타 물리 버그 원천 차단.

수명 관리 최적화

블링크 이펙트 InstantiateDestroy(go, duration) 명시 → 메모리 누수 방지.

B EnemyLineOfSight2D — GC 폭탄 해체 GC Fix
머티리얼 캐싱

Update.material 접근 시 매 프레임 인스턴스 생성 유니티 고질 문제 해결.
Awake에서 1회 캐싱, OnDestroy에서 명시적 Destroy(_cachedMaterial) 호출.

방어적 참조 로직

인스펙터 할당 우선 → 누락 시에만 FindFirstObjectByType 호출. 런타임 부하 최소화 + 경고 로그 추가.

C 방어적 설계 체크리스트 Checklist
  • Early Return — 모든 메서드 진입점 null 및 경계값 검사
  • No Happy Path — 컴포넌트 누락, 플레이어 미탐색 등 LogError/Warning 처리
  • Memory Management — 핫 루프 내 new 할당 및 문자열 생성 지양
D 향후 과제 To-do
  • PlayerStateMachine FSM 구축 — Update 내 전투 로직 상태 클래스 분리
  • 히트스톱 & 카메라 쉐이크 — WeaponData 기반 타격감 디테일
  • 오브젝트 풀링 — 투사체·이펙트 Pool 시스템 도입 검토
DEVLOG · 2026-04-01 · 수

FSM 안정화 및 전투 입력 무결성 확보

FSMInputGuardBlink·Grab·SlamBossFramework
목적: Blink-Grab-Slam 루프 구현 중 발견된 런타임 예외 및 조작 간섭 해결.
이번 업데이트는 단순 기능 추가가 아닌 시스템의 척추(Core)를 바로잡는 리팩토링에 집중.
1 Core Gameplay Loop The Spike
메카닉설명
Blink 순간이동투사체 패링 시 즉시 충전되는 초고속 이동기
Grab 제압적의 약점을 낚아채어 물리 소유권 강제 획득
Slam 강타적을 지면에 메쳐 광역 데미지와 아머 파괴 피니셔
Boss Framework Scalable

IGrabbable Interface — 모든 적·보스 약점을 하나의 인터페이스로 통합, 저결합도 달성.
ArmorGauge System — 일반 공격 차단, Blink/Slam으로만 파괴 가능한 가드 + 자동 재생.

2 FSM 논리 결함 수정 Bug Report
BUG-01 · GrabState 소프트 락
타겟 유실 _target == null 시 무한 대기 → 즉시 IdleState 복귀 탈출로 확보.
BUG-02 · SlamState 초기화
_hasImpacted 플래그 초기화를 Enter() 최상단으로 이동. 조기 리턴 시 물리 오발사 방지. _rb·_target null 가드 강화.
BUG-03 · 입력 가드 Input Guard
Grab·Slam 상태 중 PlayerBlinkController2D 모든 입력 차단. 블링크 중복 발사 Self-Transition 버그 차단.
3 보스 로드맵 Boss Roadmap
단계보스명핵심 기믹서사
01하운드블링크 입문 / 유압 피스톤 그랩분노
02서류패리 + 블링크 (탄막 대응)무력감
03단검 박고 강제 블링크 탈출혼란
04그림자비전투 퍼즐 / 잔상 스위칭수용
05설계자군단 소환 / 역패리 대응선택
4 방어 체크리스트 Checklist
  • Early Return — 상태 진입·물리 연산 전 null 가드
  • Input Exclusivity — 특정 상태 입력 간섭 차단
  • State Integrity — 비정상 상태 시 Idle 복귀
⚠ Ground Mask 동기화: PlayerMovement2DPlayerStateMachine의 레이어 마스크 이중화. 인스펙터에서 동일한 Ground 레이어 확인 필수. (차후 전역 상수 통합 예정)
DEVLOG · 2026-04-02 · 목

Boss 2~5 전체 구현 및 엔딩·시스템 인프라 완성

Boss AI FSM엔딩시스템대화시스템StoryDatabase
Boss — 하운드 Hound Boss
클래스설명
EnemyBossHound유압 피스톤 그랩 + 블링크 입문
HoundShockwaveState슬램 충격파
H1
아머 게이지 자동재생 — 페이즈 전환 타이밍 경합 방어
Boss — 서류 Paper Boss
클래스설명
EnemyBossPaper드론 방패 + 도장 패턴 허브
PaperDrone패리 유도 드론
PaperDroneShieldState드론 전멸 시 PaperOverclockState 전이
PaperStampState지면 Raycast 방어 포함
PaperOverclockState (P2)4발 바라지 + 각도 퍼짐
H1
_hasParried 플래그로 다중 패리 오버플로우 차단
H2
BossParryableProjectile2D 편향탄 팀 ID 오류 방어
H3
PaperStampState 지면 미감지 시 스탬프 취소
Boss — 형 Brother Boss
클래스설명
EnemyBossBrotherLastPlayerBlinkPos 추적
BrotherBindProjectile2D구속 와이어
BrotherCounterState (P2)블링크 위치 텔레포트 후 즉각 슬래시
PlayerBoundState전면 재작성
H1
단검 분실 시 DAGGER_LOST_PENALTY 타이머 가속 (Soft Lock 방어)
H2
구속 중 블링크 시도 시 TriggerRejectFlash 빨간 플래시
H3
타임아웃 데미지 → IsDead 체크 → 사망·탈출 충돌 방어
Boss — 그림자 Shadow Boss
클래스설명
EnemyBossShadowLRU 마커 관리 + Bind/Unbind 오버라이드
BlinkGhostMarkerPause/Resume + 즉각 겹침 감지
GhostSwitchHashSet 추적 + IsFake (Phase 3 가짜 스위치)
ShadowGhostPhaseState퍼즐 타임아웃
ShadowHauntState절대 타이머 + FadeAndWarpRoutine
H1
마커 벽 클리핑 → Physics2D.OverlapPoint 스폰 차단
H2
HauntState 무한 루프 → 절대 타이머 + 강제 워프
H3
Bind 중 마커 혼란 → PauseAllMarkers / ResumeAllMarkers
H4
페이드 중 플레이어 사망 → playerHealth.IsDead yield 체크
H5
가짜 스위치 마커 과부하 → LRU + Phase별 수명 단축
Boss — 설계자 Designer Boss
클래스설명
EnemyBossDesignerWave 13 + Phase 12 허브
DesignerUmbrella단검 반사 Anti-Blink — 핵심 메카닉
ArmJoint관절 파괴 (원본 disabled + 분리 프리팹)
EliteAgent / NullCyborg / EliteZeroX01Wave 적 3종
DesignerWaveStateWave 1→2→3 시퀀서
DesignerStruggleState동시 대치 + ForcedReleaseTimer
H1
관절 분리 물리 오류 → enabled=false + 분리 프리팹 독립 스폰
H2
동시 잡기 무한 루프 → ForcedReleaseTimer 5초 강제 해제
H3
USB 습득 누락 → 카메라 포커스 + 자동 프롬프트
엔딩 시스템 Ending
Ending AEnding B
선택연서가 USB를 막는다연서가 USB를 직접 누른다
결말빨간 우산 아래 둘이 서있음 — "현아."우산이 바닥에, 혼자 빗속
희망비극
구현 클래스

CutscenePlayer — 라인바이라인 나레이션 엔진.
EndingChoiceUI — 분기 선택지 UI.
EndingUSBItem — 공통 프리 컷씬 + Ending A/B 전체 대사 내장.

대화 우선순위 시스템 Dialogue
레벨종류동작
1Ambient낮은 우선순위, 큐 드롭 허용
2Combat전투 상황 자막
3Story강제 재생, 드롭 불가
신규 생성 파일 (~25개) Files
Boss/Paper/ PaperOverclockState.cs Boss/Brother/ BrotherCounterState.cs (재작성) PlayerBoundState.cs (전면 재작성) Boss/Shadow/ Phase 2 + Rule 1 전체 수정 Boss/Designer/ EnemyBossDesigner.cs DesignerUmbrella.cs ArmJoint.cs Enemies/ × 3 States/ × 4 Dialogue/ CombatDialogueUI.cs BossCombatDialogue.cs TriggerCutscene.cs Ending/ CutscenePlayer.cs EndingChoiceUI.cs EndingUSBItem.cs System/ PlaythroughTracker.cs SoundManager.cs CheckpointManager.cs UI/ StruggleUI.cs
DEVLOG · 2026-04-03 · 목

컴파일 · Safe Mode 에러 정리

SafeModeCS에러패키지API정합성
목적: Unity Safe Mode 및 CSxxxx 컴파일 실패 해소.
패키지 → 스크립트 시그니처 → 타입 일치 순으로 정리.
1 패키지 manifest Packages
패키지버전효과
com.unity.ugui2.0.0UI 누락으로 발생하던 CS0246 등 완화
com.unity.textmeshpro3.0.9TMP 참조 복구
2 스크립트별 수정 Script Fixes
파일증상조치
ArmJoint.csCS0108 — gameObject 부모 충돌new 키워드 정리
DaggerProjectile2D.cs존재하지 않는 필드 참조weaponData.speed → projectileSpeed
StoryDatabase.csCS0103 Debug 미인식using UnityEngine; 추가
BossStateMachinevoid 대입 CS0815반환형 BossParryableProjectile2D로 명시
DesignerWaveState 외 3종?? 좌우 타입 불일치(… as IBossState) ?? … 형태로 통일
CombatDialogueUI.csCS0414 미사용 필드DialoguePriority.Combat 분기에서 사용으로 해소
3 잔여 메모 Notes
Physics2D.*NonAlloc Obsolete 경고 — Unity 6 API 마이그레이션 시 별도 대응 가능.
프리팹/씬 유실 — 코드 밖 작업, 에디터에서 재할당 필요.
동일 일자 후속 작업: 2026-04-03 인프라 (Ground / 풀 / 사운드 / Animator) 참고.
DEVLOG · 2026-04-03 · 목

인프라 — Ground · 풀 · 사운드 · Animator

Layers.csObjectPoolSoundManagerAnimator
목적: 데모·스팀 출시 전 코드만으로 바로 이득 나는 작업 묶음.
에셋 없이도 적용 가능한 방어·GC·연출 뼈대를 한 번에 적용.
1 Ground 마스크 Layers
PlayerPhysicsGroundMask

Layers.PlayerPhysicsGroundMask — Ground 레이어 단일 비트 추가.
적용: PlayerMovement2D, PlayerStateMachine → SlamState, PlayerBlinkController2D.
인스펙터 groundMask가 비어 있으면 폴백 사용 → 이중 설정 불일치 완화.

Ground 외 전용 플랫폼 레이어만 쓰는 씬은 인스펙터에 마스크를 직접 채워야 한다.
2 단검 오브젝트 풀 (선택) Object Pool
SimpleGameObjectPool 연동

풀 프리팹 == WeaponData.daggerProjectilePrefab 일 때만 Get / Release.
불일치 시 LogWarningInstantiate 폴백.
DaggerProjectile2D.SetReleasePool, ReleaseToPoolOrDestroy() — 최대 사거리·블링크 회수 시 반환.

3 사운드 훅 SoundManager Sound Hooks
API연결 지점
PlayBlink()TryBlinkToDagger 성공 시
PlayGrab()GrabState.Enter
PlaySlam()SlamState.ExecuteImpact
PlayParry()PlayerParryController2D.OnParrySuccess
PlayDeath()PlayerHealth.Die (_sfxDeath 슬롯 추가)
클립 미할당 시 기존 PlaySFX 가드로 무음 스킵.
4 Animator 플레이스홀더 Animator
플레이어 PlayerAnimHashes

Player_Idle / Player_Run / Player_BlinkCombat / Player_Grab / Player_Slam / Player_Bound
각 State Enter()에서 대응 트리거 발행.

보스 BossAnimHashes

Int BossPhase, Trigger BossGrabbed / BossVulnerable
페이즈 전환 시 SetInteger, GrabbedState·VulnerableState 진입 시 SetTrigger.
Animator 미할당 시 동작 변화 없음.

5 씬 작업 체크리스트 Checklist
  • 단검 풀 사용 시: 풀 프리팹 = WeaponData 단검 프리팹 일치 확인
  • 플레이어 / 보스 Animator 슬롯 연결 시 컨트롤러 파라미터 이름을 해시와 일치
  • SoundManager에 SFX 클립 순차 연결
DEVLOG · 2026-04-04 · 금

Git 정리 · Unity 씬/폴더 구조 · Pixel Perfect · 단검 물리

Git rebase씬구조PixelPerfect단검물리
목적: Git/README 정리, 그레이박스용 씬·에셋 구조 정돈, 단검 지면 미끄럼 수정.
유니티 에디터에서 플레이 가능한 테스트 씬 구성 1~3단계 진행.
1 Git — rebase & README Git
항목내용
상황feature/Unity rebase 중 README.md both modified
조치2026-04-03 devlog 링크 세 줄 병합 (Unity_Error_Fix 등)
결과rebase 완료
2 코드 수정 Code
파일내용
PlayerBlinkController2D.csOnBlinkExecuted 중복 summary 제거
DaggerProjectile2D.cs지면 튕김·미끄럼 완화: Continuous 검출, 무탄성 PhysicsMaterial2D, PinToContact, 임베드 시 각속도·회전 고정
WeaponData.csdaggerPhysicsMaterial, daggerSurfaceEmbedInset 추가
3 폴더·에셋 구조 Assets
경로내용
Assets/Scenes/TestScene.unity 이동, Test_Arena.unity 추가 — 그레이박스·전투 테스트용
Assets/Art/Sprites/spr_Tile_Base.png 추가
Assets/Data/NewWeaponData.asset 이동
Assets/Scripts/Layers.cs, WeaponData.cs, MovementData.cs 등 베이스 스크립트 이동 (루트 혼잡 감소)
Assets/Sound/폴더 생성 — SFX 연결 예정
삭제Assets/GroundPalette.prefab, 루트 NewWeaponData.asset
4 패키지·프로젝트 설정 Settings
항목내용
com.unity.2d.pixel-perfect 5.1.1픽셀 아트 카메라 정수 스케일 등
Physics2DSettings물리 2D 설정 조정
TagManager레이어·태그 씬과 맞춤 정리
5 1~3단계 체크리스트 Checklist
  • 씬 + 플레이어 + 바닥 — TestScene / Test_Arena
  • HitStop / CameraShaker / SoundManager — 씬 배치·참조 연결
  • 단검 루프 — 프리팹 + WeaponData + (선택) 풀
  • Animator 컨트롤러에 PlayerAnimHashes 트리거 이름 맞추기
  • SoundManager 클립 채우기
  • 타일맵·본격 아트 spr_Tile_Base 기준으로 확장
DEVLOG · 2026-04-12 · 일

챕터 1 그레이박스 — 공간·시스템·환경

GrayBox OpeningEventController InputLock NPCFollow2D 우산 PPU16/8 Rain
📸 오늘의 씬 — 학교 앞, 우산 씌워주는 장면 GrayBox Live
Chapter1 GrayBox — 학교 앞 우산 씌워주는 장면
현(흰 박스) + 연서(분홍 박스) + 빨간 우산 · 비 파티클 · #06060a 배경
목적: 우산 핵심 오브젝트 전에 「9년 전 그날」의 공간 문법과 시스템적 제어권을 고정한다.
예쁘게 그리기 전, 버그가 나기 어려운 로직 바닥을 다지는 단계.
1 레벨 디자인 — 공간 좌표 확정 Level Design
구간내용
X = 0 ~ 40 학교 정문감정적 몰입을 위한 적막한 빗길 구간
X = 40 목표 지점연서(NPC) 배치, 처마 Y = 4 레이아웃
X = 42 물리 차단이벤트 전 무단 이탈 방지 — Obj_StoryGate_School
X = 70 점프 튜토리얼3칸 규격 Gap — 기본 도약 메커니즘 검증
X = 100 분식집 랜드마크10×6 거대 매스, 두 번째 시퀀스 도달점
월드 좌표: X = 100까지 바닥 공사 완료. 분식집 공간 매스 배치 완료.
2 시각적 환경 — 픽셀 파이프라인 Atmosphere ~90%
Pixel Perfect 대응

홀수 해상도 경고(593×333) → 16:9 고정 + 정수 배율 1280×720으로 픽셀 뭉개짐 방어.

배경 느와르 톤

Deep Black #06060a로 픽셀 실루엣 대비 강화.

Rain 파티클

World Space 파티클 — 중력 1.5, 낙하 속도 20, Stretched Billboard로 빗줄기 질감. 환경 연출 ~90% 완료.

3 이벤트 & 입력 제어 아키텍처 System 완료
항목내용
제어권 분리SetStoryInputLocked — 컷씬·연출 중 돌발 입력 방어. PlayerMovement2D, Blink, Parry 전체 적용.
트리거X ≈ 37 OpeningEventController로 연출 시작 시점 동기화
착지 후 잠금공중 트리거 시 부유 방지 — WaitUntilPlayerFloored 계열
입력 억제해제 직후 튐 완화 — 수평 입력 억제 ~0.08s + Input.ResetInputAxes()
NPC 동행NPCFollow2D — 플레이어 대비 1.2× 속도, Follow Distance 1.5
⚠ X = 70 Gap 구간: 직선 추적만으로는 추락·끼임 리스크.
이후 Waypoint / Ghost Path 별도 방어 필요 — 코드 주석에 기록됨.
4 우산 오프닝 연출 — 픽셀·물리 감각 Umbrella
항목내용
PPU / 픽셀hold 스프라이트 PPU 16 (1px = 0.0625). 펼침(open/pull)만 PPU 8 (1px = 0.125).
상수: OnePixelWorldUnitUmbrellaHoldPpu16 / OnePixelWorldUnitUmbrellaPullPpu8
스미어Stretch Y 0.1 → 1.2, 0.05s, SmoothStep 적용 — 정점에서 기계적 선형 느낌 완화
무게 중심VisualRoot 로컬 Y _bounceVisualLocalY — 기본 −0.125(open/pull PPU8 기준 1px) + 팔로우스루로 원복
착지 스냅타임아웃 Y 스냅 직후 1프레임 _landingSnapMicroBounceLocalY — 기본 −0.0625(hold PPU16 기준 1px)
Z 파이팅우산 SpriteRenderer 로컬 Z −0.01 연출 구간 적용 후 원복
Animator_storyVisualAnimator None 허용. null 가드로 speed 조작만 수행
5 VisualRoot 분리 · 소팅 레이어 Hierarchy
VisualRoot 분리

물리 콜라이더와 시각 에셋 분리 — 우산 펼침 시 바운스·스쿼시가 본체 물리에 덜 미치도록.

소팅 레이어 확정

캐릭터 10 / 우산 11 순서 확정 — 실루엣·간섭 방어. 그레이박스 씬에 연결 완료.

6 진행률 스냅샷 Status
영역상태
월드 좌표 설계~100%
환경 연출 (비·배경)~90%
입력 제어·오프닝(우산)기준선 완료
우산 스프라이트·하이어라키그레이박스 연결 완료 / 폴리싱 진행 중
분식집 '정지' 연출0% — 공간 O, 무입력 씬 로직 X
가을 골목·인생네컷·전투 튜토미착수 (다음 웨이브)
7 다음 세션에서 이어갈 일 Next
  • 분식집 입력 완전 잠금 + 대화 + BGM/빗소리 믹스 — SnackShopStoryController 분리 권장
  • 시네마틱 — 떡볶이 먹는 샷 카메라 줌인 (Cinemachine 또는 CameraFollow 확장)
  • 인생네컷 구간 — 흑백 → 컬러 포스트프로세싱 (URP Volume 또는 셰이더)
  • 전투 튜토 — 허수아비 적·히트스톱 0.1s 체험, 기존 HitStopManager 연결
Git 커밋 제안: feat: umbrella sequence pixel grid + opening story lock
8 관련 파일 Files
Assets/Story/ OpeningEventController.cs NPCFollow2D.cs Assets/Player/ PlayerMovement2D.cs — IsFloorGrounded, SetStoryInputLocked, ReadHorizontalRaw PlayerBlinkController2D.cs — 우산 스프라이트·스쿼시·스토리 입력 잠금 PlayerParryController2D.cs — 스토리 입력 잠금
DEVLOG · 2026-04-19 · 일

오프닝 감독(GameInitializer) · Cutscene Resume 방어 · 조작권 Handoff · 스토리 트리거

GameInitializer CutscenePlayer PrepareStoryUiForResume IPlayerCutsceneHandoff StoryEventTrigger PlayUntil(22) 잔존 암전 버그
맥락: 1장 오프닝을 JSON lineId 기준으로 끊어 읽고(PlayUntil), 트리거로 재개(ResumeFromID)하는 감독 / 서사 / 물리 경계를 정리한 날.
1 오늘의 작업 요약 Work Log
구분작업 내용달성 · 의도
시스템 구축 GameInitializer.cs 추가 씬 진입 시 Chapter1_Opening JSON 로드 → PlayUntil(22)로 22번 라인까지 자동 재생 후 WaitingForTrigger 대기. Start()1프레임 양보 + 선행 유예(기본 0.15s)ResolveAndPlay().
방어 설계 CutscenePlayer.PrepareStoryUiForResume() ResumeFromID 직전 Narration/Dialogue CanvasGroup 활성화 + alpha 1. _fadeOverlay(Canvas_Fade)가 암전(~1)으로 남은 경우 alpha 0·비활성으로 잔상 제거.
지휘권 정리 트리거·초기화 역할 분리 GameInitializer시작 대사를 담당하고, 물리 트리거는 ResumeFromID(23)전환만 담당. 스폰 인접 이중 점화·인덱스 꼬임·교차 보행 위험 문서화.
시각·텍스트 TMP · 레이아웃 나레이션 줄바꿈(JSON \n) → 공백 합치기 옵션, 화자–본문 구분 문자, 인스펙터 Header 라벨 정리. 폰트·레이어는 씬에서 수동 할당 전제(잔존 이슈).
2 오늘 추가 · 수정한 산출물 Deliverables
파일 · 컴포넌트역할
Assets/Story/GameInitializer.cs씬 진입 시 스토리 키·PlayUntil lineId 로드·실행. UnityEvent용 ResolveAndPlay(). ChapterStoryLoader와 동일한 JSON 분기.
Assets/Scripts/IPlayerCutsceneHandoff.csSetCutsceneMode / InjectVirtualInput 계약.
Assets/Story/StoryEventTrigger.csOnTriggerEnter2D + CompareTag("Player")1회 발동 후 Collider 비활성.
Assets/Player/PlayerMovement2D.cs컷신 모드·가상 입력·ApplyResumeInputSuppressPulse·FSM용 GetMovementHorizontalAxis.
Assets/Player/PlayerBlinkController2D.csSyncCutsceneMode, ApplyResumeInputSuppressPulse.
Assets/Player/PlayerParryController2D.cs컷신·재개 입력 억제 중 패리 차단.
Assets/Player/PlayerStateMachine.csGetMovementHorizontalAxis(), PlayerMovement 노출.
Assets/Player/States/IdleState.cs / RunState.cs실제 축을 머신 경유로 통일.
Assets/Player/States/BlinkState.cs컷신 중 Shift 블링크 차단.
Assets/Ending/CutscenePlayer.csCutsceneState, PlayUntil / ResumeFromID, PrepareStoryUiForResume, 라인 ID UnityEvent 훅, 재개 입력 억제 코루틴, PlayNextLine + Context Menu 등.
연출 분리 원칙: OpeningEventController는 우산 스쿼시·NPC 추적 등 연출 전용(Anticipation ~0.2s, Smear ~0.05s, Follow Distance 등)으로 기존대로 유지. 오프닝 대본의 "언제까지 읽을지"는 GameInitializer + CutscenePlayer 조합으로 분리.
3 잔존 문제점 — 반드시 추적 Bug
현상
연서 트리거 이후 우산 연출은 동작하는데, 대사창은 암전·미표시에 가깝게 남는다고 보고됨.
가설검증 포인트
교차 보행 카메라 Culling Mask에서 UI 레이어 미포함 Main / UI Camera가 UI 레이어를 렌더하지 않음 → 로직상 켜져도 화면에 안 보임.
무게 중심 데이터–TMP 참조 단절 인스펙터에 Body_Text 등이 "New Text" 미교체, 또는 ResumeFromID(23) 시점에 JSON id 23 라인 부재·파싱 오류로 텍스트 주입 전 중단.
회수 / 스미어 Sorting Order · Canvas 순서 Canvas_Fade 또는 배경 Canvas가 Canvas_Dialogue보다 위에 있어 글자가 뒤에 가림.
PrepareStoryUiForResume으로 패널·전역 Fade 오버레이는 한 번 더 정리했으나, 별도 FadeManager 전용 오버레이·카메라 마스크·소팅은 씬 데이터 점검이 필요하다.
4 다음 세션 첫 액션 Checklist
  • Chapter1_Opening.json에서 id 23 라인 존재·타입·text 필드 형식 확인.
  • Main / UI CameraCulling MaskUI 포함 여부 확인.
  • Canvas_Dialogue(또는 동일 역할 Canvas)의 Sort Order를 전면 Fade·월드보다 충분히 높게(예: 100+) 설정.
  • CutscenePlayer 인스펙터의 Narration / Dialogue / Speaker TMPFont Asset 재확인.
5 디렉터 노트 Director
이중 점화 주의: 시작점에 StoryEventTriggerGameInitializerPlayUntil이 같은 대사를 이중 점화하지 않도록, Resume·전환은 한 트리거에만 연결하고 스폰과 콜라이더 겹침을 피할 것.
OpeningEventController 권장 수치 (참고)

Anticipation Hold 0.2s · Smear 0.05s · Follow Distance 1.5

Restore Player Control 켜서 시퀀스 후 조작권 복귀 확인.

6 관련 경로 — 빠른 점프 Files
영역경로
오프닝 JSONAssets/Resources/StoryData/Chapter1_Opening.json
감독 진입Assets/Story/GameInitializer.cs
컷신 재생기Assets/Ending/CutscenePlayer.cs
조작 HandoffAssets/Scripts/IPlayerCutsceneHandoff.cs, Assets/Player/PlayerMovement2D.cs
공간 트리거Assets/Story/StoryEventTrigger.cs
JSON 로더Assets/Dialogue/StoryJsonManager.cs, ChapterStoryLoader.cs
우산 연출Assets/Story/OpeningEventController.cs
Assets/Resources/StoryData/ Chapter1_Opening.json Assets/Story/ GameInitializer.cs StoryEventTrigger.cs OpeningEventController.cs Assets/Ending/ CutscenePlayer.cs Assets/Scripts/ IPlayerCutsceneHandoff.cs Assets/Player/ PlayerMovement2D.cs PlayerBlinkController2D.cs PlayerParryController2D.cs PlayerStateMachine.cs States/IdleState.cs States/RunState.cs States/BlinkState.cs Assets/Dialogue/ StoryJsonManager.cs ChapterStoryLoader.cs
한 줄 결산: "우산이 펼쳐지는 물리적 찰나"는 올라갔고, 대사가 안 보이는 문제는 렌더·소팅·데이터·참조 중 하나로 수렴한다 — 다음 세션 첫 10분에 위 체크리스트로 압박하면 된다.
DEVLOG · 2026-04-18 · 금

오프닝 시퀀스 데이터 파이프라인 · 폰트 베이킹 · UI 방어

StoryJsonManager AutoStartSequence TMP 베이킹 449ms FadeManager 의성어 UI
핵심: 데이터·파이프라인이 준비되기 전에 연출이 발화했다는 점을 1순위로 봤다.
"코드가 틀렸다"가 아니라 순서 문제.
1 문제 상황 — Happy Path를 믿지 않기 진단
증상가설 (1순위)
씬 시작 직후 컷씬이 안 돌아감 선행 동작 부재ChapterStoryLoaderAwake에서 JSON을 주입하지만, TriggerCutscene즉시 점화하는 코드가 먼저 돌면 리스트가 비거나 레이스 컨디션 발생.
한글 폰트 베이킹 시 에디터 프리징 타이밍/부하 — Dynamic/OS 기본 세트 전체를 한 번에 구우면 불필요한 글리프 범위로 연산 폭발 → 체감 ~2시간 멈춤.
2 JSON 스토리 데이터 외부화 Architecture
StoryJsonManager

Assets/Resources/StoryData/Chapter1_Opening.jsonStoryDatabase.GetChapter1Lines()를 한글·줄바꿈 포함 이전.

Resources.Load<TextAsset> + JsonUtility. 라인별 공백 제외 26자 초과 시 LogError로 즉시 알림.

오프닝 구간 — line id 53(FadeIn)까지만 리스트에 담고, 이후 라인은 다음 씬용으로 분리.

id 구분

CutsceneLine.lineIdid 43 의성어「꼬르륵」 / id 53 암전 종료를 코드에서 구분.

3 선행 동작 — AutoStartSequence 핵심 수정
0.1s 버퍼

IEnumerator Start()에서 0.1s 대기TriggerCutscene.Play() 호출.

같은 프레임에 JSON 주입과 컷씬 점화가 붙지 않도록 버퍼를 둔 것이 핵심.

TriggerCutscenePlay() → ActivateTrigger() 공개 API 추가 — 충돌 없이 강제 점화.

4 오프닝 물리 템포 PlayerMovement2D
항목내용
오프닝 전용 물리 주입BeginOpeningSequencePhysics / EndOpeningSequencePhysics
초기 설계느린 누아르 질감 (move 2.2)
플레이 검증 후 조정그레이박스 장애물 통과 불가 → move 3.5 / jump 10으로 수정
안전 기본값복구 실패 시 move 4 / jump 12
걷기 전용 잠금walkOnlyNoJump — 스토리 구간 점프 연타로 트리거 스킵 방어
수치는 OpeningSequencePhysicsDefaults에 상수화.
5 의성어 · 암전 연출 UI
id 43「꼬르륵」 의성어

CombatDialogueUI.ShowAmbientOnomatopoeia — 배경 알파 스케일·본문 색 톤 다운, TMP rich text 이탤릭.

id 53 FadeIn — 암전

FadeManager — CanvasGroup으로 암전, blocksRaycasts/interactable로 입력 차단.

FinalizeOpening 이벤트로 1장 시퀀스 종료 + 제어권 정리.

6 폰트 베이킹 — TMP ~2h → 449ms
Characters from File 방식으로 전환

Dynamic/OS 기본 세트 전체 → 필요 글리프만 제한으로 전환.

연산 시간: ~2시간 → 449ms (99% 이상 단축).

타협이 아니라 필요 글리프만 조준한 데이터 설계 = 정밀 사격.

내일 예정: 특수 따옴표(Unicode U+2018–U+201F) 정규화·폰트 글리프 포함 여부 점검.
잘못 들어가면 베이킹 범위가 다시 불어나거나 줄바꿈·26자 검증과 충돌 가능.
7 디버깅 5원칙 매핑 Review
원칙적용
선행 동작JSON 주입 이후를 고려한 0.1s 대기 + 트리거 강제 점화 순서 고정
타이밍컷씬 라인 duration·Fade 0.9s와 FadeManager 기본 암전 시간 정렬
스미어/가독성의성어 라인 패널·텍스트 대비 조정, Padding 5px 아웃라인 실험
무게 중심UI 앵커 (0,0) 레이아웃이 연출과 겹치는지 확인 — 내일 수정 예약
Follow-throughJSON 파싱 실패 시 Missing Data 대사, 물리 복구 실패 시 기본 수치, 암전 후 FinalizeOpening으로 제어권 정리
8 관련 파일 Files
Assets/Resources/StoryData/ Chapter1_Opening.json Assets/Dialogue/ StoryJsonManager.cs ChapterStoryLoader.cs Assets/Story/ AutoStartSequence.cs Assets/Dialogue/ TriggerCutscene.cs Assets/Player/ PlayerMovement2D.cs OpeningSequencePhysicsDefaults.cs Assets/Dialogue/ CombatDialogueUI.cs Assets/System/ FadeManager.cs Assets/Ending/ CutscenePlayer.cs
DEVLOG · 2026-04-21 · 화

코드 리뷰 기반 버그 수정 & 리팩터링

CutscenePlayer StoryEventTrigger StoryJsonManager PlayerBlinkController2D PlayerParryController2D BlinkState StoryLineLoader
맥락: 전체 코드 리뷰로 발견한 🔴버그위험 / 🟡설계취약 / 🟢최적화 이슈를 우선순위대로 수정.
암전 잔상 방어, Confirm 스킵 플래그 분리, 트리거 검증 강화, JSON 파싱 경고, 무적 레이어 복구 버그, 패리 버퍼 확장, 블링크 재개 억제, 로드 로직 중복 제거.
1 수정 완료 ✅ 🔴 버그 위험
1-1 · CutscenePlayer.cs — 암전 잔상 조건 오류

문제: PrepareStoryUiForResume에서 _fadeOverlay.alpha > 0.99f만 체크 → 페이드가 중간(0.01~0.98)에서 멈추면 화면이 어둡게 남음.

수정: 기준을 > 0.01f로 변경 — 조금이라도 암전 흔적이 있으면 즉시 제거.

1-2 · CutscenePlayer.cs_skipCurrentLine 플래그 이중 소비

문제: Update(HoldWithSkip용)와 ShowConfirm(WaitUntil용)이 같은 _skipCurrentLine을 공유 → 라인 이중 소비·타이밍 꼬임 가능.

수정: ShowConfirm 전용 _confirmWaitInputReady 플래그 분리.

1-3 · StoryEventTrigger.cs — Rigidbody2D 미전제

문제: OnTriggerEnter2D는 양쪽 중 하나에 RB가 있어야 발생 — 플레이어 RB 없으면 트리거 자체가 무음 실패.

수정: Awake에서 RB 미할당 경고 추가. 검증 로직을 IsPlayer() 메서드로 분리, Tag + Layer 이중 검증 적용.

1-4 · StoryJsonManager.cs — JSON type 오타 시 조용한 폴백

문제: ParseLineType 기본값이 항상 Narration → JSON에 오타가 있어도 경고 없이 잘못된 연출 실행.

수정: 알 수 없는 타입 시 Debug.LogWarning 출력 후 폴백.

1-5 · PlayerBlinkController2D.cs — 무적 레이어 복구 오류

문제: PerformBlinkInvincibility에서 origLayer = Layers.Player 고정 → 상태 전이 중 레이어가 달라지면 복구 레이어가 틀림.

수정: origLayer = gameObject.layer (호출 시점 실제 레이어)로 변경 + 이미 무적 레이어인 경우 중복 진입 방어.

1-6 · PlayerParryController2D.cs — 패리 버퍼 한도

문제: _overlapBuffer 크기 8 → 밀집 구간에서 콜라이더 8개 초과 시 대상 누락.

수정: 버퍼 크기 16으로 확장.

1 수정 완료 ✅ 🟡 설계 취약
1-7 · BlinkState.cs — 재개 입력 억제 게이트 누락

문제: 패리(PlayerParryController2D)는 IsResumeInputSuppressActive를 체크하는데, Shift 블링크(BlinkState)는 미적용 → 재개 직후 블링크가 뚫릴 수 있음.

수정: Tick()IsResumeInputSuppressActive 게이트 추가.

1-8 · GameInitializer.cs + ChapterStoryLoader.cs — 중복 switch 제거

문제: 동일한 StoryKeyList<CutsceneLine> 분기가 두 파일에 복제 → 한쪽만 수정 시 불일치.

수정: Assets/Dialogue/StoryLineLoader.cs (신규 static 클래스)로 단일화. 두 파일 모두 StoryLineLoader.Load(key)로 위임.

2 미수정 — 추후 대응 필요 ❌ 🔴 씬 구조 확인 필요
FadeManager 암전 잔상
PrepareStoryUiForResume_fadeOverlay(로컬)만 클리어. FadeManager가 별도 전용 오버레이를 쓰면 Resume 후에도 검정 화면 남음.
확인: FadeManager 인스턴스가 관리하는 CanvasGroup을 확인하고, Resume 시 FadeManager에도 Fade-In 요청 추가 필요.
2 미수정 — 플레이 검증 후 수정 🟡 설계 취약
이슈파일내용
walkOnlyNoJump 공중 속도 미리셋 PlayerMovement2D.cs 트리거 직전 공중에 있으면 의도치 않은 이동 가능
SlamState 직접 타입 체크 PlayerMovement2D.cs 새 "이동 막는 상태" 추가 시 매번 분기 수동 추가 필요
_playerMovement null Raw 폴백 PlayerStateMachine.cs GetMovementHorizontalAxis에서 컷신 가상 입력 미반영
데드존 상수 중복 IdleState.cs / RunState.cs inputDeadZone 두 곳 — 한쪽만 바뀌면 애니·이동 불일치
인스펙터 라인 무조건 덮어씀 ChapterStoryLoader.cs Awake에서 수동 입력 라인 덮어쓰기 — 디버그 어려움
공중 블링크 제한 주석 처리 PlayerBlinkController2D.cs maxAirBlinkCount 변수는 있으나 실제 제한 로직 비활성 — 기획·코드 불일치
2 미수정 — 여유 있을 때 🟢 성능 최적화
이슈파일내용
FixedUpdate 물리 쿼리 과다 PlayerMovement2D.cs BoxCast + 보조 레이 2개 + 벽 프로브 레이 6개
블링크마다 GameObject 동적 생성 PlayerBlinkController2D.cs LineRenderer 등 매 블링크마다 생성·파괴 → 풀링 권장
미사용 메서드 PlayerBlinkController2D.cs PlayBlinkSoundSafe 호출처 없음 — 삭제 가능
ForceMeshUpdate(true) 과호출 CutscenePlayer.cs 라인마다 호출 — 불필요한 경우도 포함
3 신규 생성 파일 New File
Assets/Dialogue/StoryLineLoader.cs

StoryKeyList<CutsceneLine> 단일 로드 진입점.

ChapterStoryLoader, GameInitializer 공용 — 중복 switch 완전 제거.

4 관련 경로 — 빠른 점프 Files
영역경로
컷신 재생기Assets/Ending/CutscenePlayer.cs
스토리 트리거Assets/Story/StoryEventTrigger.cs
JSON 로더Assets/Dialogue/StoryJsonManager.cs
공통 라인 로더 (신규)Assets/Dialogue/StoryLineLoader.cs
플레이어 이동Assets/Player/PlayerMovement2D.cs
블링크 컨트롤러Assets/Player/PlayerBlinkController2D.cs
패리 컨트롤러Assets/Player/PlayerParryController2D.cs
FSM 블링크 상태Assets/Player/States/BlinkState.cs
Assets/Ending/ CutscenePlayer.cs Assets/Story/ StoryEventTrigger.cs Assets/Dialogue/ StoryJsonManager.cs StoryLineLoader.cs ← 신규 Assets/Player/ PlayerMovement2D.cs PlayerBlinkController2D.cs PlayerParryController2D.cs States/BlinkState.cs