AI/Unity

Antigravity를 사용하여 타워 디펜스 게임 만들기 - 1

blacknabis 2026. 2. 13. 02:27

이번에 시도하는건 NotebookLM과 Antigravity를 연동해서 빠른시간에 최대한 자동화해서 개발을 계획중입니다.

딥리서치를 사용하여 킹덤 러시에 대한 분석 요청 (https://notebooklm.google.com)

해당 NotebookLM과 안티그래비티를 MCP로 연동해준다.

공용 라이브러리와 NotebookLM을 참고하도록 룰설정.

1. 씬구성 요청

처음 씬 구성하였을 때 3개만 구성되어서 NotebookLM을 사용하여 다시한번 일관성 채크.
카메라가 없어서 다시 카메라 추가를 요청
플레이를하면 비어있는 타이틀신에서 알아서 타이틀씬 스크립트를 읽어와서 타이틀씬UI프리팹을 UIManager에 이쁘게 등록된걸 확인.

ComfyUI가 반복적으로 에러가나서 확인해봤더니 내가 이전에 세팅한 이미지 생성 모델은 ace_step_v1_3.5b인데 안티그래비티가 따로 플로우워크.json을 주지않으면 제대로 못알아먹어서 v1-5-pruned-emaonly설치후 다시 진행. 잘된다..

이미지가 마음에 안들어서 Flow에서 나노바나나로 다시 제작...

 

Flow에서 나노바나나로 이미지를 다시 만들고 remove.bg에서 버튼이랑 로고의 배경을 삭제

 

이하 안티그래비티로 만든 개발일지 입니다.

AI로 게임 UI 에셋 만들기 — ComfyUI + Unity 자동화 파이프라인

Stable Diffusion으로 타이틀 화면 에셋을 생성하고, Unity Editor 스크립트로 자동 적용하는 과정을 기록합니다.
"그림은 AI가, 텍스트는 TextMeshPro가, 조립은 Editor 스크립트가."


🎯 목표

타워 디펜스 게임 Kingdom Defense의 타이틀 화면에 필요한 에셋 3종을 ComfyUI로 생성하고, Unity Editor 스크립트로 프리팹에 자동 적용하기.

에셋 용도 크기
Title_Background.png 전체 배경 768×512
Title_Logo.png 엠블렘 장식 512×512
Title_BtnStart.png 시작 버튼 프레임 512×256

🏗️ 아키텍처

comfy_bridge.py (Python)
    │
    ├─ ComfyUI API (/prompt, /history, /view)
    │   ├─ CheckpointLoaderSimple (v1-5-pruned-emaonly)
    │   ├─ KSampler → VAEDecode
    │   └─ Image Remove Background (rembg)  ← 배경 제거
    │
    └─ 출력 → Assets/Resources/UI/Title/*.png
                    │
TitleAssetGenerator.cs (Unity Editor)
    │  Python 프로세스 실행
    └─ 생성 완료 후 AssetDatabase.Refresh()
                    │
ForceAssignTitleAssets.cs (Unity Editor)
    ├─ TextureImporter 설정 (Sprite, Alpha, 9-Slice)
    ├─ PrefabUtility로 TitleView.prefab 수정
    │   ├─ Background: Image (Stretched)
    │   ├─ Logo: Image (엠블렘, SetNativeSize)
    │   └─ btnStart: Image (9-Slice) + TMP "TAP TO START"
    └─ SerializedObject로 private 필드 바인딩

🔑 핵심 교훈 3가지

1. SD1.5는 텍스트를 못 만든다

처음 시도: 프롬프트에 'Kingdom Defense' 텍스트를 직접 넣음

결과: 글자가 뒤섞인 의미 없는 이미지 (아래 예시)

입력: "game logo text 'Kingdom Defense', stone texture..."
출력: "KALEM DFOM LETE" 😱

해결: 장식 요소만 AI로 생성하고, 실제 텍스트는 TextMeshPro로 분리

# ❌ Before — AI에게 텍스트 요청
"game logo text 'Kingdom Defense', stone texture, gold border..."

# ✅ After — 장식만 요청, 텍스트는 Unity TMP로
"medieval fantasy shield emblem, golden ornate frame, royal crest, 
 no text, no letters, no words"

원칙: AI 이미지 = 장식/질감/분위기, 텍스트 = TextMeshPro. 역할을 분리하자.


2. RemBG로 배경 제거 자동화

투명 배경이 필요한 에셋(로고, 버튼)은 ComfyUI의 Image Remove Background (rembg) 노드를 활용.

# Python에서 워크플로우에 RemBG 노드 동적 삽입
if use_rembg:
    workflow["10"] = { 
        "class_type": "Image Remove Background (rembg)", 
        "inputs": { "image": [last_image_node, 0] } 
    }
    last_image_node = "10"

처음에는 C#에서 흑색 픽셀을 투명으로 바꾸는 Chroma Key 방식을 시도했지만, 경계가 지저분했음. RemBG가 훨씬 깔끔한 결과를 줌.

방식 품질 속도 비고
C# Chroma Key ⭐⭐ 빠름 경계 노이즈, 그림자 잔존
RemBG (rembg) ⭐⭐⭐⭐ 약간 느림 AI 기반, 깔끔한 마스크

3. Unity ↔ Python 브릿지 패턴

Unity의 UnityWebRequest로 ComfyUI에 직접 연결하려 했으나, 에디터 환경에서 비동기 처리가 불안정. Python 스크립트를 별도 프로세스로 실행하는 방식이 가장 안정적이었음.

Unity Editor (C#)
    │
    └─ System.Diagnostics.Process.Start("python", "comfy_bridge.py")
        │
        └─ Python (urllib) ─── HTTP ──→ ComfyUI (localhost:8188)
                                              │
                                              └─ 이미지 파일 저장
                                                     │
Unity Editor ←── AssetDatabase.Refresh() ────────────┘

장점:

  • Python은 HTTP 통신이 간편 (urllib 표준 라이브러리)
  • ComfyUI API 호환성 걱정 없음
  • Unity Editor의 메인 스레드 블로킹 회피

🛠️ 프리팹 자동 조립 (ForceAssignTitleAssets.cs)

에셋이 생성되면 한 번의 메뉴 클릭으로 프리팹에 자동 적용:

// 1. 텍스처 임포트 설정
EnsureSprite("Title_Background.png");
EnsureSprite("Title_Logo.png");
EnsureSprite("Title_BtnStart.png", sliced: true);  // 9-Slice 자동 설정

// 2. 프리팹 로드 → 수정 → 저장
var rootGo = PrefabUtility.LoadPrefabContents(prefabPath);
SetupBackground(so, rootGo, folder);  // 전체 화면 배경
SetupLogo(rootGo, folder);            // 엠블렘 (크기 자동 조절)
SetupButton(so, rootGo, folder);      // 9-Slice 버튼 + TMP 텍스트
PrefabUtility.SaveAsPrefabAsset(rootGo, prefabPath);

핵심 테크닉:

  • PrefabUtility.LoadPrefabContents — 씬에 없는 프리팹도 직접 수정 가능
  • SerializedObject — private 필드(backgroundImage, btnStart)에 강제 할당
  • TextureImporter.spriteBorder — 9-Slice 보더 자동 설정

📋 Disposable Tool 패턴

이 프로젝트에서는 일회성 에디터 도구를 적극 활용합니다:

Assets/Scripts/Kingdom/Editor/
├── comfy_bridge.py            ← ComfyUI 통신 (사용 후 삭제)
├── TitleAssetGenerator.cs     ← Python 실행기 (사용 후 삭제)
└── ForceAssignTitleAssets.cs  ← 프리팹 조립기 (사용 후 삭제)

에셋 생성/설정이 끝나면 스크립트를 즉시 삭제합니다. 프로젝트에 불필요한 코드가 남지 않도록 하는 것이 원칙.


🔄 전체 워크플로우 요약

1. comfy_bridge.py 실행
   → ComfyUI가 3장의 이미지 생성 (배경/엠블렘/버튼 프레임)
   → 로고·버튼은 RemBG로 배경 자동 제거

2. ForceAssignTitleAssets 실행 (Unity 메뉴)
   → 텍스처 → Sprite 변환, 9-Slice 보더 설정
   → TitleView.prefab에 이미지 자동 배치
   → 버튼 위에 "TAP TO START" TMP 텍스트 생성
   → SerializedObject로 private 필드 바인딩

3. 결과 확인 → 일회성 스크립트 삭제

💡 다음에 시도해볼 것

  • ControlNet 활용 — 레퍼런스 이미지 기반으로 스타일 일관성 확보
  • LoRA 학습 — Kingdom Rush 스타일 전용 모델 파인튜닝
  • SDXL 전환 — 더 높은 해상도와 디테일
  • Addressables 기반 에셋 로딩 — Resources 폴더 의존성 제거

AI 이미지 생성은 "만능"이 아닙니다.
텍스트, 정밀한 레이아웃, UI 인터랙션은 여전히 전통적인 도구가 낫습니다.
AI가 잘하는 것(질감, 분위기, 장식)과 엔진이 잘하는 것(텍스트, 레이아웃, 로직)을 분리하는 것이 핵심입니다.

반응형