コンセプトアート → ピクセルアートシーン、ループ、キャラクターパック
このスキルは、ゲームチームとの何度ものレビューを経て洗練された制作ワークフローを実現します。スクリプトは機械的な部分を担当します。以下のルールの方が重要です。これらはレビュアーが繰り返し要求した内容なので、デフォルトでこれらに従い、ユーザーから明示的に依頼された場合のみルールを破ってください。
2つのトラックは共通のツールキット(scripts/pixkitとscripts/内のCLI)を共有します。
| トラック | 入力 | 出力 |
|---|---|---|
| シーン(背景 / CG) | ショットごとに1枚のコンセプト画像 | ネイティブ静止画 + 正確な3倍コピー、オプションの48フレームシームレスループ、オプションの視差レイヤー、レビュー用PDF、README |
| キャラクター | キャラクターの正面コンセプト1枚 | 1x正面スプライト、8~13の表情、表情ごとのIdle/Talk、To_/From_遷移、Nod/Nod_Slow/HeadShake(+ カスタムワンショット)、法線マップ、シート+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のアウトライン、キャスト全体で1つのアウトライン色 |
| モーション | 48フレーム、12 fps、4秒、シームレス | フレームごとの持続時間(ms)(60 fpsグリッド準拠) |
| Unity | Pointフィルター、圧縮なし、Max Size 4096、PPU 32 | 同上; ピボット (0.5, 0.025) |
1. ハウスルール
各ルールは、レビュアーが行った修正に由来します。これらは好みではありません。
- 1xピクセル密度。 1つのアートピクセルは1つのゲームピクセルに相当するため、詳細密度を2倍にしないでください。シーンはネイティブサイズで構築され、整数倍でのみ拡大縮小されます。
- すべてをパレット固定に。 アニメーションフレームは、静止画自体の色のみを使用できます。
loopfx内のすべてのエフェクトはパレットインデックスで動作するため、新しい色は出現できません。 - フレーム0 = 静止画、ループはシームレス。 すべてのモーションは周期の関数であり、周期は整数です。ループのフレーム0を静止画(
*_STILL_frame0.png)として同梱し、2つをジャンプなく交換できるようにします。 - 目はまばたくだけ。 ユーザーが特定の視線を要求しない限り、一瞥、目玉の動き、見回す動作は禁止です。要求された場合は、その1つの視線のみを作成し、それ以上は作りません(例:「1秒間下を向く」というリクエスト)。
- 髪は、物理的に動かすもの(頭のうなずき、体の歩行や回転)がある場合のみ動く。 風や呼吸によるゆらぎは禁止です。1pxの呼吸による痙攣はグリッチと認識されるためです。
- 剛体は決して揺れない。 道路、ガードレール、柱、ドック、岩、家具、車内はすべてのフレームでピクセル固定(
staticマスク)にします。水の波紋は、岸、柱、葦から2~3 px離してください。 - 単一ピクセルの点滅は禁止。 孤立したピクセルの点滅はデッドピクセルと認識されます。埃は漂うものであり、きらめくものではありません。きらめきはまばらに保ちます。
- ブロック全体をピクセル単位で動かす。 呼吸は胸部より上のすべてを1 px持ち上げます。うなずきは頭部ブロックを1 px動かします。行を独立してずらさないでください。それはアウトラインを引き裂きます(「撕裂」)。
- 表情はまばたきの中で入れ替える。 顔は目が閉じている間に変化します。すべてのワンショットクリップはIdleフレーム0で開始し、ターゲットのIdleフレーム0で正確に終了します。
- AIが間違えた部分を修正し、ストーリーはそのままにする。 AIアーティファクト(まだらな表面、疑似テキスト、不定形な塊、欠けた手、ありえない光、ありえない装飾)を削除します。ストーリーに関連するコンテンツ(キャラクター、手がかり、文字)を自分で追加または移動しないでください。それらのケースは「確認が必要」としてリストアップします。
- 同じカメラ、同じピクセル。 2つのショットがカメラまたは場所を共有する場合、確立されたピクセルを再利用します。これは、部屋、車内、ランプのちらつきのタイミング、パレットに適用されます。それらの間のカットはジャンプしてはいけません。
- 「Xをアニメーション化しない」を尊重する。 ユーザーが静止画のみを要求した場合、または何かを動かさないように要求した場合、それをロックし、他は何も変更しません。
2. シーントラック
最初のシーンの前に references/scene-pipeline.md を読んでください。アニメーション化する前に references/scene-loops.md を、そしてレイヤリングの前にその視差セクションを読んでください。
-
2段階でピクセル化し、その間に手動修正を挟めるようにする。
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は、シーンのロジックを伝える正確な形状を持つ小道具に使用します。--smoothは、ざらついた、GIF、またはJPEGソースに使用します。ステージ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を確認します。数値だけではすべてを捕捉できません。
-
視差(カメラがスクロールする場合):リファレンスを参照してください。簡潔に:
- 歩行可能な地面とその上のすべてを1つのレイヤーに保ちます;
- 約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を使用して、全員が1つのスケールを共有するようにします。スクリプトは以下を書き出します:- キャンバス上の生のスプライト;
- コンセプトとの比較;
- 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内で実行されなかったスクリプトは「未テスト」とマークします。 -
推測ではなく、未解決の質問を提起する。 例:コンセプトになかった口が追加された場合;同じカメラで撮影された2つのショット間で移動したキャラクターや小道具;ストーリーの時間帯と矛盾する装飾要素。選択肢を提示します。
-
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 | すべての納品前 |