컨셉 아트 → 픽셀 아트 씬, 루프 및 캐릭터 팩
이 스킬은 게임 팀과의 여러 검토 단계를 거쳐 정제된 프로덕션 워크플로우를 캡처합니다. 스크립트는 기계적인 부분을 처리합니다. 아래 규칙이 더 중요합니다. 이 규칙은 검토자가 계속 요청한 사항이므로 기본적으로 따르고 사용자가 요청할 때만 하나를 위반하십시오.
두 트랙은 하나의 툴킷(scripts/pixkit 및 scripts/의 CLI)을 공유합니다.
| 트랙 | 입력 | 출력 |
|---|---|---|
| 씬 (배경 / CG) | 샷당 1개의 컨셉 이미지 | 네이티브 정적 + 정확한 3배 복사본, 선택적 48프레임 매끄러운 루프, 선택적 시차 레이어, 검토 PDF, README |
| 캐릭터 | 캐릭터의 정면 컨셉 1개 | 1x 정면 스프라이트, 8–13개 표정, 표정별 대기/대사, To_/From_ 전환, 고개 끄덕임/느린 고개 끄덕임/머리 흔들기 (+ 사용자 지정 원샷), 법선 맵, 시트 + json, 미리보기, Unity 스크립트, README |
설정: pip install -r requirements.txt (numpy, scipy, scikit-image, opencv-python-headless, Pillow, reportlab), 검토 비디오용 ffmpeg. python scripts/demo/run_demo.py /tmp/demo를 한 번 실행하여 모든 것이 제대로 작동하는지 확인하십시오 (합성 아트만 사용).
0. 시작하기 전에
- 프로젝트의 기존 규칙을 찾아 재사용하십시오. 이전 팩(README, 매니페스트, 스프라이트)을 찾아보십시오. 새 캐릭터는 캐스트의 캔버스, 풋 라인, 픽셀-퍼-유닛, 외곽선 색상 및 높이 배율을 공유해야 합니다. 새 배경은 네이티브 크기, 팔레트 크기, 그레이드 및 비네트를 공유해야 합니다. 세트 전체의 일관성은 단일 에셋이 단독으로 좋아 보이는 것보다 더 중요합니다. 아직 아무것도 없으면 아래 기본값을 제안하고 그렇게 말하십시오.
- 범위가 진정으로 열려 있을 때만 범위를 정하십시오. 캐릭터의 경우 정면 세트만 할지 아니면 측면/후면/걷기도 할지 물어보십시오. 씬의 경우 요청이 명확하지 않으면 애니메이션을 적용할지 물어보십시오 (일부 샷은 정지 상태를 유지해야 함). 그렇지 않으면 작업을 시작하십시오. 명백한 다음 단계에 대해 허가를 구하지 마십시오.
- 사용자의 아트를 비공개로 유지하십시오. 파일을 직접 전달하십시오 (zip + 주요 미리보기 이미지). 사용자가 요청하지 않는 한 아트나 파생 스프라이트를 공개 페이지에 게시하지 마십시오.
기본값 (프로젝트에 맞게 변경하십시오):
| 씬 | 캐릭터 | |
|---|---|---|
| 크기 | 640×360 네이티브; 1920×1080 = 정확한 3배 최근접 이웃 | 96×160 캔버스, 풋 라인 y=155, 발 x=48에 중앙 정렬 |
| 색상 | 이미지당 24개 (팔레트 잠금) | 재료당 소색상 램프, 팩 전체 약 10–30개 |
| 선 | 아트에서 | 1 px 외곽선, 전체 캐스트에 대해 하나의 외곽선 색상 |
| 모션 | 48프레임, 12fps, 4초, 매끄러움 | 프레임당 지속 시간(ms) (60fps 그리드 친화적) |
| Unity | 포인트 필터, 압축 없음, 최대 크기 4096, PPU 32 | 동일; 피봇 (0.5, 0.025) |
1. 하우스 규칙
각 규칙은 검토자가 수정한 내용에서 비롯되었습니다. 취향이 아닙니다.
- 1x 픽셀 밀도. 하나의 아트 픽셀은 하나의 게임 픽셀과 같으므로 디테일 밀도를 두 배로 늘리지 마십시오. 씬은 네이티브 크기로 제작되고 정수로만 크기가 조정됩니다.
- 모든 것은 팔레트가 잠겨 있습니다. 애니메이션 프레임은 정지 이미지의 색상만 사용할 수 있습니다.
loopfx의 모든 효과는 팔레트 인덱스에서 작동하므로 새 색상이 나타날 수 없습니다. - 프레임 0 = 정지 이미지, 루프는 매끄럽습니다. 모든 모션은 정수 주기로 위상의 함수입니다. 루프의 프레임 0을 정지 이미지(
*_STILL_frame0.png)로 제공하여 점프 없이 둘을 교체할 수 있도록 하십시오. - 눈은 깜빡임만 합니다. 사용자가 특정 시선을 요청하지 않는 한 시선, 눈동자 움직임 또는 주변을 보지 않습니다. 요청할 경우 해당 시선 하나만 만들고 더 이상 만들지 마십시오 (예시 요청은 "1초 동안 아래를 봐").
- 머리카락은 물리적으로 움직일 때만 움직입니다. 고개를 끄덕이거나, 몸이 움직이거나 돌아설 때. 돌풍이나 숨결에 따른 움직임은 없습니다. 모든 숨결에 1px 떨림이 있으면 결함으로 읽히기 때문입니다.
- 단단한 것은 절대 흔들리지 않습니다. 도로, 가드레일, 기둥, 부두, 바위, 가구 및 자동차 내부는 모든 프레임에서 픽셀 잠금 상태를 유지합니다 (
static마스크). 물결은 해안선, 기둥 및 갈대에서 2–3px 떨어져 유지하십시오. - 단일 픽셀 깜빡임 없음. 외로운 픽셀이 깜빡이면 죽은 픽셀로 읽힙니다. 먼지는 떠다니고 반짝이지 않습니다. 반짝임은 드물게 유지하십시오.
- 전체 블록을 전체 픽셀 단위로 이동하십시오. 호흡은 가슴 위의 모든 것을 1px 위로 올립니다. 고개 끄덕임은 머리 블록을 1px 이동시킵니다. 행을 독립적으로 이동하지 마십시오. 그러면 외곽선이 찢어집니다 ("撕裂").
- 표정은 깜빡임 안에서 전환하십시오. 눈을 감은 동안 얼굴이 변합니다. 모든 원샷 클립은 대기 프레임 0에서 시작하여 정확히 대상 대기 프레임 0에서 끝납니다.
- AI가 잘못한 것은 고치고, 스토리는 그대로 두십시오. AI 아티팩트를 제거하십시오: 얼룩덜룩한 표면, 가짜 텍스트, 형태 없는 덩어리, 없는 손, 불가능한 빛, 있을 수 없는 장식. 스토리 관련 콘텐츠(캐릭터, 단서, 글)를 직접 추가하거나 이동하지 마십시오. 그러한 경우는 "확인 필요" 아래에 나열하십시오.
- 동일한 카메라, 동일한 픽셀. 두 샷이 카메라나 위치를 공유하면 기존 픽셀을 재사용하십시오. 이는 방, 자동차 내부, 램프 깜박임 타이밍 및 팔레트에 적용됩니다. 그들 사이의 컷은 점프해서는 안 됩니다.
- "X를 애니메이션하지 마십시오"를 존중하십시오. 사용자가 정지 이미지만 원하거나 무언가를 움직이지 말라고 하면 잠그고 다른 것은 변경하지 마십시오.
2. 씬 트랙
첫 번째 씬 전에 references/scene-pipeline.md를 읽으십시오. 애니메이션 전에 references/scene-loops.md와 시차 섹션을 읽으십시오.
-
픽셀화는 두 단계로 진행하여 중간에 수동 수정이 가능하도록 하십시오.
python scripts/scene_to_pixel.py concept.png OUT --name BG02 [--smooth 8,16] [--keep x0,y0,x1,y1] # -> OUT/BG02_stylized.png (등급 미적용) + OUT/BG02_compare.pngstylize는 "손으로 그린 단순화"를 수행합니다:- 소스에서 가져온 약 22가지 색상으로 줄입니다.
- 각 개체를 최대 3가지 톤으로 평평하게 만듭니다.
- 반점을 흡수합니다.
- 작은 밝은 특징(램프, 창문)과 얇은 선(레일, 도로 표시)을 보호합니다.
씬의 논리를 전달하는 정확한 모양의 소품에는
--keep을 사용하십시오. 거칠거나 GIF 또는 JPEG 소스에는--smooth를 사용하십시오. 1단계는BG02_native.png(조명 및 마스크용 크기 조정된 소스)와BG02_protected.png도 씁니다. 보호된 마스크에서 가짜 선을 확인하십시오. -
확대/축소하여 검사하고 수동으로 수정
pixkit.scene사용:ramp_paint는 얼룩덜룩한 바닥, 책상 및 벽을 평평한 조명 밴드로 바꿉니다.inpaint는 항목을 제거합니다.line_mask_src는 이음새를 다시 그립니다.- 카메라를 공유하는 이전 샷에서 붙여넣습니다.
빛의 방향, 도달 가능성 및 연속성을 확인하십시오 (참조의 논리 체크리스트 참조).
-
완료:
python scripts/scene_to_pixel.py OUT/BG02_fixed.png OUT --name BG02 --finish --grade cold_dusk. 이렇게 하면 팔레트 등급이 지정되고, 4단계 디더링 비네트가 추가되며, 결과가 24색으로 잠깁니다. 함께 컷하는 샷은 팔레트를 공유해야 합니다:scene.finish(a, extra=[b])를 사용하십시오. -
루프 (원하는 경우):
- 마스크를 PNG로 만듭니다. numpy로 색상을 선택하거나 다각형을 그린 다음 정지 이미지에 오버레이하여 확인합니다.
- 사양(
assets/examples/loop_spec.example.json)을 작성하고python scripts/make_loop.py spec.json을 실행합니다. - 감사를 읽습니다.
new_colours: 0, 인접 프레임 간 평균 변화와 유사한 이음새 변화, 8회 이상 토글되는 픽셀 수가 적을 것으로 예상하십시오. - 리뷰 mp4를 시청하십시오. 숫자가 모든 것을 잡아내지는 않습니다.
-
시차 (카메라가 스크롤되는 경우): 참조를 참조하십시오. 요약:
- 걸을 수 있는 바닥과 그 위의 모든 것은 한 레이어에 유지합니다.
- 약 0.3 / 0.45 / 0.6 / 1.0의 속도 계수를 사용합니다.
- 백 레이어의 숨겨진 부분을 완전하고 매끄럽게 타일링되는 파노라마로 채웁니다.
- 애니메이션된 행 밴드만 시트로 제공합니다 (
pixkit.parallax).
-
패키징
references/packaging.md사용:still/,loop/<name>/frames_native/,_1920복사본 및 리뷰 mp4;- 모든 씬 팩에 대한 리뷰 PDF (
scripts/make_review_pdf.py); - 사용자 언어의 README.
3. 캐릭터 트랙
먼저 references/character-pipeline.md를 읽은 다음 references/character-animation.md를 읽으십시오.
-
첫 번째 초안:
python scripts/sprite_from_concept.py concept.png WORK --height 148 [--materials materials.json]캐스트의 나머지 부분과 동일한
--height를 사용하여 모든 사람이 하나의 배율을 공유하도록 하십시오. 스크립트는 다음을 씁니다:- 캔버스의 원시 스프라이트;
- 컨셉과의 비교;
- ASCII 덤프;
- 컨셉 좌표를 캔버스에 매핑하는
info.json.
--materials는 각 재료를 고정 램프에 스냅합니다. 영역을 사용하여 같은 색상의 재료를 분리하십시오 (칼라 위의 머리카락, 아래의 앞치마). 내부 획은 재료의 가장 어두운 톤이 됩니다. -
수동으로 베이스를 완성하십시오. 이것이 실제 작업이며 얼굴은 항상 필요합니다. 다운스케일은 눈과 입을 파괴하기 때문입니다.
pixkit.sprite.Symbols를 사용하여 영역을 텍스트로 덤프하고 칠하고grid_zoom으로 봅니다.- 컨셉의 눈 스타일을 유지하면서 얼굴을 다시 그립니다.
- 손과 소품을 정리합니다. 거의 중복되는 색상을 병합합니다.
fill_enclosed_holes. - 5배율로 컨셉과, 동일한 배율로 캐스트와 비교합니다.
-
무표정 얼굴 베이스 만들기: 눈, 입, 눈썹을 피부색으로 덮어 칠한 동일한 스프라이트입니다. 코와 기타 영구적인 특징은 그대로 둡니다.
-
캐릭터 구성 작성 (
assets/examples/character.example.json):- 얼굴 리그: 각 특징은 상자이고 각 상태는 작은 문자 그리드입니다.
- 표정;
- 대화-입 오버라이드;
- 추가 퍼포먼스;
- 사용자 언어의 미리보기 레이블;
- 법선 맵 파트 규칙;
- Unity 이름.
제작하기 전에 표정을 4–8배율로 서로 비교하여 디자인하십시오. 앞머리가 눈썹을 가릴 때 눈과 입이 표정을 전달합니다.
-
빌드 + 감사:
python scripts/build_character.py character.json.- 리그의 중립 얼굴이 픽셀 단위로 베이스를 재현하지 않으면 스크립트 실행을 거부합니다. 불일치는 모든 전환이 점프한다는 것을 의미하기 때문입니다.
- 전체 팩과
audit.json을 쓰고 문제가 있으면 0이 아닌 종료 코드로 종료합니다: 팔레트, 떠돌이 픽셀, 구멍, 연속성, 입 밖의 대화 프레임, 눈 밖의 깜빡임 프레임, 법선 맵 결정론.
-
확인하십시오.
previews/expressions_2x.png,previews/frames/*,previews/scale_with_cast_3x.png및previews/normals_lit_3x.png를 엽니다.- Playwright로
previews/interactive_preview.html을 재생하거나 사용자에게 열도록 요청하십시오. - 잘못된 것을 수정한 다음 다시 빌드하십시오.
4. 전달 및 반복
-
모든 전달은 새 버전입니다:
name_V01, 그 다음V02등. 이전 버전을 덮어쓰지 마십시오. README 상단에 변경 로그를 넣으십시오:- 변경된 사항;
- 이유 (해결 중인 피드백 인용);
- 확인된 사항.
변경하려는 의도가 없었던 모든 것은 픽셀 단위로 동일하게 유지하고, 확인하고, 그렇게 말하십시오.
-
사용자 언어의 README.
references/packaging.md의 섹션 패턴을 사용하십시오: 사양, 파일, 움직이는 것, 수정된 AI 아티팩트, 발견된 논리 문제, 확인 필요 사항, Unity 단계, 검사. 구체적인 숫자를 사용하십시오 ("264프레임 스캔, 13색, 0개의 떠돌이 픽셀"). Unity 내에서 실행된 적이 없는 스크립트는 테스트되지 않음으로 표시하십시오. -
추측 대신 미해결 질문을 제기하십시오. 예: 컨셉에 없었던 입이 추가된 경우; 동일한 카메라로 두 샷 사이에 이동한 캐릭터나 소품; 스토리의 시간대와 모순되는 장식 요소. 옵션을 제시하십시오.
-
zip과 1–3개의 주요 미리보기 이미지를 보내고 간단한 요약을 제공하십시오. 모든 단계를 설명하지 마십시오.
5. QA
모든 전달 전에 references/qa-checklist.md를 실행하십시오. 감사는 대부분을 자동화합니다. 확대/축소 시 시각적 검사가 나머지를 잡아냅니다: 찢어짐, 기어가는 디더, 흔들리면서 두께가 변하는 모양, 바닥과 함께 움직이지 않는 안개, 턱선에 닿는 입, 점프하는 반쪽 깜빡임.
참조 파일
| 파일 | 읽을 때 |
|---|---|
references/scene-pipeline.md | 씬 픽셀화: 스타일라이즈 매개변수, AI 아티팩트 및 논리 수정, 그레이드, 공유 팔레트 |
references/scene-loops.md | 정지 이미지 애니메이션: 효과 카탈로그 및 매개변수, 알려진 실패 모드, 램프 깜박임, CG 인물, 이미지-투-비디오 클립, 절차적 카메라 움직임, 시차 |
references/character-pipeline.md | 컨셉 → 1x 베이스 스프라이트, 얼굴 다시 그리기, ASCII 편집 |
references/character-animation.md | 얼굴 리그, 표정 디자인, 클립 세트 및 타이밍, 모션 규칙, 측면/후면/걷기 확장 |
references/normal-maps.md | 법선 맵 방법, 파트 규칙, Unity 조명 설정 |
references/packaging.md | 폴더 레이아웃, json/매니페스트 형식, README 템플릿, 검토 PDF |
references/qa-checklist.md | 모든 전달 전 |