지난 십여 년, 인디 개발자의 포스트모템 기본 대본이 「프로그램·아트·음악·대사를 혼자 짊어지고, 맺음말로 다음엔 솔로는 그만두겠다」였다면, 2026년 9월 10일 Ben(명의 RNG)이 itch.io에 펼친 《Memento Manor - A Paranormal Postmortem Introspection》은 그 청구서의 결산 방식을 공개적으로 다시 쓴다. 작품은 《Memento Manor》. 탑다운 오싹 RPG, 미션제 저택, 플레이어는 초자연 조사관 Mara Kalina로서 Resident(거주자)가 점유한 기억 속에서 도난당한 Memento를 찾는다. 엔진은 Godot. 전작 Phantom Forest의 GDScript에서 C# / .NET으로 옮겼다. 본고는 완성 빌드를 미시연했다. 아래 장면과 시스템은 작가의 공개 포스트모템과 게임 페이지 자료 관찰에서 온다.
관통하는 이미지는 「시그널은 위로」와 「문 앞의 줄」이다. 전자는 씬 트리 규율처럼 들리지만, 제작 윤리로는 검증 가능한 디커플링 약속이 된다. 자식은 부모를 몰라도 말할 수 있고, 부모는 필요할 때 아래로 참조를 잡는다. 후자는 엔지니어링 농담처럼 들린다——문이 프로그래머를 진창으로 끌어들인다는 건 상식이다——그러나 Ben의 회고에서는 솔로의 가장 정직한 전장이다. 같은 문이 Open / Peek / Loud Knock을 맡고, 여러 Resident를 줄로 통과시키며, 엿보는 중 Resident가 같은 문을 열면 Peek을 강제 종료한다. 솔로의 무게는 「만능」 슬로건이 아니라, 이런 시스템을 하나씩 못 박은 뒤에야 말할 수 있는 말——다음 판은 협업하고 싶다——에 있다.

1. 기본 논리: 솔로는 전능, 글로벌 매니저는 편함
업계 기본 논리는 깔끔하다. 그래서 게으르기도 하다.
한 사람이 게임 전체를 낼 때, 팀은 익숙한 메뉴를 연다. 영속 상태를 거대한 Game Manager에 몰아넣고, 씬 상속으로 레벨 트리를 복제해 「노드 하나 추가」가 전 레벨로 퍼지게 하고, 상호작용은 「E 키 하나」, NPC 경로는 A에서 B로 고정, 탑다운은 「배경에 스프라이트를 붙인 것처럼 보이면 통과」. 플레이어도 같은 어휘로 솔로를 읽는다——「되면 된다」, 「프로그래머 아트에 맛이 있다」, 「문 애니가 살짝 끊겨도 괜찮다」. 그 암묵이 솔로의 거침을 용서되는 업계 문법으로 바꾼다.
《Memento Manor》는 그 문법에 잘 안 들어간다. 저택은 방 단위로 렌더·충돌을 나누고, Resident는 Routine / Search / Chase / Sleep / Wander / Stunned / Trapped 한 벌을 가지며, 미션은 Investigation 구조체로 방·Resident·문 연결·픽업을 맞춤하고, 플레이어에도 Walk / Run / Idle / Busy / Peek / Faint가 있다. 목표는 「켜지는 데모」가 아니라 「완결된 경험」이다. 그걸 한 사람의 일정에 넣으면 업계 직감은 거의 자동으로 「시스템 자르기, 문 자르기, 2층 자르기」를 가리킨다.
Ben의 공개 포스트모템은 그 지름길의 자기 위안을 거절한다. 그는 직설적이다. 솔로는 일이 많고, 미리 알았지만 「왜」를 직접 봐야 했다. 주로 프로그래머이며 최선의 일은 무대 뒤 기능에 있다——그러나 솔로를 고르면 음악·그래픽·대사도 배워야 한다. 더 날카로운 한 줄은 자기연민이 아니라 방향 선언이다. 다음엔 협업 프로젝트를 바란다. 솔로로 다른 직종의 기초를 익혔으니, 협업에서는 상대 파이프라인을 염두에 두고 자기 몫을 쓸 수 있다. 갈림길은 여기다. 기본은 「한 사람이 못 들 때 무엇을 자를까」를 묻는다. 그는 「한 사람이 들 수 있을 때, 어떤 디커플링을 제대로 써 두면 다음 협업이 같은 결합을 진창으로 끌어오지 않을까」를 다시 묻는다.
2. 대본을 깨기: 시그널 위 / 참조 아래, 그리고 「Busy」를 명시하는 상태 머신
디커플링은 주장하기 쉽고 증명하기 어렵다. 「확실히 이기는」 안은 종종 모든 것을 글로벌 싱글톤으로 만들거나, 씬 상속을 공짜 복제로 취급하는 것이다. Ben은 전작 경험을 들고 온다. Phantom Forest에서는 GDScript를 썼다. C#으로의 전환은 「다른 언어」만이 아니라, GDScript만이면 장래 엔진·IDE 선택지가 좁아질까 봐였고, .NET Godot가 Visual Studio에 붙으며 대학 시절부터 익숙한 C#을 이어갈 수 있어서다. 포스트모템은 해시 테이블, 정적 데이터, 람다, 열거형, 인터페이스, 구조체, 상속, 다형성, null 조건 대입, 비동기, 자작 assert를 구체적으로 나열한다. 의도는 단단하다——C#을 쓰면 GDScript 껍질로 쓰지 마라.
C#은 청구서도 낸다. GDScript의 즉시 비우기와 달리 GC는 한꺼번에 드물게 도니, 막 지운 참조에 닿을 수 있다. 글로벌 매니저에 비글로벌 참조를 두지 마라, 아니면 씬 전환에서 샌다. 정적 리스트는 복제 후 고쳐라, 아니면 Resident 공용 사전을 오염시킨다. 글로벌 시그널에 연결한 로컬 노드는 `_ExitTree`에서 수동 해제——GDScript는 씬 전환에 자주 지워지지만 C#은 아니다. 추상적 결벽이 아니라, 솔로 석 달에 터지기 쉬운 「작은 quirk」다.
기본 대본을 진짜로 깨는 것은 composition과 규율 **signal up, reference down**이다. 자식은 시그널로 위로 보고하고 부모를 몰라도 된다. 부모가 즉시 데이터가 필요하면 아래로 참조를 잡는다. HealthComponent식 자식은 플레이어에도 적에도 붙일 수 있다. Interact Area를 Area2D 자식으로 임의의 상호작용물에 붙이고, 부모는 「범위에 들어옴」 시그널만 연결한다. 위험도 같은 문단에 쓰인다. 문서가 나쁜 컴포넌트는 시스템을 장님으로 만든다. 해법은 용도가 드러나는 이름(HealthComponent 등), 짧고 단일 책임. 유연성은 공짜가 아니다——다른 부모 아래에서 작은 시스템을 재사용하는 대신, 다른 사람을 위한 계약처럼 보이는 인터페이스를 쓰는 비용을 낸다.
여기서 상태 머신은 교과서 명사가 아니라, 「지금 이 캐릭터가 움직일 수 있는가」를 상속 가능한 메서드 표에 못 박는다. 플레이어 쪽: Walk / Run / Idle이 이동·상호작용을 다루고, Busy는 상호작용 중 이동권을 빼앗으며, Peek은 문틈 조명 이동을 더하고 입력·타인의 문 사용·Resident에게 보이는 순간 빠져나와 문에 리셋을 알리고, Faint는 잡힌 뒤 기절 애니와 저택 내 시간 점프를 기다리며 UI를 숨긴다. Resident 기본은 시간과 위치로 도는 Routine. NoiseArea나 횃불이 청취·감지 범위에 들어오면 Search, 레이캐스트로 시선이 통하면 Chase, 도착 후 Sleep 또는 Wander, 약점과 덫은 Stunned / Trapped로 종종 Memento를 떨어뜨린다. 기본 State의 덮어쓸 수 있는 Move / Turn 덕분에 Busy는 아무것도 안 해도 되고 Walk는 입력에 응답해야 한다——복잡성은 새 상태 안에 가두고, 삼천 줄 `if`로 퍼지지 않는다.

3. 문·경로·Investigation: 가장 어려운 시스템을 맞춤 미션으로 쓰기
프레임 예산 밖에서, 솔로가 가장 비싼 것은 종종 「문 한 짝」이다. Ben은 분명히 말한다. 모든 설계 중 문이 가장 많은 재작업·미세조정·타협을 거쳤다. Resident가 가장 복잡한 객체일지 몰라도, 문은 끝까지 까다로웠다. 이유는 흙냄새 나고 정확하다——문은 레벨 전환만이 아닌 경우가 많다. 상호작용물이며 환경 분할이며 여러 캐릭터 유형이 쓰고, 잠금·엿보기·큰 노크도 가능하다. 용도마다 상태 변화가 필요하고, 깨끗이 리셋하며, 「지금 이 문은 쓸 수 없다」고 남에게 알려야 한다.
《Memento Manor》의 문은 문턱을 걸어 들어가는 연출 대신 포켓몬식 페이드 전환을 골랐다. 스프라이트를 열고, 캐릭터를 페이드아웃하고, 반대편 문 마커로 옮기고, 페이드인하고, 닫는다. 상호작용물은 공통 Action 시스템을 쓰고, 문은 Open / Peek / Loud Knock 세 슬롯. 동시에 여는 것은 한 명만, Peek보다 우선. 플레이어가 Peek 중 Resident가 열면 Peek을 강제 해제하고, Resident 도착과 짧은 지연 뒤까지 재상호작용 불가. 여러 Resident는 줄에 들어가 짧은 지연 후 재시도, 횟수 제한, 오래되면 unstuck로 일과 위치로. 「벽 뒤를 걸어 나오는」 애니는 너무 느리고 어렵고 이득이 얇아——잘랐다. 다 해내는 낭만이 아니라 솔로의 비싼 정직함이다. 전환은 「방이 바뀌었다」고 전하면 되고, 연기할 필요는 없다.
내비도 「NPC가 걸을 수 있다」를 구체 구조로 누른다. 방마다 NavigationRegion2D, 가구·벽은 NavigationObstacle2D, 문은 NavigationLink2D로 망을 잇는다. Resident는 goal 노드를 들고 문 마커나 끝점으로 단계적으로 간다. Route 구조체는 시작·경유 방 목록·마커·단계 필터 함수를 갖고, 미리 채운 connections 사전으로 최단 경로를 만들며 커스텀 방 연결도 지원한다. 언제 다시 계산할지는 상태 머신이 정한다——Routine은 방당 한두 번이면 되고, Chase / Search는 이동 목표에 자주 갱신한다. 방 자신이 렌더·충돌·환경광·환경음을 관리한다. 플레이어가 들어와야 등과 레이어가 켜지고, 다른 방의 Resident는 내비는 유지하되 시각은 건너뛰며, 비면 충돌을 끌 수 있다. 더 공들인 것은 「프로젝터」——커스텀 SubViewport로 한 방의 라이브 화면을 다른 방 「아래」에 투영해 로비와 발코니, 정원과 다리의 층 깊이를 만든다. 의도는 자료로 읽힌다. 본고는 손맛을 미실측.
미션제의 심장은 Investigation 구조체다. 조사 데스크에서 고른 뒤 저택이 읽는다. 방이 어두운지/잠겼는지/비활성인지, 문 재연결, Resident 유형·일과·난이도, NPC 대사와 위치, 픽업 확률과 순서, 플레이어 시작 방·아이템·이성. 난이도는 선형 곱이 아니다——Resident 1–10 평가를 Curve 리소스로 비선형 샘플해 속도·이성 피해·감지 반경 등으로 내린다. 월드 화면은 960×540 SubViewport에 넣어 ×2로 1920×1080 UI에 맞추고, 픽셀은 Nearest. Tween과 AnimationPlayer 분담은 실행 가능한 한 줄——「최종값이 모르면 Tween, 아니면 AnimationPlayer」. 씬 상속은 명시적으로 격하. 기본 씬이 노드를 강제하면 낭비와 속박이 된다. 그는 composition으로 씬을 짜고, 스크립트 상속은 객체 안에 둔다.
탑다운의 「납작하지 않음」도 분위기 형용사가 아니라 실행 체크리스트다. 발밑 그림자는 체형·높이에 맞춰 투명도를 바꾸고, 이동 시 CPUParticles2D 먼지가 「무게」를 주며, Y-sorting으로 NPC·소품 앞뒤가 성립하고, 가까운 전경 벽·난간은 다가가면 페이드, 야외는 둘러싸임을 위해 페이드를 끌 수 있고, 어두운 방은 전경을 기본 페이드해 어둠 자체를 주 장애로 둔다. 상호작용물은 동일 기반을 상속하고, 최대 세 Action 슬롯을 동적으로 바꾸며(잠긴 문, 옷장 출입), action state 이름으로 플레이어를 Busy 등으로 즉시 전환. 글로벌 Interaction Manager가 중개해 검증·상호배제·종료 시 clear. 싱글톤 쪽은 Game / Save / UI / Player / Audio / Item / Time / Interaction이 각기 담당——동시에 작가는 Item과 Time은 오늘이라면 저택 로컬이 낫다고 지목한다. 뒤늦은 겸손이 아니라, 솔로 회고에서 희귀한 거부권이다. 남는 글로벌은 다음 협업에서 아무도 못 건드리는 블랙홀이 된다.

4. 맺음: 인디란 솔로를 다음 협업의 교과서로 바꿀 의지를 말한다
이 9월 10일 회고를 2026년 가을 Godot 솔로 현장에 되돌리면, 먼저 치는 것은 숨은 제작 관성이다. 사람들은 솔로를 전능 신화로, 글로벌 싱글톤이 많을수록 편하다고, 「문이 통하면」 충분하다고 두고, 자신의 디커플링이 한 사람의 다음 주를 아끼는지 여러 사람의 다음 프로젝트용 인터페이스를 남기는지 거의 묻지 않는다. Ben은 다른 경로를 펼친다. 시그널 위 / 참조 아래는 규율이 될 수 있다. 상태 머신은 Busy / Peek / Faint와 Chase / Search를 각자의 메서드 표에 가둘 수 있다. Investigation 구조체는 「또 하나의 미션」을 레벨 복제가 아닌 기입표로 바꿀 수 있다. 문은 악몽이라고 공언하면서도 줄과 Peek 강제 종료 규칙을 남길 수 있다. Item·Time 매니저조차 자기비판한다——오늘이라면 로컬 쪽. 솔로 포스트모템에서는 「글로벌을 너무 늘렸다」가 「전부 했다」보다 쓸모 있다.
소규모 팀에게 이 재료는 날카롭고 쓸모 있다. Resident 전체 상태표나 SubViewport 프로젝터가 없을 수도 있다. 그러나 「기본값으로 충분」 목록은 반드시 있다. 상호작용 키가 하나뿐. 줄 없는 문으로 두 번째 NPC가 관통. 씬과 함께 죽어야 할 참조를 쥔 글로벌. GDScript에서 C#으로 옮기며 `_ExitTree` 해제를 잊음. 탑다운이 배경판뿐——발밑 그림자·먼지·Y-sort·근경 페이드 없음. 선형 난이도가 10단계에서 갑자기 불공평. Ben의 공개 숙제는 비용을 흙냄새 나게 쓴다. 솔로는 다른 직종을 알기 위해서. 프로토타입은 혼자 이어가도 된다. 완성 게임은 협업하고 싶다. 영감은 《루이지 맨션》 《그레고리 호러 쇼》 《Amnesia: The Dark Descent》 《포켓몬스터 플라티나》——본고는 자료 주석이며 플레이 경험의 대체가 아니다. itch 페이지는 Windows / Linux, v1.0.0, No generative AI was used를 적는다.
실행 가능한 짧은 지침:
- 첫 「글로벌 매니저」 커밋 전에 규율 한 줄을 써라. 어떤 갱신이 시그널 위인지, 어떤 데이터가 참조 아래인지. 임시 노드가 글로벌 시그널에 연결되면 같은 변경에 `_ExitTree` 해제를 써라.
- 캐릭터 의사결정이 상호배타 세 가지를 넘으면, 먼저 기본 State와 상태 머신 부품을 뽑고, Busy/이동 불가를 명시하며 흩어진 bool에 기대지 마라.
- 문·텔레포트·다인 공유 상호작용물은 문턱 걷기 애니 논쟁보다 먼저 줄·상호배제·강제 종료를 설계하라.
- 미션 변형은 구조체(또는 동등 데이터)로 맞추고 씬 트리를 복제하지 마라. 난이도는 곡선 샘플로, 10단계에서 선형 폭발시키지 마라.
- 솔로의 출구가 「협업 배우기」라면, 약점 직종의 산출을 자신만 고칠 수 있는 매직 넘버가 아니라 인수인계 가능한 인터페이스와 이름으로 만들어라.
시그널 위, 문 앞의 줄, Investigation 기입, 그리고 「solo development is a lot of work」. 포스트모템이 공개되고 게임이 itch에서 내려받을 수 있는 동안, 작가는 이미 감사 기준을 못 박았다. 질문은 「한 사람이 끝낼 수 있는가」가 아니라, 「끝낸 뒤 다음 협업에 필요한 디커플링을 저장소에 남겼는가」다.

출처와 더 읽기
Ben (RNG)(2026-09-10)Memento Manor - A Paranormal Postmortem Introspection
게임 페이지 Memento Manor(Windows / Linux, v1.0.0;No generative AI was used 표기)