음. 그래요. 2주 줄테니까 게임 만들어오세요.
구미가 당기는 해커톤을 봤다. 근데, 너무 늦게.
요즘 너무 바쁘다.
주주도 업데이트 일정이 다가오는데, 작업은 다 미뤄두고… 운동도 못가고, 블로그 글도 얼마만에 쓰는 지 모르겠다.
사실 이 글도 웬만하면 한 이틀까지는 미루려고 했으나… 더 이상은 글 쓰는 걸 미뤘다가는 영원히 미룰 거 같아서 끄적이러 왔다.
요즘 주주 때문에 평소보다 인스타를 5배는 더 많이 들어간다.
근데 또 SNS라는게, 들어가서 할 일만 하고 나오는게 안되는 구조라서.. 릴스도 몇 개 본다.
그러다가 NHN에서 AI 게임 개발 해커톤을 연다는 광고를 봐버렸다.
솔직히 솔깃했다.
마침 AI로 게임 개발 파이프라인이 어디까지 자동화가 되고, 또 어디까지 AI가 건들 수 있는 지 궁금하기도 하고 또 자랑은 아니지만 회사 다니면서 말아먹은 사이드 프로젝트 게임 개발이 꽤나 있어서…ㅋㅋ
내가 꽤나 자신 있는 영역에서 대회가 열린다길래…
참가하려고 마음을 먹었다.
기간
근데 문제가.. 내가 이 광고를 본 게 7월 23일이고, 사전 과제까지 다 끝낸 뒤에 참가 신청을 하는게 8월 10일까지다.
즉. 나는 18일이라는 기간 안에
사전 과제로 제출할 게임을
- 기획
- 에셋 준비
- 구현
- 음악 삽입
- 튜토리얼
- 데모 플레이 영상
- README 작성
- 기술문서
를 준비해야 한다.
ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ
아. 혼자 가능한가..?
그래서 마침 출근하는 날이여서 사무실 막내를 살살 꼬셨다. 같이 하자고.
막내도 내 기획을 듣더니 괜찮았는지 OK를 했고, 그렇게 사전 과제 준비를 시작했다.
어?
근데, 한창 기획 후에 AI 파이프라인을 구축하기 위한 MVP를 테스트 하던 도중 일요일 새벽 2시 반에 막내에게 장문의 디스코드 메시지가 왔다.
졸려 죽겠는 상태였는데, 잠이 다 달아나는 내용이었다.
결론은 “함께 할 수 없을 거 같습니다.” 였다.
뭐, 늘 그렇듯 1인 제작
사실 기간 압박이 있어서 막내를 꼬셨지만, 난 늘 팀플레이는 잘 못해서… 차라리 잘 됐을지도 모른다.
같이 템포를 맞춘다는 것과 내가 생각하는 구현의 방향과 팀원의 방향을 맞추려면 꽤나 높은 수준의 기획 문서가 필요하고 둘이 개발 하기 위해 그 문서 작업 + 시간 맞춰 회의하는 것 보다..
요즘은 AI 써서 1인 개발하는게 더… 빠를 거 같았다.
그래도 외로운 건 어쩔 수 없다. 요즘 자꾸만 혼잣말을 한다..ㅋㅋㅋㅋ
아무튼, 그래서 지금까지 잘 진행이 되고 있나? 라고 누가 묻는다면 나는 “그렇다” 라고 이야기 할 거 같다.
준비를 시작하고 약 5일 정도를 지나고 있는 지금, 그래도 꽤나 많은 진전이 있었다.
AI + 게임 개발. 그래서 어떻게?
처음에는 유니티를 생각했지만.. 사전 과제를 시작하기 며칠 전인가, unity mcp로 내 실패한 사이드 프로젝트를 좀 살려보려다가 그만… 질려버렸다.
그리고 18일 동안 만들 간단한 플레이어블 데모 정도에 굳이.. 유니티를 쓰고 싶지는 않았다. 그리고… 기왕하는 거 새로운 엔진을 써보고 싶었다.
그래서 Godot을 선택했다.
요즘 경량화된 게임 엔진으로 많이들 채택하는 거 같았고… 무엇보다 mcp 연결해서 ai 파이프라인을 만드는게 꽤나 쉽고 ai 가 말도 척척 잘 알아듣는 거 같았다.
무엇보다. 유니티보다 훨씬.. 쉬워보였다.
첫 삽질 — 2D 도트 아이소메트릭
2D 도트 게임, 아이소메트릭으로 만드려고 기획했다. 그게 가장 빠를 거 같았으니까. 근데 내 착각이었다.
아이소메트릭은 2D 에서 가장 어려운 축에 속하는 방식이었고, 나는 그걸 간과했다.
가장 컸던건 도트 캐릭터들의 디자인과 스프라이트 시트를 pixellab에서 뽑았는데, 이게 아이소메트릭은 2D를 마치 3D 처럼 보이게 하는거라… 1개의 캐릭터의 1개의 모션을 8방향의 버전으로 뽑아야 하는데, 이게 ai를 사용해서 뽑으려니까 일관성이 아주 박살이 났다.
오른손에 들고 있던 무기를 같은 모션에서 갑자기 왼손에 든다던지 하는…
캐릭터만 문제가 아니었다. 벽·바닥·가구까지 다 pixellab 로 돌리다 보니 iso 각도랑 색톤이 매 번 미묘하게 어긋났다. 붙여놓으면 그냥 “잡동사니 방” 이었다.
크레딧을 500장 넘게 태우고 나서 인정했다. 이거 접자.
그래서 3D로 도망갔다
솔직히 도망이 맞다. 회피한 거니까.
근데 도망친 게 신의 한 수였다. 3D 로 넘어가니까 2D 에서 나를 괴롭히던 것들이 대부분 사라졌다.
첫째, Mixamo 라는 게 있다. Adobe 가 반쯤 방치해놓은 서비스인데 humanoid 애니메이션이 무료로 잔뜩 있다. 같은 스켈레톤을 쓰는 캐릭터라면 애니 하나로 전 방향 다 커버된다. 8방향 sprite 시트 뽑을 필요 자체가 사라진다.
둘째, Meshy 하나로 캐릭터부터 가구, 소품까지 웬만한 3D 오브젝트가 다 뽑힌다. 처음엔 Quaternius, Kenney 같은 CC0 팩을 백업으로 준비해뒀는데, 막상 써보니까 Meshy 가 가구나 소품도 진짜 잘 뽑아줘서 CC0 팩은 거의 안 열어봤다 ㅋㅋ
셋째, 카메라가 자유롭다. iso 처럼 고정 각도가 아니라 3인칭 카메라를 붙이면 그냥 오카리나 오브 타임처럼 굴러간다.
넷째, AI 자산의 요구 수준이 낮아진다. 2D 도트는 “AI 로 없던 자산을 만들어” 야 했다. 3D 는 “이미 존재하는 humanoid rig 표준 위에 얹기만” 하면 된다.
3D 파이프라인은 이렇게 짰다
전체 스택.
- 엔진: Godot 4.7. mobile renderer.
- 에이전트: Claude Code.
- 캐릭터·가구·오브젝트 생성: Meshy AI. 텍스트를 넣으면 3D 모델이 나온다. T-pose 로 뽑아주는 옵션이 있어서 humanoid rig 로 바로 붙일 수 있다. 캐릭터만 잘 뽑는 줄 알았는데 가구·소품도 웬만한 건 다 뽑아준다.
- 애니메이션: Mixamo. FBX 로 다운받아서 로컬 캐싱
- 모델 변환: Blender. FBX 를 glTF 로 바꾸고 root bone 을 심는다.
- 컷씬 이미지: Google 의 Nano Banana.
여기에 MCP 서버를 3개 사용했다. Godot MCP, Meshy MCP, PixelLab MCP.
아, 물론 중계 서버…를 대신할 Azure Function도 있다.
캐릭터는 Meshy 에서 뽑아서 Mixamo 로 리깅하고 Godot 으로
흐름은 이렇다.
Meshy 에 프롬프트를 짧게 넣는다. 길게 쓰면 이상하게 씬 전체를 만들어버린다. “T-pose 강제, low poly, clean topology” 정도만 박아놓으면 된다.
T-pose FBX 로 받으면 아직 스켈레톤이 없는 그냥 mesh 상태다. 이걸 Mixamo 에 업로드하면 auto-rig 를 알아서 걸어준다. 손목, 팔꿈치, 어깨, 무릎, 턱에 마커 5개만 찍으면 나머지는 그냥 알아서 스켈레톤을 붙여준다. 그리고 이게 humanoid 표준 스켈레톤이니까 Mixamo 애니 라이브러리를 통째로 갖다 쓸 수 있다.
잠시 기도 시간을 가지겠습니다.
주주 데모 만들 때 2.5D 캐릭터 리깅한다고 진짜 한 달을 그냥 갖다 버린 적이 있다.(허리랑 손목, 귀한 시간과 같이…)
얼굴 부위 하나하나 mesh warp 잡고, 뼈 그리고, weight painting 하고… 그때는 진짜 지옥이었다. 1캐릭터 1동작하는데 거의 한나절이 걸렸으니… 진짜 울면서 작업했다 그 때는
근데 지금은 마커 5개 찍고 끝. 오토리깅은 신이다.
리깅 끝난 걸 다시 FBX 로 다운받는다.
Blender 에서 root bone 을 심고 glTF 로 export. Godot 4 의 FBX 임포터가 root motion 을 제대로 처리 못 하는 이슈가 있어서 Blender 를 거쳐야 한다.
Godot 에 던져놓으면 자동 임포트. 여기서 SkeletonProfileHumanoid 랑 BoneMap.tres 를 붙이면 Mixamo 애니를 그대로 리타깃해서 쓸 수 있다.
애니메이션은 Mixamo 라이브러리로 통합
Mixamo 에서 “Without Skin” 옵션으로 다운받으면 애니만 담긴 가벼운 FBX 가 나온다. 같은 humanoid 스켈레톤을 쓰는 캐릭터는 이 애니를 그냥 공유한다.
첫 주에 30개 넘게 대량으로 다운받아서 로컬에 캐시해뒀다. Adobe 가 언제 서비스 접을지 모르니까 미리 뽑아두는 게 안전하다.
여기서 신경 쓴 게 두 가지.
첫째, root motion 제거. Mixamo 애니는 캐릭터가 실제로 앞으로 이동하는 값이 트랙에 들어있다. 이게 Godot 의 move_and_slide() 랑 충돌해서 걷다가 이상한 데로 밀린다. EditorScenePostImport 로 임포트 시점에 Hips 의 position 트랙만 뽑아버리는 스크립트를 하나 짜서 붙였다.
둘째, AnimationLibrary.tres 통합. Godot 4 표준은 애니를 하나의 라이브러리 리소스로 묶어서 AnimationPlayer 에 attach 하는 거다. fbx 하나씩 에디터에서 손으로 붙이는 건 지옥이라, 헤드리스 CLI 로 폴더 순회하면서 통합 라이브러리를 빌드하는 스크립트를 하나 짰다. fbx 새로 하나 추가돼도 그 스크립트만 다시 돌리면 된다.
지금.
지금 이 글을 쓰는 시점에 캐릭터가 아레나에서 걸어다니고, 무기를 오른손에 부착해서 휘두르고, 콤보를 이어치는 데까지 왔다.
체감상 개발 속도가 이전 프로젝트 대비 적어도 30배는 빠른 것 같다.
AI 가 마법이어서가 아니라, AI를 잘 짜여진 파이프라인과 표준 개발 패턴 위에 잘 올려놔서이다. .
Godot + Mixamo humanoid rig + Meshy T-pose 는 이미 서로가 서로에게 맞춰진 표준이다. 그 위에 얹으면 파이프라인이 그냥 굴러간다.
마치며
8월 10일까지 남은 게 산더미다.
튜토리얼, 데모 플레이 영상, README, 기술문서 다 준비해야 하고, 무엇보다 게임이 좀 재미있어야 한다.
파이프라인이 아무리 잘 굴러가도 게임이 재미없으면 그거대로 나락이니까.
근데 지금 페이스면 못 만들 것 같지는 않다. 5일 만에 캐릭터가 걸어다니고 검을 휘두르는 데까지 왔으니, 남은 시간에 게임 로직만 얹으면 된다.
…라고 말하지만 또 예상하지 못한 장애물 때문에 울면서 글을 쓸 수도 있긴한데..
일단 오늘은 넘겼으니, 한 잔해.
마침.