DAY 01작업 1일째

그림체를 고르고 전투를 로직과 화면으로 나눴다

혼자 만드는 액션 RPG라 그림은 생성 모델에 맡기고, 전투는 노드 없는 로직층과 연출만 맡는 화면층으로 나눠 시작했다.

벨트스크롤 액션 RPG를 만들려면 캐릭터 그림이 많이 필요한데 혼자서는 그릴 수 없다. 그래서 첫날 두 가지를 먼저 정했다. 그림을 어떤 모델과 그림체로 뽑을지, 그리고 그림이 계속 바뀌어도 흔들리지 않는 전투 구조를 어떻게 짤지였다.

그림체를 시트 한 장으로 골랐다

캐릭터는 프레임 애니메이션 없이 동작마다 그림 한 장만 쓰기로 했다. 종이 인형이라 원래 그렇게 움직인다는 설정으로 한계를 개성으로 돌렸고, 생동감은 관성, 스쿼시, 카메라 흔들림, 히트스톱 같은 코드 연출이 맡는다. 그러면 필요한 건 같은 캐릭터를 여러 포즈로 일관되게 뽑는 능력이었다.

로컬 ComfyUI에서 Qwen Image 2.1과 SDXL 계열 모델로 애니메, 카툰, 페이퍼크래프트, 동화책 네 가지 그림체를 시드 두 개씩 뽑았다. 결과는 배경을 지우고 흰 종이 테두리를 둘러 간이 무대 위에 세운 비교 시트로 만들어 나란히 봤다.

그림체 비교 시트
같은 검사를 그림체와 모델별로 뽑아 종이 테두리를 둘러 세웠다

Qwen 2.1의 카툰풍으로 정했다. 생성이 빠르고, 참고 그림을 넣는 편집으로 같은 캐릭터를 다른 포즈로 바꿀 수 있고, 모델 하나로 다 해결된다. 프롬프트에서 몇 가지를 배웠다. cfg를 1.0으로 돌려서 네거티브 프롬프트가 무시되니, 빼고 싶은 요소는 "single character"처럼 긍정문에 직접 써야 했다. 페이퍼크래프트 그림체는 키워드 나열로 두 번 실패하고 문장으로 풀어 쓰자 나왔다.

로직과 화면을 완전히 나눴다

전투는 세 층으로 나눴다. 입력층은 키보드를 이동, 공격, 점프, 스킬 같은 명령으로 바꾼다. 로직층은 노드를 쓰지 않는 순수 GDScript로 1초에 60틱씩 고정해서 돌고, 맞음, 쓰러짐, 착지 같은 사건만 이벤트로 알린다. 화면층은 그 상태와 이벤트를 받아 종이 인형, 카메라, 이펙트, 소리로 연출한다.

입력 → 명령 → [로직: 60틱 고정, 노드 없음] → 상태 + 이벤트 → [화면: 연출]

이렇게 나눈 이유는 세 가지였다. 명령만 넣으면 로직이 돌아가니 화면 없이 자동으로 테스트하고 자동 플레이를 돌릴 수 있다. 연출을 갈아엎어도 판정과 수치는 그대로다. 나중에 멀티를 붙일 때도 명령만 주고받으면 된다. 로직의 난수는 모두 시드가 있는 전용 난수기를 써서, 같은 입력이면 같은 결과가 나오게 했다.

판정은 좌우 x, 깊이 z, 높이 y 세 축을 쓴다. 공격 상자에 깊이 범위가 있어서 같은 줄 근처에 있어야 맞고, 이동은 물리 엔진에 맡기지 않고 가속도와 마찰로 직접 계산했다.

전투 샌드박스
2D로 바꾼 뒤의 전투 샌드박스. 콤보, 회전베기, 띄우기, 다운을 확인했다

스킬 이펙트도 종이로

스킬 이펙트를 빛나는 그림 한 장을 키웠다 줄였다 하는 방식으로 먼저 만들었는데, 종이 인형 옆에 두니 따로 놀았다. 파이어볼을 기준으로 다시 정했다. 캐릭터와 같은 카툰 그림체로 그림 두세 장을 뽑아 종이 테두리를 두르고, 1초에 8~12번 바꿔 끼워 종이 인형극처럼 보이게 했다. 흰 테두리를 두른 종이 조각 파티클을 같이 날린다.

감수한 것

동작마다 그림 한 장이라 걷기나 공격이 부드럽게 이어지지는 않는다. 그 빈자리를 코드 연출이 얼마나 메울 수 있는지가 계속 숙제로 남는다. 그림체는 카툰으로 정했지만, 게임은 포즈 그림과 기준점 파일만 읽게 만들어서 나중에 바꿔도 코드는 그대로다.

기록 #01 · 2026.09.27