Claude Code로 Godot 게임 장면 만들기: 방공 게임과 협곡 비행 게임 제작 기록
Godot 4.7.2와 Claude Code로 방공 미니 게임, 페널티킥 승부차기, 협곡 비행 게임을 만든 실제 기록을 바탕으로 준비물, 첫 계획서, Blender 모델 옮기기, 자동 확인, 직접 해 보고 고치는 순서와 걸린 곳을 정리합니다.
한국어English
기준: Godot 4.7.2(표준판, Windows), Claude Code, Blender 5.2. 2026년 10월에 만든 기록이고, 명령줄 옵션은 Godot 4.7 공식 문서로 확인했습니다. 그림은 모두 실제 게임 화면과 Godot·Blender 화면입니다.
2026년 10월 10일 밤, Claude Code에게 Godot로 작은 방공 게임을 만들어 달라고 했더니 약 1시간 만에 돌아가는 첫 판이 나왔습니다. 같은 세션 안에 리깅한 캐릭터를 옮기는 시험과 페널티킥 승부차기까지 끝냈고, 사흘 뒤에는 협곡을 나는 비행 게임을 한 세션에 계획에서 한 판 완성까지 만들었습니다. 코드는 모두 Claude Code가 썼고, 저는 무엇을 만들지 정하고 직접 해 본 뒤 고칠 점을 말했습니다.
이 글은 그 두 번의 작업 기록을 따라 하기 쉬운 순서로 다시 정리한 것입니다. 무엇을 준비했는지, 첫 계획서에 무엇을 적었는지, Blender 모델을 옮길 때 어디서 걸렸는지, AI가 만든 게임을 어떻게 확인했는지, 그리고 제가 직접 해 보며 몇 번 고쳤는지를 차례로 적었습니다. 이 글에서는 Claude Code와 Godot로 게임 한 장면을 만드는 작업 순서와, 그 순서에서 실제로 걸린 곳을 설명합니다.
1. 결론 먼저
| 궁금한 것 | 제 기록 |
|---|---|
| 첫 판까지 걸린 시간 | 방공 게임 약 1시간 |
| 한 세션에 만든 것 | 방공 게임, 리깅 캐릭터 옮기기 시험, 페널티킥 승부차기(합계 약 3시간, 기다린 시간 포함) |
| 그 밖에 든 돈 | 없음. Godot는 무료이고, 그림·영상 생성 크레딧은 쓰지 않음 |
| Claude Code 사용량 | 리깅 시험 직후까지 출력 토큰 약 16만, 비용 환산 약 11달러(사용량 집계 도구로 잼, 그 뒤는 재지 않음) |
| 쓴 용량 | 게임 폴더 252 MB |
| 모델이 그대로 들어왔나 | 모델 8개 모두 Blender와 치수 차이 0 |
| 리깅 캐릭터의 동작 | 넘어옴. 자세 차이 최대 1.4 mm |
| 가장 오래 걸린 것 | 코드가 아니라 제가 직접 해 보고 고칠 점을 말하는 시간. 방공 게임은 다섯 번 해 본 뒤에 "난이도 적당함"이 됨 |
| 협곡 비행 게임 | 한 세션에 계획 → 4단계 → Windows·웹 판 내보내기. 자동 확인 18/18 |
AI가 잘한 일은 코드를 쓰고, 고치고, 스스로 확인하는 일이었습니다. 제가 해야 했던 일은 무엇을 만들지 정하고, 직접 해 보고, 느낌을 한두 문장으로 말하는 일이었습니다.
2. Godot가 AI와 잘 맞았던 까닭
Godot는 무료 오픈 소스 게임 엔진입니다. 게임 엔진은 그림 그리기, 물리, 소리, 입력 처리 같은 게임의 공통 부품을 미리 갖춘 작업대라고 보면 됩니다. 목수가 톱과 망치를 매번 만들지 않듯, 게임을 만들 때 그 부품을 다시 만들지 않게 해 줍니다.
Claude Code와 함께 쓰기 좋았던 까닭은 두 가지였습니다.
- 장면과 스크립트가 글자 파일입니다. Godot의 장면 파일(
.tscn)과 스크립트(.gd)는 메모장으로 열 수 있는 글자입니다. 그래서 AI가 마우스로 편집기를 누르지 않고 파일을 직접 쓰고 고칠 수 있었습니다. 방공 게임의 장면 파일은 노드 하나에 스크립트 하나를 붙인 몇 줄짜리이고, 지형·하늘·발사대 배치는 모두 스크립트가 코드로 만들었습니다. - 창 없이 실행할 수 있습니다.
--headless는 화면과 소리 장치 없이 엔진을 실행하는 옵션입니다. AI가 게임을 만든 뒤 창을 띄우지 않고 자동 확인 스크립트를 돌려 "발사하면 미사일이 나오는가" 같은 규칙을 스스로 확인할 수 있었습니다.
반대로 화면 캡처와 녹화는 창이 떠야 해서, 그때마다 제 화면에 게임 창이 잠깐 떴습니다.
3. 준비물
시작 상태: Claude Code를 설치하고 로그인한 상태에서 시작합니다. 설치는 Claude Code 입문에 있습니다.
따라 하기:
- Godot 공식 사이트에서 Windows용 표준판(Standard)을 받습니다. 제 기록에서는 4.7.2 표준판을 받아 압축을 풀었고, 따로 설치하지 않았습니다.
- 게임을 만들 빈 폴더를 하나 만듭니다. 이 폴더가 Godot 프로젝트 폴더가 됩니다.
- 게임에 쓸 Blender 모델이 있다면 어디에 있는지 적어 둡니다. 저는 앞서 영상용으로 만든 로우폴리 모델 8개를 썼습니다.
- Claude Code를 그 폴더에서 실행합니다.
Godot 실행 파일은 두 가지가 들어 있습니다. 이름 끝에 _console이 붙은 쪽은 실행 중 메시지를 터미널에 보여 줍니다. AI가 자동 확인을 돌리고 결과를 읽을 때는 이쪽을 씁니다.
4. 첫 계획서 한 장
코드를 시키기 전에 계획서(PRD)를 한 장 쓰게 했습니다. PRD는 무엇을 왜 만들고, 어디까지 되면 끝인지 적은 문서입니다. 집을 짓기 전에 그리는 평면도와 같습니다. 평면도 없이 지으면 방이 하나씩 늘어나듯, 계획서 없이 시키면 AI도 기능을 계속 덧붙입니다.
제 방공 게임 계획서에는 아래가 들어 있었습니다.
| 항목 | 적은 내용 |
|---|---|
| 왜 하는가 | 세 가지 질문: 우리 모델이 깨끗하게 들어가는가, AI만으로 돌아가는 게임이 나오는가, 시간과 용량은 얼마나 드는가 |
| 합격 기준 | 모델의 크기·방향·색이 맞을 것, 한 판이 시작 → 진행 → 끝 → 다시 시작까지 될 것, 걸린 시간과 용량을 잴 것 |
| 범위 밖 | 설치 파일, 메뉴·설정 화면, 여러 스테이지, 온라인, 모바일 |
| 게임 규칙 | 시점, 조작, 미사일 수, 무인기 수와 속도, 승패 조건 |
| 쓸 모델 | 폴더 이름, 치수, 움직일 부품 이름 |
| 이름 규칙 | 실제 장비 이름 대신 "미사일", "발사대", "무인기" 같은 일반 이름 |
계획서를 쓰게 할 때는 이런 식으로 적으면 됩니다(예).
Godot 4.7로 2~3분짜리 게임 한 장면을 만들려고 해. 코드를 쓰기 전에 PRD.md를 먼저 써 줘.
- 이 시험이 답할 질문 3개, 합격 기준(확인 방법 포함), 범위 밖인 것
- 게임 규칙 표(시점, 조작, 승패)
- 쓸 모델: <모델 폴더 경로>의 모델들. 크기와 부품 이름은 파일을 열어 확인해서 적어 줘
PRD를 내가 읽고 "진행"이라고 하기 전에는 코드를 쓰지 마.
저는 계획서를 읽고 "제안대로 한다"고 답했습니다. 이 한 장이 있어서 뒤에 규칙을 바꿀 때도 "계획서 2절의 무엇을 바꾼다"로 말할 수 있었습니다.
5. Blender 모델 옮기기
시작 상태: 계획서가 정해지고, 모델 폴더 경로를 AI에게 알려 준 상태에서 이어 갑니다.
따라 하기:
- AI에게 Blender 모델을 glTF(
.glb)로 내보내는 스크립트를 쓰게 합니다. Blender는 화면 없이(백그라운드로) 실행해도 됩니다. - Godot에서 모델을 띄운 화면과 Blender 그림을 나란히 놓은 비교 그림을 만들게 합니다(그림 1).
- 치수를 숫자로도 견주게 합니다. 눈으로만 보면 크기가 조금 다른 것을 놓칩니다.
glTF는 3D 모델을 주고받는 공개 파일 형식입니다. Godot는 glTF를 권장 형식으로 꼽습니다. 내보내기 설정 하나하나는 Blender 모델을 Godot 4.7로 옮기기에 따로 정리했습니다.
그림 1. 같은 발사대 모델. 왼쪽 Godot, 오른쪽 Blender. 모델 8개 모두 이렇게 견준 뒤 치수 차이 0을 확인했습니다 (Godot·Blender 화면)
모델 8개는 모두 치수 차이 0으로 들어왔고, 부품 이름과 부모·자식 관계도 그대로였습니다. 다만 앞쪽 방향이 바뀝니다. Blender에서 앞(+Y)이던 쪽이 Godot에서는 −Z가 됩니다. Godot는 위가 +Y인 좌표계를 쓰기 때문입니다.
실제로 걸린 곳은 다섯 군데였습니다. 모두 AI가 내보내기 스크립트에 처리를 넣어 해결했습니다.
| 걸린 곳 | 보인 증상 | 해결 |
|---|---|---|
| 노드로 연결한 색 | 전차 색이 빠짐 | 내보낼 때 노드 색을 기본 색으로 옮기기 |
| 영상용 스튜디오 바닥·조명 | 모델과 함께 바닥 판과 조명이 따라 나감 | 내보낼 때 빼기 |
| 장면에 연결되지 않은 컬렉션 | 빈 파일이 나옴 | 내보내기 전에 장면에 연결하기 |
| 노드 묶음으로 만든 재질 | 캐릭터가 온통 흰색 | 묶음의 기본 색으로 단순한 재질을 새로 만들기 |
| 뼈 동작과 표정 동작 | 두 동작이 따로 나와 하나만 재생 | 내보내기 옵션으로 하나로 합치기 |
마지막 두 줄은 리깅 캐릭터를 옮길 때 나왔습니다(8절). 셋째 줄처럼 "오류 없이 빈 파일"이 나오는 경우가 가장 헷갈렸습니다. 내보낸 파일 크기가 너무 작으면 먼저 의심해 보세요.
6. 첫 판, 그리고 다섯 번 고치기
시작 상태: 모델이 Godot 프로젝트에 들어온 상태에서 이어 갑니다.
따라 하기:
- 계획서의 규칙대로 첫 판을 만들게 합니다.
- 실행용 배치 파일(
run_game.bat)을 만들게 하고, 직접 한 판 해 봅니다. - 해 보고 느낀 점을 한두 문장으로 말합니다. 고칠 값은 숫자로 말할수록 빨리 맞춰집니다.
- 바뀐 규칙은 계획서에도 고쳐 적게 합니다.
첫 판은 약 1시간 만에 나왔습니다. 그 뒤로 제가 다섯 번 해 보며 한 말과 바뀐 것은 아래와 같습니다.
| 회차 | 제가 한 말 | 바뀐 것 |
|---|---|---|
| 1 | "너무 쉬움. 100% 요격되고 계속 재장전이 돼서" | 재장전 없앰, 무인기 32대가 이어서 옴 |
| 2 | "궤도가 진짜 같이. 동시에 생성. 조준 세 칸 100·90·80%. 카메라 가까이" | 수직으로 솟았다가 호를 그리는 궤도, 2~4대 동시 등장, 세 겹 조준 원 |
| 3 | "생성 간격 2배 빠르게. 발사대당 1번 맞으면 끝" | 등장 간격 2.5초 → 1.7초, 발사대가 한 번에 파괴 |
| 4 | "다른 발사대로 방향 바꾸게. 가까이 오면 너무 큼. 50% 멀리" | 표적 바꾸기, 거리에 따라 크기 줄이기, 등장 거리 1,500 m |
| 5 | "난이도 적당함. 점수만 없애자" | 점수 표시 지움. 규칙 확정 |
그림 2. 다섯 번 고친 뒤의 방공 게임. ① 남은 발사대·미사일 ② 남은 무인기 ③ 세 겹 조준 원과 명중률 (Godot 실행 화면)
자동으로 플레이하게 해서는 난이도를 알 수 없었습니다. "쉽다", "적당하다"는 사람이 직접 해 봐야 나오는 말이었습니다. 화면에 숫자가 많은 것도 제게는 거슬렸습니다. 그래서 점수를 빼고 "4대 막는 것만 보여 주면 된다"고 했습니다.
7. AI가 스스로 확인하게 하기
시작 상태: 앞 절의 게임이 돌아가는 상태에서 이어 갑니다.
따라 하기:
- 규칙마다 확인 항목을 하나씩 만든 자동 확인 스크립트를 쓰게 합니다.
- 규칙을 고칠 때마다 이 확인을 다시 돌리게 합니다.
- 결과에 FAIL이 있으면 그 줄을 AI에게 그대로 보여 주고 고치게 합니다.
방공 게임의 확인은 아래 한 줄로 돌립니다. --path는 프로젝트 폴더(project.godot이 있는 폴더)를 고르는 옵션이고, -- 뒤의 글자는 엔진이 쓰지 않고 게임 스크립트가 읽는 값입니다(공식 문서).
Godot_v4.7.2-stable_win64_console.exe --headless --path <프로젝트 폴더> -- --autotest
이 글을 쓰며 같은 명령을 다시 돌려 본 출력의 일부입니다.
[autotest] PASS 1 발사하면 미사일이 나온다 남은 미사일 31
[autotest] PASS 2 무인기 한 대가 닿으면 발사대 하나가 파괴된다 4 -> 3
[autotest] PASS 파괴된 발사대를 노리던 무인기는 다른 발사대로 방향을 바꾼다
[autotest] PASS 무인기는 멀리서 크게, 가까이서 작게 그려진다 멀리 14.0배, 가까이 3.2배
[autotest] PASS 조준 세 칸: 100% / 90% / 80% / 밖은 0%
[autotest] PASS 무인기가 한 번에 2~4대 나온다 3대
[autotest] PASS 재장전 없음: 남은 미사일을 다 쓰면 더 안 나간다 발사 30
[autotest] 14/14 passed
제 PC에서 이 확인은 15초쯤 걸렸습니다. 사람이 한 판(약 40초)을 하는 것보다 짧고, 창도 뜨지 않습니다.
확인 항목은 계획서의 규칙과 한 줄씩 짝이 맞습니다. 규칙을 바꾸면 확인도 같이 바꾸게 했습니다. 이렇게 해 두면 새 규칙을 넣다가 앞서 정한 규칙(예: "발사대 한 번에 파괴")이 깨져도, 제가 해 보기 전에 확인 단계에서 FAIL로 드러납니다.
8. 리깅 캐릭터와 페널티킥
방공 게임 다음에는 사람 캐릭터가 동작째로 넘어가는지 시험했습니다. 앞서 축구 영상용으로 만든 공격수와 골키퍼, 공을 썼습니다. 뼈대(리그)와 10초짜리 동작은 Blender에서 직접 만든 것이고, Mixamo는 쓰지 않았습니다.
리깅은 모델 안에 뼈대를 넣어 움직일 수 있게 하는 작업입니다. 인형 안에 철사 뼈대를 넣는 것과 비슷합니다.
그림 3. Godot에서 재생한 리깅 캐릭터의 동작. 왼쪽부터 차기 직후, 세리머니 시작, 두 팔 들기 (Godot 실행 화면)
| 확인한 것 | 결과 |
|---|---|
| 뼈대 | 움직임을 만드는 뼈 17개와 동작 하나(9.97초)가 들어옴. 조종용 뼈 9개는 빠지고 움직임은 남은 뼈에 구워짐 |
| 자세 | 뼈 6개 × 프레임 7개를 Blender와 견줌. 가장 큰 차이 1.4 mm |
| 표정 | 표정 모양(shape key) 8개가 동작에 같이 들어옴 |
| 재생 | 2배속, 멈춤, 구간만 재생 모두 됨 |
이 시험은 약 20분 걸렸습니다. 내친김에 이 캐릭터로 페널티킥 승부차기를 만들게 했고, 약 30분 걸렸습니다. 컴퓨터와 번갈아 다섯 번씩 차고 막는 확률 싸움입니다.
그림 4. 페널티킥 승부차기. ① 내가 찰 차례 ② 컴퓨터가 찰 차례. 차례마다 옷 색과 머리 위 이름표가 바뀝니다 (Godot 실행 화면)
처음 판에는 확률이 화면에 보였고, 두 편의 캐릭터가 똑같았습니다. 해 보니 둘 다 어색해서 "확률이 나오니까 이상함", "캐릭터가 동일해서 이상함"이라고 말했고, 다음 판에서 확률을 숨기고 편마다 옷 색과 이름표를 나눴습니다(그림 4).
9. 두 번째 게임: 협곡 비행
사흘 뒤인 10월 13일에는 협곡을 빠르게 나는 비행 게임을 만들었습니다. 이번에는 처음부터 단계를 나눠 계획하고, 단계마다 제가 해 본 뒤 다음 단계로 넘어갔습니다.
| 단계 | 만든 것 | 제가 한 말 |
|---|---|---|
| 첫 판 | 협곡, 다리, 미사일, 플레어, Windows·웹 내보내기 | "난이도 적당, 막 만든 느낌" |
| A | 이어지는 S자 협곡, 엔진 불꽃 | "더 심하게, 줄이지 않으면 못 지나가게" |
| A 2회차 | 급굽이 묶음 셋, 날개 끝 바람 띠 | 통과 |
| B | 뒤에서 쫓아오는 미사일, 타이밍 고리, 롤 | "쫓아오는 느낌 약함" |
| C | 폭격과 결과 카드 | "기둥 조준 이해 안 됨, 미사일 쏘듯이" |
| C 2회차 | 기수를 맞추고 곧게 날면 조준이 조여지는 방식 | "조여지는 느낌 맞음" |
| D | 처음 화면, 카운트다운, 이어하기, 소리, 한글 글꼴 | "게임답긴 함" |
그림 5. 협곡 비행 게임의 자동 비행 화면. ① 다리 밑을 지난 순간 ② 뒤에서 오는 미사일을 피할 때를 알려 주는 노란 고리 (Godot 실행 화면)
따라 하기: 그림 5와 같은 화면은 사람이 조종하지 않고 녹화할 수 있습니다. --write-movie는 영상 파일을 쓰며 실행하는 옵션이고, --fixed-fps로 초당 장면 수를 정합니다. 저는 게임에 자동 비행 모드(--autoplay)를 넣게 한 뒤 아래처럼 30초(900장면)만 녹화했습니다. 이때는 창이 뜹니다.
Godot_v4.7.2-stable_win64_console.exe --path <프로젝트 폴더> --write-movie <저장할 경로>\flight.avi --fixed-fps 30 --quit-after 900 -- --autoplay
이 게임도 자동 확인을 18개 두었고, 내보낸 Windows 실행 파일로 돌려도 18/18이 나왔습니다. 확인 스크립트는 속도를 고정한 자동 비행도 몇 번 해 봅니다. 이 글을 쓰며 다시 돌려 보니 아래처럼 나왔습니다.
[autotest] 참고 자동 비행 170 m/s: 시간 초과 / 74.0초 / 진행 85% / 벽까지 최소 15m
[autotest] 참고 자동 비행 190 m/s: 벽에 부딪혔다 / 63.9초 / 진행 83% / 벽까지 최소 -48m
[autotest] PASS 1 굽이 앞에서 줄이며 날고 폭격까지 하면 별 셋 임무 완료 / 65.1초 / 진행 100% / 벽까지 최소 12m / 빗나간 거리 0m
[autotest] PASS 14 줄이지 않으면(230 고정) 급한 굽이를 못 돈다 벽에 부딪혔다 / 24.9초 / 진행 42% / 벽까지 최소 -43m
[autotest] 18/18 passed
"속도를 줄이지 않으면 못 지나가게"라는 제 말이 실제로 지켜졌는지를 숫자로 보여 주는 줄입니다. 느리면 시간이 모자라고, 빠른 속도로 고정하면 벽에 부딪히고, 굽이 앞에서 줄여야만 끝까지 갑니다. 제 PC에서 이 확인은 약 1분 30초 걸렸습니다. 내보낸 파일 크기는 Windows 판 107 MB, 웹 판 40 MB였습니다. 내보내기에는 Godot의 내보내기 템플릿이 따로 필요하고, 받은 원본이 1.2 GB였습니다.
웹 판은 제가 해 보니 한글은 제대로 나왔지만 렉이 있었습니다. 원인은 아직 찾지 못했습니다. 웹 판에서 한글이 나오게 하려면 글꼴을 게임 안에 넣어야 했습니다. 브라우저 안의 게임은 PC에 깔린 글꼴을 쓰지 못하기 때문입니다. 자유 이용 글꼴에서 한글 2,350자만 골라 줄인 글꼴(424 KB)을 넣었습니다.
10. 따라 할 때의 순서
두 게임을 만들며 굳어진 순서입니다.
- 계획서 한 장을 먼저 씁니다. 질문, 합격 기준, 범위 밖을 적게 하고, 읽고 "진행"이라고 하기 전에는 코드를 쓰지 않게 합니다.
- 모델은 숫자로 견줍니다. 비교 그림과 치수 표를 함께 받습니다.
- 첫 판을 빨리 받습니다. 처음부터 완성도를 바라지 말고 한 판이 돌아가는 것부터 봅니다.
- 직접 해 보고 한두 문장으로 말합니다. "더 어렵게"보다 "간격 2배 빠르게"가 빨리 맞춰집니다.
- 규칙마다 자동 확인을 둡니다. 고칠 때마다 AI가 다시 돌리게 합니다.
- 단계를 나눕니다. 협곡 게임처럼 A·B·C·D로 나누고 단계마다 직접 해 본 뒤 넘어갑니다.
자주 하는 실수와 해결
| 증상 | 까닭 | 해결 |
|---|---|---|
| 처음 실행하면 "no main scene" 오류 창이 뜬다 | 프로젝트의 첫 장면이 지정되지 않음 | 프로젝트 설정에서 첫 장면을 지정하게 하기 |
| 내보낸 모델 파일이 텅 비어 있다 | 컬렉션이 장면에 연결되지 않음 | 내보내기 전에 장면에 연결하는 단계 넣기 |
| 캐릭터가 온통 흰색이다 | 노드 묶음 재질을 glTF가 읽지 못함 | 기본 색으로 단순한 재질을 다시 만들어 내보내기 |
| 새 클래스 이름을 넣었더니 스크립트 오류가 난다 | 새 class_name이 아직 등록되지 않음 | --import로 한 번 열었다 닫기(편집기를 켜서 가져오기를 마치고 끝내는 옵션) |
Plane이라는 이름의 클래스를 만들 수 없다 | Godot에 같은 이름이 이미 있음 | 다른 이름(예: jet) 쓰기 |
| 웹 판에서 한글이 네모로 나온다 | 브라우저 안 게임은 PC 글꼴을 못 씀 | 자유 이용 글꼴을 게임에 넣기 |
| 배치 파일 경로가 깨진다 | 셸에서 글자를 넣다 \t 같은 글자가 바뀜 | 배치 파일은 셸 명령이 아니라 파일 쓰기로 만들게 하기 |
한 줄 정리
계획서 먼저, 모델은 숫자로 견주기, 첫 판은 빨리, 직접 해 보고 한두 문장, 규칙마다 자동 확인(--headless), 단계별로 넘어가기.
참고 자료
- Godot Engine 4.7 문서, Command line tutorial: https://docs.godotengine.org/en/stable/tutorials/editor/command_line_tutorial.html
- Godot Engine 다운로드: https://godotengine.org/download/
- Claude Code 문서: https://code.claude.com/docs/en/overview
- 이 사이트의 관련 글: Blender 모델을 Godot 4.7로 옮기기, 게임 엔진 고르기 2026
- 그림: 모두 실제 Godot 실행 화면과 Blender 그림(직접 만든 시험 게임)





