모바일 게임을 만들어 보자
TL;DR
축구 육성 시뮬레이션 게임 개발기,
첫 30시 Godot vs Unity 비교,
Rust 연동(GDExtension),
Spec Kit 기반 명세서,
Claude Code · GPT-5 · Cursor AI 활용한 AI 게임 개발 파이프라인.
초보자도 따라할 수 있는 AI 기반 2D 게임 개발 기록
챗봇에게 코드 받아서 복붙하던 시절이 있었다. "이 에러 어떻게 고쳐?"를 하루에 백 번쯤 물어보던 그때. 그러다가 Claude Code를 만나고, Spec Kit을 배우고, 이제는 뭔가 진짜를 만들어보고 싶어졌다.
게임을 만들기로 했다. 왜 게임이냐고? 복순이도 만들었고, 주식 스크리너도 만들었는데, 이제 정말 앱스토어에 올릴 수 있는 뭔가를 만들고 싶었다. 돈을 벌 수 있는 거 말이다.
프린세스 메이커 아시는가? 딸 키우는 그 게임. 나는 그런 느낌으로 축구 선수를 키우는 게임을 만들기로 했다. 고등학교 3년 동안 훈련시켜서 프로 선수로 만드는 거다. 스포츠 게임 좋아하고, 육성 시뮬레이션도 좋아하니까 딱이다.
어제 아침에 시작했다. 커피 한 잔 내리고 터미널을 켰다. 그리고 GPT-5를 열었다.
"축구 선수 육성 게임 만들 건데, 프린세스 메이커 스타일로. 명세서 좀 짜줘."
20분쯤 지났을까. GPT-5가 15페이지짜리 명세서를 뱉어냈다. 52주 시스템, 12개 능력치, 훈련 종류, 경기 시뮬레이션, 심지어 감독 시스템까지. Spec Kit 스타일로 깔끔하게 정리되어 있었다.
이걸 들고 Claude Code한테 갔다.
"이 명세서대로 프로젝트 구조 만들어줘."
파일이 막 생기기 시작했다. project.godot, Cargo.toml, 폴더 구조... 눈 앞에서 프로젝트가 만들어지는 걸 보니 신기했다. 복붙할 필요가 없다는 게 이렇게 편한 거구나.
게임 엔진을 골라야 했다. Claude Code한테 물어봤다.
"게임 만들려는데 Unity랑 Godot 중에 뭐가 나아?"
모바일 게임 대부분이 Unity다. 원신, 폴가이즈, 어몽어스... 다 Unity다. 업계 표준이다. 취업하려면 Unity 필수다. Asset Store에 뭐든 다 있다. 좀비도 있고, 성도 있고, 총소리도 있다.
근데 6GB다. 무겁다. C# 배워야 한다. 최근에 Runtime Fee라고 게임 잘 되면 돈 내라는 정책으로 난리났다.
Godot은 또 뭐냐고?
100MB짜리 오픈소스다. 완전 무료다. MIT 라이선스라서 뭘 해도 된다. GDScript가 Python처럼 쉽다. 최근에 Unity 난리 나면서 사람들이 대거 이주했다. Pizza Tower, Brotato 같은 인디 게임들이 Godot으로 만들어졌다.
근데 Unity보다 자료가 적다. 큰 회사들은 안 쓴다. 3D는 Unity보다 약하다.
Unity가 뭐든 다 된다는데?
맞다. Unity가 기능은 압도적이다. 콘솔 게임도 되고, VR도 되고, 원신 같은 대작도 만들 수 있다. Asset Store에 뭐든 다 있고, 취업하려면 Unity 필수다.
근데 6GB다. Runtime Fee 논란도 있고. C# 배워야 하고. Rust? 지원 안 한다.
100MB다. 완전 무료다. GDScript가 Python처럼 쉽다. 2D 전용 엔진이라 2D는 Unity보다 낫다. Rust 공식 지원한다. GDExtension으로 바로 붙인다.
단점? Unity보다 자료 적고, 큰 회사는 안 쓴다.
2D 게임이면
내가 만들 건 2D 육성 시뮬이었다. 픽셀 그래픽에 버튼 몇 개. Godot이 2D에선 Unity보다 낫다더라. 2D 전용 노드가 있고, 2D 물리엔진이 내장되어 있다고. Unity는 3D 엔진인데 2D도 되는 거고, Godot은 2D를 제대로 지원한다고.
Rust 붙이기도 Godot이 쉬웠다
Unity는 C#이 기본이다. Rust? 공식 지원 없다. 억지로 붙이려면 C++ 래퍼 만들고 난리를 쳐야 한다.
Godot은? GDExtension이라고 공식 API가 있다. Rust 바인딩도 활발하다. "Godot-rust" 검색하니까 문서가 바로 나왔다.
결론: 기능은 Unity가 압도적이지만, 내가 필요한 건 Godot이다
내가 만들 건 2D 육성 시뮬이었다. Rust로 로직 짜고 싶었다. 30시간 안에 뭔가 만들어야 했다.
Unity는 전투기다. Godot은 경비행기다.
성능이 중요하다고 생각했다. Python으로 하면 느릴 것 같았다. 007에서 Rust 써봤으니까 이번에도 써보자 싶었다.
GDExtension이라는 걸로 Godot과 Rust를 연결한다더라. 뭔 소린지 몰랐지만 일단 해봤다. 에러가 산더미처럼 쏟아졌다.
Error: No module named godot Error: Cannot find lib.rs Error: Signal not found
4시간을 씨름했다. Claude Code가 하나씩 고쳐줬다. cargo add godot, cargo build --release... 명령어 하나하나가 생소했지만 따라했다.
그러다가 드디어 "GameCore initialized"라는 메시지가 떴다. 소리를 질렀다. "됐다!"
사실 처음부터 이렇게 물어봤다.
"Godot으로 게임 만들 건데, Rust 쓰면서 Spec Kit 스타일로 할 수 있어?"
GPT-5가 "당연히 가능합니다"라고 답했다. 나는 그게 기본인 줄 알았다.
Rust 쓴 김에 당연히 게임도 Rust로 해야지, 뭐.
Claude Code가 뚝딱뚝딱 설정해줬다.
GDExtension으로 연결하고, WorkerThreadPool로 비동기 처리하고, JSON으로 데이터 주고받고.
30시간 걸려서 다 만들었다. 꽤 뿌듯했다.
그런데 GPT-5한테 코드 리뷰 받으려고 파일을 보여줬더니:
"아, 백엔드와 프론트엔드가 완전히 분리되어 있네요? Godot=UI, Rust=로직 구조로 만드셨군요. 이건 중대형 프로젝트나 장기 유지보수를 고려한 아키텍처인데... 작은 게임에서는 보통 GDScript만 씁니다."
뭐라고?
"GDScript만으로도 다 할 수 있어요. 대부분 인디 게임은 그렇게 만들고요."
젠장.
나는 지금까지 뭘 한 거지? 굳이 Rust를 붙여가면서 FFI 경계 관리하고, JSON 직렬화하고, 타입 매핑하고...
그냥 GDScript로 짜면 되는 걸 Rust까지 동원해서 만든 거였다.
마치 동네 마트 가는데 페라리 몰고 가는 느낌이랄까. 편의점 알바생이 NASA 우주복 입고 일하는 느낌이랄까.
하지만 생각해보니, 이게 오히려 좋았던 것 같다.
첫째, 나는 "이게 어려운지" 몰랐으니까 그냥 했다. 알았으면 겁먹고 GDScript만 썼을 거다.
둘째, 덕분에 진짜 확장 가능한 구조가 됐다. GPT-5도 인정했다. "장기 유지보수나 성능이 중요한 팀이 주로 택하는 구조"라고.
셋째, 나중에 서버 연동이나 멀티플레이어 추가할 때 이 구조가 훨씬 유리하다더라. 로직이 이미 분리되어 있으니까.
무지가 만든 오버엔지니어링이 결과적으로는 베스트 프랙티스였던 셈이다.
"초보자의 행운"이라고 해야 하나? 아니면 "바이브 코딩의 역설"이라고 해야 하나?
어쨌든 30시간 만에 "중대형 프로젝트 아키텍처"를 구축한 셈이 됐다. 혼자였으면 불가능했을 텐데, AI가 "당연히 된다"고 해서 당연한 줄 알고 한 거다.
이게 바이브 코딩의 묘미인 것 같다. 뭐가 어려운지 모르니까, 그냥 한다. 그리고 가끔은 그게 오히려 더 좋은 결과를 낳는다.
GPT-5의 리뷰를 다시 읽어보니 이런 말도 있었다.
"이미 WorkerThreadPool, GDExtension, Resource 매핑까지 갖췄으니 정석에 가깝게 잘 가고 있어요."
그래, 모르고 한 게 정석이었다니.
코드는 Claude Code가 짜줬는데, UI가 영 별로였다. 버튼이 너무 작고, 글씨도 안 보이고. 그래서 Godot 에디터를 켰다. 마우스로 드래그해서 버튼을 키웠다. 글씨 크기도 조절했다. 색깔도 바꿨다.
이게 내가 한 일이다. 코드는 AI가 짜고, 나는 보기 좋게 만드는 거. 아트 디렉터가 된 기분이었다.
파스텔톤으로 색을 바꾸니까 갑자기 게임처럼 보이기 시작했다. 못생겼지만 내 게임이다.
오늘 아침에 일어나서 바로 작업을 계속했다.
어제는 기본 시스템만 만들었으니까 오늘은 진짜 게임다운 걸 넣어야 했다.
52주 시스템을 만들었다. 봄학기 20주, 여름방학 7주, 가을학기 20주, 겨울방학 6주. 학사 일정을 짜는 게 이렇게 복잡한 줄 몰랐다.
AI 선수도 만들었다.
상대 팀 선수들 말이다. 포지션별로 능력치를 다르게 주고, 학년이 올라갈수록 강해지게 했다.
감독 시스템도 넣었다. 구아르디올라 패러디로 "페팔도마에다"라는 감독을 만들었다. 무리뉴는 "무르친글로"가 됐다. 이름 짓는 게 은근 재밌더라.
Cursor AI를 켜서 전체 코드를 리뷰했다. "중복 코드 156줄 발견"이라고 떴다. 자동으로 리팩토링해줬다. 코드가 30% 줄었다.
30시간이 지났다. 지금 내 앞에 있는 건 게임이라고 부르기엔 민망한 뭔가다.
돌아가긴 한다. 선수를 만들고, 훈련시키고, 스탯이 오르고, 날짜가 지나간다. 52주 시스템도 작동한다. AI 선수들과 경기도 할 수 있다. 세이브도 되고 로드도 된다.
하지만 그래픽은 프로토타입 수준이다. 사운드는 아예 없다. 애니메이션도 없고, 튜토리얼도 없다. 밸런스도 엉망이다. 앱스토어에 올릴 수 있냐고? 절대 아니다.
그래도 뭔가를 만들었다. 30시간 전에는 아무것도 없었는데, 지금은 뭔가가 있다. 못생기고 덜 만들어졌지만, 게임이 있다.
혼자서는 못 만들었을 거다. ChatGPT 하나만 썼어도 2주는 걸렸을 거다. 복붙하고, 에러 고치고, 또 복붙하고...
GPT-5가 설계를 했다. 큰 그림을 그렸다. 이런 시스템이 필요하고, 이렇게 연결하고, 이런 구조로 가자고.
Claude Code가 실제로 만들었다. 파일을 생성하고, 코드를 짜고, 실행해서 확인했다. 내가 복붙할 필요가 없었다.
Cursor AI가 정리했다. 중복을 제거하고, 버그를 찾고, 최적화했다. 전체 코드를 한 번에 보면서 문제를 찾아냈다.
이 셋이 각자의 역할을 했다. 나는 방향만 제시했다. "축구 게임", "파스텔톤", "버튼 크게". 그게 내가 한 전부다.
지금 내 앞에 있는 건 게임이라고 부르기엔 민망한 뭔가다.
UI? 없다. 그냥 텍스트만 주르륵 나온다.
BGM? 없다. 무음이다.
스토리? 없다. 그냥 숫자가 오르내린다.
경기? 아직 못한다. 훈련만 시킬 수 있다.
선수를 만들고, 능력치 12개를 보고, 훈련 메뉴를 고르면 스탯이 오른다. 그게 전부다.
이게 게임인가? 아니다.
뼈대? 그것도 아니다.
그냥... 뼈대의 설계도? 뼈대의 스케치 정도랄까.
그런데 꽤나 만족스럽다.
30시간 전에는 아무것도 없었다. 게임이 뭔지도 몰랐다. Godot이 뭔지도 몰랐다. Rust로 게임을 만들 수 있는지도 몰랐다.
지금은 뭔가가 있다. 못생기고, 초라하고, 게임이라고 부르기도 민망하지만, 존재한다.
버튼을 누르면 뭔가 일어난다. 숫자가 바뀐다. 날짜가 지나간다. 선수가 성장한다.
이게 시작이다.
프로토타입까지 며칠이 더 걸릴지 모르겠다.
앱스토어 출시까지는 2-3개월은 걸릴 것 같다.
수익이 날지는 더더욱 모르겠다.
하지만 당분간은 이 녀석을 붙잡고 매일 조금씩 만들어볼 생각이다.
내일은 경기 시스템을 넣을 거다. 숫자만 나와도 상관없다.
모레는 이벤트를 하나 넣을 거다. 텍스트 3줄이어도 괜찮다.
그 다음엔 UI를 하나씩 붙일 거다. 못생겨도 된다.
목표는 명확하다. 앱스토어에 올리기. 내가 만든 게임을 판매하기.
$0.99라도 좋다. 한 명이라도 사주면 된다.
"내가 만든 게임을 누군가 돈 주고 샀다"
그 한 줄을 위해서.
30시간 만에 게임을 만들었다고?
거짓말이다. 30시간 만에 나온 건 게임이 아니다.
게임의 씨앗, 게임의 가능성, 게임이 될 수도 있는 뭔가다.
하지만 그게 중요하다.
씨앗이 있어야 나무가 되고,
가능성이 있어야 현실이 되고,
뭔가가 있어야 게임이 된다.
바이브 코딩은 완성을 약속하지 않는다.
시작을 약속할 뿐이다.
그리고 시작했으면, 이제 계속해야 한다.
이게 내가 30시간 동안 겪은 이야기다.
게임을 만들었다? 아니다.
게임이 될 뭔가를 만들었다.
그리고 그걸 계속 만들어갈 용기를 얻었다.
당신도 이번 주말에 시작해보시라.
월요일엔 게임은 없어도, 게임이 될 뭔가는 있을 거다.
그거면 충분하다. 시작이니까.