概念藝術 → 像素場景、循環動畫與角色套件
此技能擷取了一套經遊戲團隊多次審查迭代而最佳化的生產流程。腳本負責機械性部分。以下規則更為重要:它們是審查者一再要求的項目,因此請預設遵循它們,僅在使用者要求時才進行調整。
兩條生產線共用同一套工具(scripts/pixkit 以及 scripts/ 下的 CLI 工具):
| 生產線 | 輸入 | 輸出 |
|---|---|---|
| 場景(背景 / CG) | 每個鏡頭 1 張概念圖 | 原生靜態圖 + 精確 3 倍放大版、可選 48 幀無縫循環、可選視差圖層、審查 PDF、README |
| 角色 | 角色正面概念圖 | 1x 正面精靈、8–13 種表情、每種表情的 Idle/Talk 動畫、To_/From_ 過渡、Nod/Nod_Slow/HeadShake(與自訂一次性動畫)、法線貼圖、Sprite Sheet + 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、清單、精靈)。新角色必須與整個角色陣容共用相同的畫布、腳底線、每單位像素數、輪廓線顏色與高度比例。新背景必須共用原生尺寸、調色盤大小、色階與暗角。套件間的一致性比任何單一素材的好看來得更重要。如果尚無現有慣例,請提出以下預設值並註明。
- 僅在範圍真正不明確時才確認範圍。 對於角色,詢問是否僅製作正面套件,或同時包含側面/背面/走路動作。對於場景,若不確定是否需要動畫(某些鏡頭應保持靜止),請詢問使用者。否則直接開始工作;無需為顯而易見的下一步取得許可。
- 保護使用者作品的隱私。 直接交付檔案(壓縮檔 + 關鍵預覽圖)。除非使用者要求,否則不要將其作品或衍生精靈發布到公開頁面。
預設值(請根據專案修改):
| 場景 | 角色 | |
|---|---|---|
| 尺寸 | 640×360 原生;1920×1080 = 精確 3 倍 nearest 放大 | 96×160 畫布,腳底線 y=155,雙腳中心位於 x=48 |
| 顏色 | 每張圖片 24 色(色盤鎖定) | 每種材質使用少數顏色的漸層,整個套件約 10–30 色 |
| 線條 | 來自原始藝術作品 | 1 像素輪廓線,整個角色陣容共用一種輪廓線顏色 |
| 動作 | 48 幀,12 fps,4 秒,無縫 | 每幀持續時間以毫秒為單位(基於 60 fps 格線) |
| Unity | 點濾鏡,無壓縮,Max Size 4096,PPU 32 | 同上;Pivot (0.5, 0.025) |
1. 基本規則
每條規則都來自審查者提出的修正。它們並非個人品味問題。
- 1x 像素密度。 一個藝術像素等於一個遊戲像素,因此絕對不要提高細節密度。場景以原生尺寸建構,僅能以整數倍數縮放。
- 所有內容皆色盤鎖定。 動畫幀僅能使用靜態圖本身的顏色。
loopfx中的每個效果都作用於色盤索引,因此不會出現新顏色。 - 第 0 幀 = 靜態圖,且循環是無縫的。 每個動作都是週期的函數,且循環次數為整數。將循環的第 0 幀作為靜態圖輸出(
*_STILL_frame0.png),以便兩者可以無跳躍地互換。 - 眼睛僅用於眨眼。 除非使用者要求特定的眼神方向,否則不要有視線移動、眼睛轉動或四處張望。當使用者要求時,僅製作該特定眼神,不要多做(例如,「向下看 1 秒」)。
- 頭髮僅在受物理力量驅動時移動: 頭部點頭、身體邁步或轉向。不要有風吹或呼吸導致的飄動,因為每次呼吸帶來的 1 像素抖動看起來像是一個錯誤。
- 剛性物體永不晃動。 道路、護欄、柱子、碼頭、岩石、家具和汽車內裝在每一幀中都保持像素鎖定(使用
static遮罩)。讓水波漣漪與海岸線、柱子、蘆葦保持 2 到 3 像素的距離。 - 無單像素閃爍。 一個孤立的閃爍像素看起來像一個壞點。灰塵應是飄移的,而非閃爍。閃光點要保持稀疏。
- 以整像素移動整個區塊。 呼吸動作將整個胸部以上的區域向上移動 1 像素。點頭動作將頭部區塊移動 1 像素。切勿獨立偏移像素行,這會撕裂輪廓線。
- 在眨眼的同時切換表情。 在眼睛閉合的期間改變臉部表情。每個一次性動畫剪輯從 Idle 的第 0 幀開始,並準確結束於其目標 Idle 的第 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 的速度因子;
- 將後方圖層的隱藏部分補全為完整的、可無縫拼接的全景圖;
- 僅輸出動畫行帶作為 Sprite Sheet(使用
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,並在遇到任何問題時以非零狀態碼退出:調色盤、遊離像素、空洞、連續性、說話幀超出嘴巴範圍、眨眼幀超出眼睛範圍、法線貼圖不確定性。
-
仔細檢查。
- 開啟
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 內部執行過的腳本標記為未測試。 -
提出未決問題,而不是猜測。 範例:概念圖中沒有嘴巴卻添加了嘴巴;一個角色或道具在兩個使用相同攝影機的鏡頭之間移動了位置;一個裝飾元素與故事中的時間點矛盾。提供選項。
-
發送壓縮檔加上 1 到 3 張關鍵預覽圖,並提供簡短摘要。不要敘述每一個步驟。
5. 品質保證
每次交付前,請執行 references/qa-checklist.md。稽核程式會自動處理大部分檢查。縮放後的視覺檢查則負責捕捉其餘問題:撕裂、抖動的遞色、搖晃時厚度變化的形狀、不隨其地面移動的霧氣、接觸下巴線的嘴巴,以及跳躍的半眨眼。
參考檔案
| 檔案 | 閱讀時機 |
|---|---|
references/scene-pipeline.md | 將任何場景像素化時:stylize 參數、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 / manifest 格式、README 模板、審查 PDF |
references/qa-checklist.md | 每次交付前 |