logo
게시일

AI로 게임 스프라이트 시트 만들기

다른 언어로 읽기: English
작성자

1. 게임 리소스, AI로 만들 수 있을까?

게임을 만들 때 가장 시간이 오래 걸리는 작업 중 하나가 캐릭터 리소스 제작입니다. 하나의 캐릭터만 해도 idle, 공격, 사망 등 여러 상태의 이미지가 필요하고, 캐릭터 종류가 늘어나면 필요한 이미지 수는 기하급수적으로 늘어납니다.

이 글에서는 Gemini API를 사용해서 다음을 자동화한 과정을 공유합니다:

  1. 캐릭터 디자인 생성 (종별 다양한 디자인)
  2. 색상/패턴 변형으로 수천 가지 조합 생성
  3. 상태별 스프라이트 시트 자동 생성

실제로 모바일 아쿠아리움 게임에 사용할 캐릭터들을 이 방법으로 만들었습니다.


2. 전체 구조

전체 파이프라인은 크게 3단계로 나뉩니다:

전체 파이프라인

핵심 아이디어는 **"한 번 생성하고, 무한히 조합한다"**는 것입니다. AI에게 파츠(몸통, 지느러미, 꼬리, 눈, 패턴)를 각각 생성시키고, 코드로 조합하면 수천 가지 고유한 캐릭터를 만들 수 있습니다.


3. 캐릭터 디자인 생성

3.1 종(Species) 설정

먼저 JSON 설정 파일에 캐릭터의 종을 정의합니다. 각 종마다 특징, 레이어(파츠), 색상을 설정합니다:

{
  "styleGuide": {
    "artStyle": "2D vector cartoon, soft gradients, cel-shaded highlights",
    "perspective": "side view, slight 3/4 angle facing right",
    "lighting": "soft top-left lighting, subtle rim light on edges",
    "outline": "clean dark outline (2-3px), slightly thicker on body",
    "mood": "friendly and appealing for casual mobile game",
    "references": "Insaniquarium, Fishdom, mobile idle games"
  },
  "species": {
    "guppy": {
      "name": "Guppy",
      "description": "Small colorful freshwater fish",
      "physicalTraits": {
        "bodyShape": "small oval body, slightly chubby belly",
        "distinguishingFeatures": "large flowing tail, big cute eyes"
      },
      "layers": [
        {
          "name": "body",
          "variants": ["round", "slim", "chubby"],
          "promptDetails": {
            "round": "perfectly round plump body, balloon-like cute shape",
            "slim": "elongated streamlined body, elegant swimmer shape",
            "chubby": "extra pudgy body, adorable fat cheeks"
          }
        },
        {
          "name": "tail",
          "variants": ["delta", "veil", "lyretail", "round"],
          "promptDetails": {
            "delta": "triangular delta tail, classic guppy shape",
            "veil": "long flowing veil tail, elegant draping fabric-like"
          }
        }
      ],
      "colors": [
        { "name": "sunset_orange", "hex": "#FF6B35", "description": "warm sunset orange with yellow highlights" },
        { "name": "ocean_blue", "hex": "#2E86AB", "description": "deep ocean blue with teal undertones" }
      ]
    }
  }
}

스타일 가이드가 핵심입니다. 모든 캐릭터가 같은 스타일로 나오도록 아트 스타일, 시점, 조명, 아웃라인을 고정합니다. 이렇게 하면 AI가 일관된 스타일로 이미지를 생성합니다.

3.2 프롬프트 구조

캐릭터 생성 프롬프트는 다음과 같이 구성됩니다:

프롬프트 구조

실제 코드에서 프롬프트를 조합하는 부분입니다:

function buildFullFishPrompt(speciesKey, species, bodyVariant, color, pattern) {
  const { styleGuide } = config;

  return `
Create a single ${species.name} fish character for a mobile game.

CHARACTER SPECS:
- Species: ${species.name}
- Body Type: ${bodyVariant} - ${species.layers.find(l => l.name === 'body').promptDetails[bodyVariant]}
- Color: ${color.name} (${color.hex}) - ${color.description}
- Pattern: ${pattern}

ART STYLE (MUST FOLLOW):
- ${styleGuide.artStyle}
- ${styleGuide.perspective}
- ${styleGuide.lighting}
- ${styleGuide.outline}

TECHNICAL REQUIREMENTS:
- 512x512px, transparent PNG, centered composition
- Single character, no duplicates
- BACKGROUND: Plain solid white background.
  `.trim();
}

3.3 실제 생성 결과

이렇게 해서 다양한 종의 캐릭터를 생성했습니다:

Guppy - 기본 물고기
Carnivore - 육식 물고기
Starcatcher - 신비한 가오리
Siren - 음악 물고기
Ultravore - 용 물고기
Leviathan - 최종 보스

같은 스타일 가이드를 사용했기 때문에 종이 다르더라도 아트 스타일이 일관됩니다. 2D 벡터 카툰, 깔끔한 아웃라인, 부드러운 그라디언트라는 규칙이 모든 캐릭터에 적용됩니다.


4. 색상/패턴 변형 — 하나로 수천 개 만들기

4.1 색상 변형

하나의 캐릭터 디자인을 기반으로 색상만 바꾼 변형을 생성할 수 있습니다. 레퍼런스 이미지를 함께 보내서 "이 캐릭터와 같은 형태인데 색상만 바꿔줘"라고 요청합니다.

Sunset Orange Ocean Blue Cherry Red Royal Purple

같은 캐릭터인데 색상만 다릅니다. 형태는 유지하면서 색상만 변경하는 게 핵심입니다.

4.2 패턴 변형

색상뿐만 아니라 패턴도 바꿀 수 있습니다:

점박이 패턴 줄무늬 패턴

같은 금색 통통이(Chubby Golden) 구피인데, 하나는 점박이(spots), 하나는 줄무늬(stripes)입니다.

4.3 조합의 힘

이렇게 파츠별로 변형을 만들면 조합 수가 폭발적으로 늘어납니다:

조합의 힘

AI 생성은 파츠별로 한 번씩만 하고, 나머지는 코드로 조합합니다. API 비용을 최소화하면서 결과물은 최대화하는 전략입니다.


5. 스프라이트 시트 — 상태별 애니메이션

게임에서는 캐릭터가 여러 상태를 가집니다. idle(기본), dead(사망), hungry(배고픔), happy(행복), sick(아픔), eating(먹기), attacking(공격) 등. 이 모든 상태를 하나의 스프라이트 시트로 만들어야 합니다.

5.1 레퍼런스 기반 생성

핵심 아이디어는 idle 이미지를 레퍼런스로 보내서 나머지 상태를 생성하는 것입니다:

레퍼런스 기반 생성 원리
function buildPrompt(fish) {
  return `IMAGE 1: Layout template (empty grid)
IMAGE 2: "${fish.name}" character idle sprite (reference)

TASK: Fill the template grid with the "${fish.name}" character.
Draw the character ONCE in each cell matching the state.

CELLS:
Top row:  IDLE | DEAD (belly-up, X eyes, gray) | HUNGRY (thin, sad) | HAPPY (smile, sparkles)
Bottom row:  SICK (green tint, spiral) | EATING (mouth open, food crumbs) | ATTACKING (lunging, fierce)

STRICT RULES:
- Same character in ALL 7 cells — same body shape, same species
- Each state must be CLEARLY DIFFERENT
- 2D vector cartoon style matching the reference`;
}

빈 레이아웃 템플릿 이미지idle 상태 캐릭터 이미지를 함께 보내서, AI가 같은 캐릭터를 7가지 상태로 그리게 합니다.

5.2 실제 생성 결과

Guppy 스프라이트 시트

위 이미지가 실제 생성된 Baby Guppy의 스프라이트 시트입니다. 왼쪽부터:

  • IDLE — 기본 수영 자세
  • DEAD — 배 뒤집어진 상태, X 눈, 회색
  • HUNGRY — 슬픈 표정, 땀방울
  • HAPPY — 활짝 웃음, 반짝이
  • SICK — 초록빛, 소용돌이
  • EATING — 입 벌리고 먹는 중
  • ATTACKING — 돌진, 화난 표정

같은 방식으로 다른 종들도 생성합니다:

Carnivore 스프라이트 시트
Ultravore 스프라이트 시트

하나의 idle 이미지만 있으면 나머지 6가지 상태가 자동으로 생성됩니다. 16종의 물고기 × 7상태 = 112개 이미지를 하나하나 그리는 대신, 16번의 API 호출로 끝납니다.


6. 배경 제거 — 그린 스크린 기법

AI가 생성한 이미지에서 배경을 제거해야 게임에서 사용할 수 있습니다. 두 가지 방법을 사용합니다:

6.1 AI 배경 제거 (Primary)

Python의 rembg 라이브러리(U²-Net 모델)를 사용해서 배경을 자동으로 제거합니다:

async function removeBackgroundAI(imageBuffer) {
  writeFileSync(inputPath, imageBuffer);
  execSync(`python3 rembg_worker.py "${inputPath}" "${outputPath}"`);
  return readFileSync(outputPath);
}

6.2 크로마 키 (Fallback)

프롬프트에서 **녹색 배경(#00FF00)**을 요청하고, 코드로 녹색 픽셀을 투명하게 바꿉니다:

BACKGROUND: Solid pure green (#00FF00) background ONLY - classic green screen

영화의 그린 스크린과 같은 원리입니다. AI에게 "초록색 배경에 그려줘"라고 하면, 코드에서 초록색만 투명으로 바꾸면 됩니다.

배경 제거 원리

7. 실전 팁

스타일 일관성을 위한 팁

  • 스타일 가이드를 고정하세요. 아트 스타일, 시점, 조명, 아웃라인을 한 번 정하면 모든 프롬프트에 동일하게 넣습니다
  • 레퍼런스 게임을 명시하세요. "Insaniquarium, Fishdom 스타일"처럼 구체적인 참조 게임을 알려주면 AI가 일관된 스타일을 유지합니다
  • 해상도와 구도를 고정하세요. "512x512, side view, centered"를 항상 포함합니다

비용 최적화

  • 파츠별로 한 번 생성하고 코드로 조합하면 API 호출 횟수를 최소화할 수 있습니다
  • Rate limiting(3초 간격)을 걸어서 API 한도에 걸리지 않게 합니다
  • 생성 결과를 아카이브해두면 나중에 재생성할 필요가 없습니다

AI 이미지 생성의 현실

  • 100% 완벽한 결과가 나오지는 않습니다. 10번 생성하면 7-8번은 쓸 만하고, 2-3번은 다시 생성해야 합니다
  • 복잡한 캐릭터일수록 일관성 유지가 어렵습니다. 간단한 캐릭터부터 시작하세요
  • 스프라이트 시트의 경우, 레이아웃이 가끔 틀어지는 경우가 있습니다. 빈 템플릿 이미지를 레퍼런스로 함께 보내면 정확도가 올라갑니다

8. 정리

단계내용API 호출
디자인 생성종별 캐릭터 디자인종당 1회
색상 변형색상/패턴 바꿔서 변형변형당 1회
스프라이트 시트idle → 7상태 시트캐릭터당 1회
배경 제거그린 스크린 / AI 제거0회 (로컬)

핵심은 "한 번 생성하고, 무한히 조합한다"입니다. AI로 기본 파츠를 만들고, 코드로 조합해서 수천 가지 고유한 캐릭터를 생성합니다. 그림을 못 그려도, 프롬프트와 코드만으로 게임에 쓸 수 있는 리소스를 만들 수 있습니다.