요즘 "프롬프트 하나로 3D 고속 러너를 만들었다"는 글이 자주 보입니다. 프롬프트 전문을 같이 올려 주는 경우도 많아서 그대로 복사해 돌려 볼 수 있습니다.

그런데 그 프롬프트들을 읽어 보면 공통점이 하나 있습니다. 캐릭터의 식별 요소를 문장으로 지정합니다. 파란 몸, 가시처럼 뻗은 머리, 흰 장갑, 빨간 신발, 흰 스트랩, 금색 버클, 동그란 수집물. 그건 "만들어 달라"가 아니라 "베껴 달라"는 지시입니다.

저는 같은 형식의 게임을 만들되 주인공을 의인화한 진돗개로 두기로 했습니다. 다섯 스테이지까지 왔고, 그 과정에서 프롬프트를 여러 번 고쳤습니다. 지금 쓰는 프롬프트를 그대로 공개하면서, 무엇을 왜 바꿨는지 적습니다.

1. 캐릭터를 지정하면 그 캐릭터가 나옵니다

AI는 빈칸을 학습된 클리셰로 채웁니다. "고속으로 달리는 파란 동물"이라고만 적어도 그 장르의 대표작을 그립니다. 지정을 안 해도 그렇게 나오는데, 심지어 지정까지 해 주면 결과는 정해져 있습니다.

그래서 지정 항목을 전부 갈아 끼웠습니다.

자리흔한 프롬프트가 시키는 것제가 넣은 것
종파란 고슴도치진돗개
털코발트블루, 가시 형태황백색 이중모, 목둘레가 두툼함
귀뒤로 뻗은 가시앞으로 선 삼각 귀
꼬리짧은 뭉툭한 꼬리등 위로 말린 꼬리
손흰 장갑맨발 육구, 장갑 없음
신발빨강 + 흰 스트랩 + 금색 버클먹색 본체 + 청록 스트랩 + 주황 밑창
수집물원형 금색 고리육각형 바람패

색까지 다 적어 둔 이유가 있습니다. "기존 캐릭터를 피해서 만들어 줘"라고만 적으면 AI는 조금만 비켜 갑니다. 파랑을 하늘색으로 바꾸는 식입니다. 그건 피한 게 아닙니다. 피하려면 자리마다 다른 것을 못 박아야 합니다.

2. 금지 목록을 프롬프트 안에 넣습니다

바꿔 넣는 것만으로는 부족합니다. AI는 "덧붙이면 더 좋아 보이겠다" 싶은 요소를 스스로 추가하는데, 그 추가분이 대개 원본 쪽으로 돌아갑니다. 그래서 하지 말 것을 따로 적습니다.

제 프롬프트에는 이런 문장이 들어 있습니다. 기존 시리즈의 이름을 적지 않고, 요소만 적습니다 — 이름을 적으면 그것대로 "그 게임처럼"의 근거가 되니까요.

  • 파란 고슴도치, 가시 형태의 머리, 흰 장갑, 빨간 신발, 금색 버클을 쓰지 말 것
  • 체커(격자) 무늬 지형을 쓰지 말 것
  • 원형 금색 고리를 수집물로 쓰지 말 것
  • 기존 상표·캐릭터·존 이름을 어떤 형태로도 쓰지 말 것
  • 웹 검색·외부 다운로드·온라인 에셋을 쓰지 말 것

마지막 줄은 상표와 무관해 보이지만 사실 같은 이야기입니다. 온라인 에셋을 가져오게 두면 어디서 왔는지 모르는 이미지가 결과물에 섞입니다. 전부 절차적으로 만들게 하면 출처를 따질 일 자체가 없습니다.

3. 마지막까지 남아 있던 두 개

캐릭터를 갈아 끼우고도 한동안 남아 있던 것이 둘 있었습니다. 둘 다 캐릭터가 아니라서 눈에 안 띄던 것들입니다.

체커 무늬 바위. 처음 프롬프트에 "checker-patterned rock"이 그대로 들어 있었고, 그대로 나왔습니다. 격자 무늬 절벽은 그 장르 대표작의 서명 같은 것이라 바꾸는 게 맞습니다. 지금은 바위 셰이더가 수평 지층을 그립니다 — 높이에 따라 띠가 생기고, 거기에 잔결과 얼룩이 얹힙니다. 절벽이 훨씬 자연스러워졌고, 덤으로 격자보다 코스의 고저차가 잘 읽힙니다.

"homing"이라는 이름. 조작 안내에 그대로 적혀 있었습니다. 공중에서 표적을 잡아 돌진하는 동작 자체는 이 장르에서 흔한 규칙이라 문제가 아니지만, 이름은 다릅니다. 규칙은 따라 해도 되고 이름은 내 것을 붙이는 편이 낫습니다. 지금은 화면에 "chain dash"라고 적혀 있습니다 — 연속으로 잇는 것이 이 동작의 핵심이라 뜻도 더 맞습니다.

규칙(게임 메커니즘)과 표현(캐릭터 생김새·이름·특유의 무늬)은 보호 범위가 다릅니다. 그래서 이 글의 방향은 "비슷한 장르를 만들지 말자"가 아니라 "표현을 빌리지 말자"입니다.

두 개를 고치는 데 걸린 시간은 삼십 분이 안 됩니다. 그런데 찾는 데는 며칠이 걸렸습니다. 캐릭터는 눈에 보이니까 첫날 바꿨는데, 지형 무늬와 조작 안내 문구는 "내가 쓴 것"처럼 느껴져서 검사 대상에서 빠져 있었습니다. 프롬프트에 금지 목록을 적어 두는 이유가 여기 있습니다 — 사람은 자기가 이미 만든 것을 다시 의심하지 않습니다.

4. 버그를 프롬프트에 적습니다

이게 이번에 가장 크게 바뀐 부분입니다. 처음 산출물에서 실제로 났던 결함들을 프롬프트 안에 금지 조건으로 적어 두면, 다시 생성할 때 그 자리를 처음부터 피해 갑니다.

제가 겪은 것들입니다.

  • 타이틀 화면에서 재시작 키가 게임을 시작시킵니다. R/Q 를 눌렀을 뿐인데 시작 화면을 건너뛰고 주행이 시작됩니다.
  • 재시작해도 드리프트 에너지가 남습니다. 앞판에서 모아 둔 값이 새 판 첫 코너에서 터져 나옵니다.
  • 레일 스냅이 없는 레일을 겨냥합니다. 생성된 레일은 셋인데 스냅 계산은 다섯을 가정해서, 바깥으로 조작하면 허공에 붙습니다.
  • 최고 기록이 화면에 안 뜹니다. 저장은 되는데 불러오기에서 빠져 있습니다.
  • 무너진 다리가 재시작 후 복구되지 않습니다. 다시 시작했는데 다리가 이미 없습니다.
  • 폭포 도약에서 발사 속도를 잃습니다. 스프링이 띄우자마자 감속이 걸려 건너편에 못 닿습니다.

여섯 개 다 "고속 러너를 만들라"는 지시로는 절대 나오지 않는 요구사항입니다. 그런데 겪고 나면 당연히 지켜야 하는 것이 됩니다. 그래서 프롬프트에 넣습니다.

그리고 하나 더 넣습니다 — 창 없이 도는 회귀 검사 스크립트를 같이 만들라는 요구입니다. 지금 제 프로젝트는 137항목을 검사하고 실패 0으로 통과합니다. 다섯 스테이지를 자동 주행으로 완주하는 것까지 포함해서요. 사람이 눈으로 보는 검증만 시키면, 화면에 안 보이는 결함은 영영 안 잡힙니다.

5. 프롬프트 전문

아래를 그대로 복사해 쓰시면 됩니다. 캐릭터 부분을 자기 것으로 바꾸시면 다른 게임이 나옵니다 — 그게 요점입니다. 영어로 쓴 이유는 원본 프롬프트가 영어였고, 지시문은 번역을 거치지 않는 편이 결과가 안정적이기 때문입니다.

Create a visually spectacular, highly polished 3D speed-runner vertical slice in Godot 4.
Do not use web search, external downloads, online assets, or any internet resource. Build
everything from locally available tools and original procedural content: meshes, materials,
shaders, animation, music and sound effects.

ORIGINAL CHARACTER — this is a specification, not a reference to any existing character.
The player is an anthropomorphic Jindo, a Korean spitz-type dog. Cream-to-ivory double coat
with a ginger saddle, thick ruff around the neck, upright triangular ears with dusty-rose
inner fur, black nose, dark almond eyes drawn as separate eyes, a tail that curls up over
the back, compact athletic proportions, bare paw pads with no gloves. Shoes are ink-charcoal
bodies with teal straps and orange soles. The wind trail is teal.

FORBIDDEN — never produce any of these, in geometry, texture, naming or UI text:
blue hedgehog or spiky quill hair; white gloves; red shoes with white straps or gold buckles;
gold ring collectibles; checkerboard-patterned terrain; any existing franchise name, zone
name, character name, catchphrase or logo, in any language. If a detail is unspecified,
invent something that fits a Korean coastal-to-city setting rather than borrowing a
recognizable one. Collectibles are hexagonal wind tags, not rings.

FEEL — speed, momentum, responsive control, fluid traversal. High-speed running,
acceleration, drifting, jumping, a lock-on air dash that can be chained across airborne
targets, a crouch-charged launch dash, rolling, a boost reservoir, springs, dash pads,
grind rails, loops, wall runs, ramps and launch sequences. Preserve momentum; never stop
the player for a collision that could be a slide.

FIVE STAGES, one continuous route each, each with its own sky, fog, sun colour and accent:
1. Coastal cliffs at dawn over an open sea.
2. Bamboo mountain ridges in morning mist.
3. A volcanic caldera at dusk with ember light.
4. A glacier harbour at night under an aurora.
5. A neon city rooftop line at afterglow.
Each stage carries the same beat structure: a clifftop opening that shows the level, a long
downhill acceleration, a full loop, a corkscrew spiral, three parallel rails over water or
void, an airborne lock-on chain, an interior of stone or industry, a vertical wall run, a
waterfall-style gap jump, a collapsing bridge, and a final sprint.

PRESENTATION — vibrant stylized visuals, physically based materials, dynamic sunlight, soft
shadows, fog, water reflection, spray, vegetation movement, particles, tasteful bloom.
Restrained speed lines, wind trails, camera banking and subtle FOV expansion as speed rises.
Animation evolves from jog to a forward-leaning sprint, with believable terrain contact on
slopes, loops, rails and walls. Squash, stretch, anticipation and follow-through.

CORRECTNESS — these are real defects from an earlier build. Do not reproduce them:
- Restart and checkpoint keys must do nothing on the title screen.
- Restarting must clear stored drift energy, chain state, and any collapsed geometry.
- Rail snapping and rail switching must only ever target rails that actually exist.
- A saved best time must be loaded and shown on the result screen, not just written.
- A spring launch must keep its launch velocity long enough to cross the gap it is aimed at.
- Loops must support a fully inverted frame without the character detaching.

VERIFICATION — also produce a headless regression script that runs with no window and no
audio device, checks each item above plus an automated full run of every stage, and writes
a pass/fail file. Report the failing checks rather than claiming success.

The highest priority is joyful control and presentation. Favour responsive movement,
spectacle, momentum and traversal polish over extra systems.

지금 상태

정리가 끝나서 공개했습니다. ntsapp.dev/jindo 에서 바로 달리실 수 있습니다. 소개는 진돗개 타이달 러시에 있습니다.

  • 다섯 액트, 전체 경로 10,459 m. 타이틀에서 A/D로 액트를 고르고 Enter로 시작합니다.
  • 회귀 검사 137항목 실패 0(2026-09-08 실행). 자동 주행으로 다섯 액트를 모두 완주하는 것까지 포함돼 있습니다.
  • 음악도 액트마다 다릅니다. 다섯 곡이 각각 다른 BPM·음계·리드 파형을 갖고, 액트별 고정 시드로 만들어 실행할 때마다 같은 곡이 나옵니다. 음원 파일은 하나도 없습니다.
  • 그리고 이 검사가 무엇을 보지 않았는지는 따로 적었습니다 — 자동 검사 49개가 전부 통과했는데, 다섯 스테이지 중 셋이 물속에 있었습니다. 이 글에서 "버그를 프롬프트에 적으라"고 한 이유가 거기 다시 나옵니다.

프롬프트 하나로 게임이 나오는 것은 사실입니다. 다만 무엇을 만들지 안 정하면 AI가 대신 정해 주고, 그때 나오는 것은 대개 남의 것입니다. 그 자리를 채우는 것이 결국 사람이 할 일이었습니다.