Featherfilch

까치가 밤에 박물관을 털고 있고, 그녀를 잡을 수 있는 유일한 것은 빛입니다. 경비원의 랜턴은 실제 그림자를 드리우는 Light2D 콘이고, 전시 케이스와 기둥은 LightOccluder2D 폴리곤을 가지며, 발각 판정은 바로 그 지오메트리를 대상으로 레이캐스트합니다. 화면에서 음영으로 보이는 것이 곧 은신 상태입니다 — 빛을 막는 케이스 뒤로 숨으면 경비원의 시야도 함께 막힌 것입니다.

지금 플레이하기

방향키 / WASD로 이동 · Shift로 살금살금 걷기 · E로 케이스 열기 · X로 날개 대시 (경비원이 소리를 들음) · P 일시정지 · M 모션 감소. 세 번 잡히기 전에 보석 다섯 개를 둥지로 가져가세요.

▶ 플레이

콘셉트가 곧 계약이다

코드 한 줄 작성 전에 세 장의 콘셉트 시트가 만들어졌습니다: 야간 키 아트, 까치 캐릭터 시트, 박물관 소품 콜아웃 보드. 이 시트에 이름이 붙은 모든 것은 출시된 게임 안에 실제로 제작된 에셋으로 존재합니다 — 24개 항목 전부, 빠짐없이. 키 아트 옆의 엔진 화면은 목업이 아니라 실제 빌드입니다.

Featherfilch 콘셉트 키 아트
콘셉트 키 아트 — 이 작업물을 검증하는 기준
엔진에서 실행 중인 Featherfilch
엔진에서 실시간으로 구현된 같은 홀: 랜턴 콘, 오클루더 그림자, 케이스 뒤 어둠 속의 까치

아트 이전의 회색 박스

전체 강도 시나리오는 먼저 회색 사각형으로 실행되었습니다 — 순찰 경로, 콘 지오메트리, 오클루더 레이캐스트, 케이스 열기 동작, 나르기, 세 번째 보석 이후 세 번째 경비원 등장, 새벽 재시작까지. 블록아웃은 세 라운드였으며, 1라운드는 오토파일럿이 케이스에서 118px 떨어진 곳에 멈춰 78px 열기 반경 밖에 있었기 때문에 실패했고, 케이스 중심으로 경로를 잡아 62px에서 멈추도록 수정했습니다. 그 후에야 아트 작업이 시작되었습니다.

블록아웃 회색 박스
블록아웃: 사각형으로 표현된 홀 — 콘 라이트와 오클루더는 이미 실제 사양대로 적용됨
아트가 입혀진 동일한 홀
Blender 아트가 입혀진 동일한 홀

모든 스프라이트는 Blender 렌더링 — 두 번

이 작품에는 그려진 스프라이트가 전혀 없습니다. 까치와 경비원들은 Blender에서 고정된 64 px/미터로 제작, 리깅, 렌더링되며, 모든 프레임은 두 번: 색상 한 번, 카메라 공간 노멀 셰이더로 한 번, 이렇게 두 번 렌더링됩니다. 엔진은 이 두 부분을 다음에 공급합니다: CanvasTexture, 그래서 지나가는 랜턴이 실제로 새의 등과 파켓 마루의 모서리를 다시 비춥니다. 방향은 절대 좌우 반전되지 않습니다 — flip_h 은 노멀 맵의 X 채널을 재부호화하지 않으므로, 네 방향 모두 실제로 렌더링됩니다.

까치 스프라이트 시트와 그에 대응하는 노멀맵 패스
까치의 56프레임 시트(대기 / 걷기-홉 / 살금살금 / 대시 / 열기 × 4방향)와 그에 대응하는 노멀맵 패스

경비원은 실제 모션 캡처로 걷습니다

경비원의 걸음걸이는 수작업 포즈가 아닙니다: CMU 클립 02_01이 플랫폼의 모캡 키트를 통해 경비원 리그에 리타겟되어 방향당 6프레임으로 샘플링되고, 대기 동작은 긴 정지 클립 15_04에서 추출됩니다. 랜턴 팔만은 유일하게 수작업으로 처리된 예외입니다 — 야간 경비원은 램프를 들고 다니는 것이지 자유롭게 흔드는 팔처럼 움직이지 않으므로, 그 팔의 베이크된 곡선은 제거하고 수동으로 설정했으며 나머지 몸 전체는 여전히 모캡이 구동합니다.

경비원 걷기 프레임, 4방향
경비원: CMU 02_01 걷기, 4방향, 랜턴을 든 채
얼굴 오버레이 시트
얼굴이 연기합니다: 눈, 눈썹, 입이 머리 피벗 아래 별도 파츠로 구성되어 자체 오버레이 시트로 렌더링됩니다 — 무표정, 경계, 분노, 그리고 2단계 눈 깜빡임

든 등불은 그려진 램프에 고정되고

랜턴에 고정되지 않고 근처를 떠도는 켜짐 이는 이 랩이 이미 대가를 치른 결함 유형입니다. 여기서는 모든 방향의 모든 프레임에 대해 랜턴 유리 픽셀을 Blender에서 측정하고 다음에 기록합니다: char.json; 엔진 내에서는 따뜻한 빛의 웅덩이도 감지 원뿔에도 매 프레임 그 앵커에 다시 고정됩니다. 렌더러가 그리는 원뿔과 감지 테스트가 발사하는 광선은 같은 지점에서 시작합니다 — 보이지 않는 두 번째 기하 구조는 없습니다.

4방향 랜턴 앵커
네 방향 모두 같은 앵커 — 어느 방향에서든 유리에 빛이 맺힌다

정직하게 측정됨

랩은 이 호스트의 소프트웨어 렌더러 — GPU 없이 — 로 Playwright 감사를 수행하므로, 아래 프레임 레이트는 하한선이지 상한선이 아닙니다. 보기 흉한 항목도 포함되어 있습니다.

측정
익스포트 페이로드 (pck)1.67 MB
엔진 런타임 (wasm, 고정)33.7 MB
페이로드 내 제작된 아트1.29 MB
오디오 스템0.46 MB
블록아웃 라운드3회 (1회차 실패: 오토파일럿이 침입 반경 밖에 정차)
아트 감사 라운드7회차 — 1~5회차에서 시각적 결함 10건 발견, 6회차 정상, 7회차 확인 중
렌더링된 스프라이트 프레임152 (디퓨즈 76 + 카메라 공간 노멀 76)
사용된 모션 캡처 클립CMU 02_01 걷기, 15_04 대기(경비원); 까치는 프로시저럴
셀프테스트 플레이스루보석 5/5, t=126초에 승리
감사 중 프레임 레이트소프트웨어 렌더러, GPU 없음 - 초당 1프레임에도 못 미치는 수준
알려진 환경 결함소프트웨어 래스터라이저는 연속 플레이 약 5분 후 월드 캔버스 표시를 멈춥니다; HUD는 정상 유지됩니다. 1차 사이클에서 조사되었으며, 씬 그래프 결함은 아닙니다.

실제 엔진 기능, 그 자체로 입증됨

그림자를 드리우는 Light2D

각 경비원의 랜턴은 텍스처로 마스킹된 원뿔형 PointLight2D로, 그림자가 켜져 있습니다. 진열장과 기둥은 LightOccluder2D이며 — 보이는 그림자가 바로 숨을 곳입니다.

노멀 맵이 적용된 스프라이트

모든 프레임은 CanvasTexture를 통해 대응하는 카메라 공간 노멀 패스를 함께 전송하여, 새, 경비원, 파켓 마루, 진열장 모서리 모두 랜턴 빛의 영향을 받습니다.

감지 = 동일한 기하 구조

'조명이 비춤'이란: 원뿔 각도 안, 사거리 안, 그리고 그려진 랜턴 유리에서 발사된 오클루더 레이어에 대한 레이캐스트가 막힘없이 통과함을 의미합니다.

TileMapLayer 바닥

블록 파켓, 카펫 러너, 대리석 테두리 타일로, 각각 Blender에서 탑다운으로 실제 릴리프 노멀 맵과 함께 렌더링되었습니다.

AStarGrid2D

경비원 순찰과 셀프테스트 오토파일럿 경로는 실제 콜라이더 형태로 만들어진 동일한 그리드를 사용합니다.

GPUParticles2D

대시할 때와 잡았을 때 터지는 깃털, 천창의 달빛 사이로 떠다니는 먼지 입자.

튜닝된 상수값

걷기 240 px/s 숨기 130 px/s — 감지 절반으로 감소 날갯짓 대시 620 px/s, 0.22초간, 쿨다운 1.4초 랜턴 원뿔 330 px, 반각 0.42 rad Light2D 에너지 1.25 (1.65는 노멀 맵을 과다 노출시킴) Light2D 높이 72 — 0이면 노멀이 검게 나옴 감지 1.10초에 채워지고, 초당 0.9로 감소 여는 데 1.6초, 반경 78 px 소음 반경 380 px — 대시는 시끄럽다 CanvasModulate 0.47 / 0.48 / 0.56 3번 잡히면 밤이 끝남; 첫 번째는 무료 3~8초마다 깜빡임, 2단계 눈꺼풀 미터당 64 px, 전체 1 PPU 프레임당 최대 물리 스텝 30