Sik.limited Logo

Astra와 Blender로 3D게임 만들기(feat. Godot 게임엔진) - 1

친구의 한마디에서 출발한 오리농장 게임 복각 프로젝트. GPT-6 Astra와 Godot으로 4일 동안 3D 키우기 게임의 뼈대를 만든 과정입니다.

Sik ·

어떤 친구가 오리농장 플래시게임을 복각해주면 좋겠다고 했어요. 그렇게 시작한 프로젝트를 4일 동안 붙잡고, 오리가 늘어나고 움직이고 먹고 쉬는 작은 3D 키우기 게임까지 만들었습니다.

이번 작업에서 궁금했던 건 하나였어요. 3D 모델링을 제외한 게임 제작의 어디까지를 Astra와 Terra 에이전트 군단으로 밀어볼 수 있을까. 목표는 게임 화면을 만드는 데서 멈추지 않고, 실제 앱까지 이어갈 수 있는 형태를 만드는 것이었습니다.

친구의 한마디를 게임 세계로 옮기기

오리 3D 모델링은 친구가 직접 만들었습니다. 이건 프로젝트의 출발점이자, 끝까지 사람이 잡고 있던 가장 중요한 손맛이었어요.

처음 게임 세계에 들어간 중립 자세의 오리 모델
처음 게임 세계에 들어간 중립 자세의 오리 모델

나머지 에셋은 가능한 한 생성형 도구를 이용했습니다. 타일맵 머티리얼은 GPT Image로 만들고, BGM은 Suno로 작업했습니다. 3D 모델을 제외한 2D 에셋과 사운드의 상당 부분을 생성형으로 처리한 셈입니다.

NC의 Varco도 써볼 생각이었습니다. 다만 이번 작업에서는 웹 스튜디오를 다루는 경험이 훈위안 쪽이 더 손에 맞았어요. 어떤 모델이 절대적으로 낫다기보다, 게임 자산을 반복 생성하고 고르는 흐름에서 무엇이 덜 끊기는지가 더 중요했습니다.

Phaser 다음으로 Godot을 고른 이유

예전에는 Phaser로도 비슷한 작업을 해봤습니다. 이번에는 Godot으로 넘어왔어요. 3년 전 Godot을 처음 만졌을 때는 시도할 때마다 잘 안 됐는데, 이번에는 GPT가 Godot의 구조와 문법을 꽤 정확하게 이해하고 있었습니다.

이 차이는 생각보다 컸습니다. 엔진에서 무엇을 어떤 노드로 묶을지, 개체 상태를 어떻게 나눌지, 임시 구현을 실제 게임 로직으로 어떻게 바꿀지에 대한 대화가 이어졌어요. 엔진을 아는 에이전트가 옆에 붙어 있으니, 막히는 시간을 줄이고 바로 다음 가설을 시험할 수 있었습니다.

웹으로 내보내는 Godot 게임은 WebGL 2.0을 쓰는 Compatibility 렌더러를 전제로 합니다. 그래서 화려한 효과를 먼저 쌓기보다, 브라우저에서 가볍게 돌아갈 게임 세계를 먼저 설계했어요. 모바일에서 보기 편한 화면 밀도와 웹 빌드의 제약을 함께 보자는 판단이었습니다.

참고: Godot의 웹 익스포트는 WebAssembly와 WebGL 2.0을 사용하며 Compatibility 렌더러를 대상으로 합니다. Godot 공식 문서


수백 마리의 오리가 같은 방식으로 살지 않게 하려면

이 게임은 오리가 많아질수록 재밌어지는 구조입니다. 그런데 수백 마리가 화면 안에서 각자 다른 상태와 스탯을 갖기 시작하면, 귀여움보다 먼저 최적화 문제가 옵니다.

그래서 초반부터 개체별 상태를 분리해두고, 필요한 업데이트만 돌도록 만드는 데 집중했습니다. 오리마다 같은 애니메이션을 틀어놓는 것이 아니라, 이동·휴식·먹이·물가 같은 상태가 게임의 리듬을 만들게 했어요. 오리가 많아져도 화면이 무겁지 않아야 “멍때리고 보기 좋은 게임”이라는 목표가 성립합니다.

처음부터 완성된 시스템을 만들지는 않았습니다. 기본 게임 세계와 최소 기능을 먼저 만들고, 큐브로 임시 로직을 넣어 움직여봤어요. 오브젝트가 돌아다니고 상태가 바뀌는 순간부터 이미 꽤 재밌었습니다.

리깅된 오리의 동작을 묶은 애니메이션 루프
리깅된 오리의 동작을 묶은 애니메이션 루프

그 감각을 기준으로 간단한 스펙과 기획서를 적었습니다. 복잡한 경영 시뮬레이션보다, 켜두고 오리들이 사는 모습을 보는 게임. 그 한 줄이 이후 판단의 기준이 됐습니다.

MVP는 한 시간, 다듬기는 사흘

MVP를 만드는 데는 한 시간도 안 걸렸습니다. 기본 월드, 오리의 임시 행동, 최소한의 상호작용까지는 정말 빨리 나왔어요.

오히려 그 뒤가 길었습니다. 3일은 대부분 다듬는 데 썼습니다. 상태 전환이 어색하지 않은지, 오리가 한꺼번에 많아졌을 때도 흐름이 유지되는지, UI가 게임을 방해하지 않는지 계속 확인했습니다. 에이전트가 속도를 올려준다고 해서 마감이 자동으로 빨라지는 건 아니었어요. 재미의 밀도를 맞추는 일은 여전히 사람이 반복해서 봐야 했습니다.

1편에서는 세계와 로직의 뼈대까지 정리했습니다. 다음 글에서는 무리깅 상태였던 오리에게 Astra로 Blender를 쥐여주고, Rigify 기반 리깅과 9가지 모션을 붙인 과정을 이어서 적겠습니다. 달릴 때 타일마다 다르게 튀어나오는 파티클 얘기도요.


이어서 읽기

Astra와 Blender로 3D게임 만들기(feat. Godot 게임엔진) - 2: Rigify 리깅과 타일별 파티클

최신 글