개요

지난 편에서 “디버깅에 용이한 주석과 로그를 남기게 하라”는 조언을 반영하기로 했었다. 이번엔 그 부분을 실제로 개발 AI 프롬프트에 박아넣고, 에셋 생성 쪽에 Pixellab.ai API를 붙이는 작업을 진행했다.

참고 저장소
Slime (게임 프로젝트)

왜 주석과 로그부터 손봤나

AI가 코드를 만들어주면 처음엔 좋다. 문제는 에러가 났을 때 시작된다.

에러 메시지는 “어느 파일 몇 번째 줄”까지만 알려준다. 그런데 우리 프로젝트에서 알아야 하는 건 “이 코드가 원래 어떤 기능을 하려고 태어난 코드인가” 였다. 그걸 모르면 결국 AI에게 다시 물어보게 되고, 그 질문 한 번이 또 토큰(=돈)이다.

쉽게 말하면
장난감이 고장났는데 설명서가 없으면, 만든 사람한테 매번 전화를 걸어야 한다. 그런데 그 전화가 유료다. 그래서 장난감 뒷면에 “이건 3번 부품이에요” 라고 미리 적어두기로 한 것이다.

개발 AI 프롬프트에 넣은 규칙
- Add a single line comment naming the feature id above the class
  declaration, so QA can trace a runtime error back to the feature.
- Null-guard any reference obtained via GetComponent/Find before use.
- Serialize inspector-facing fields with [SerializeField] private,
  not public fields.

핵심은 첫 줄이다. 클래스 위에 그 클래스가 담당하는 기능 ID(spec-00X) 를 주석으로 강제로 남기게 했다. 이러면 런타임 에러 → 파일 → 기능 → 기획서 까지 한 줄로 이어진다.

생성 모드 / 수정 모드를 갈라놓기

여기서 하나 더 깨달은 게 있다. 처음 만들 때의 지시고칠 때의 지시가 같으면 안 된다는 것.

같은 프롬프트로 계속 다시 시키면 AI는 매번 백지에서 새로 쓴다. 어제 잘 돌던 부분까지 같이 갈아엎어버리니 수정이 끝나질 않는다. 그래서 수정 전용 프롬프트를 따로 만들었다.

Repair rules (these override the generation framing above):

- You are fixing an existing file, not rewriting it. Preserve every
  line that the reported error does not require changing.
- Make the smallest change that removes the reported error.
- Do not rename the type, change its namespace, or drop existing members.
- Output the COMPLETE corrected file, not a diff or a fragment.

쉽게 말하면
“그림 다시 그려줘” 와 “여기 삐져나온 선만 지워줘” 는 완전히 다른 부탁이다. 전자만 계속 시키면 그림이 매번 바뀐다.

프롬프트로는 못 막았던 문제

파일마다 AI 대화가 따로 놀다 보니, PlayerController를 만들 때 InventorySystem이 이미 있는 줄 모르고 같은 타입을 또 정의해서 컴파일 에러가 반복됐다.

이건 “잘 좀 해줘” 라고 부탁해서 해결되는 문제가 아니었다. 그래서 호출할 때마다 지금까지 선언된 모든 타입 목록(existing_types) 을 프로젝트 문맥과 함께 넣어주도록 구조를 바꿨다. 부탁이 아니라 구조로 막은 셈이다.

에셋 MCP에 Pixellab.ai 붙이기

지난 편 회의 결론대로 LoRA 자체 학습은 접고 Pixellab.ai API를 Asset MCP 서버에 연동했다.

스타일을 “먼저 잠그고” 생성하기

에셋을 하나씩 그냥 뽑으면 색감이 전부 따로 논다. 그래서 게임 단위로 아트 스타일·팔레트·시드를 먼저 고정하는 단계(establish_art_style)를 앞에 뒀다.

{ "art_style": "top-down 32x32 pixel art, 1px black outlines, flat-shaded per-biome palette",
  "seed": 13444605377975346389,
  "pixel_grid": 32,
  "palette": { "character_primary": "#8fd345", "...": "..." } }

쉽게 말하면
색연필 세트를 먼저 정해놓고 다 같이 그리는 것과, 각자 아무 색연필이나 들고 그리는 것의 차이다. 후자는 붙여놓으면 한 게임처럼 안 보인다.

생성 이력(provenance)을 같이 남기기

이미지마다 “무엇으로, 어떤 시드로, 어떤 프롬프트로 만들었는지”를 파일에 함께 기록하게 했다.

"provenance": { "method": "pixellab",
  "endpoint": "generate-image-pixflux",
  "derived_from": "seed=1291943972 feature=spec-001 prompt_sha256=9cc2c106..." }

나중에 “이 그림 AI가 만든 거 맞아?” 라는 질문에 답할 수 있어야 한다고 봤다. 저작권 얘기가 나오면 결국 이 기록이 근거가 된다.

프롬프트 규칙도 실측에서 나왔다

캐릭터가 든 무기·도구는 캐릭터와 분리해서 따로 적게 규칙을 만들었다. 실제로 넣어보니 무기를 포함해 묘사한 캐릭터는 5점 만점에 2점, 무기를 뺀 캐릭터 단독 묘사는 5점이었기 때문이다. (감이 아니라 점수를 매겨보고 정한 규칙이다)

한줄 평

  • 이제 진짜 게임을 만들 차례다. 구조는 여기까지 하고 손을 떼야 한다…