スプライトシートメーカー:無料オンラインシート&アトラスビルダー
自分だけのスプライトシートメーカーを作成
フレームを1枚のシートに結合 — 列数、パディング、スケールを設定し、PNGとJSONアトラスを書き出します。または、1つのプロンプトからアニメーションシート全体を生成します。
スプライトシートメーカーの役割は1つです。個別のフレームをまとめて、既知の座標を持つ1枚の画像にパックします。PNG、JPG、WebPファイルを読み込み、列数、パディング、スケールを選択すると、PNGと、各フレーム名をx、y、width、heightの矩形にマッピングするJSONアトラスが出力されます。レンダラーが正しいセルを描画するために必要なのは、この矩形だけです。
この用語は2つの異なるツールを指します。1つはパッカーです。すでにフレームがあり、それを1枚のシートにまとめたい場合に使います。もう1つはジェネレーターです。プロンプトを書くと、一貫したスタイルのアニメーションキャラクターシート全体が得られます。Neta Studioのブラウザベース3Dワールドビルダーはその両方を扱い、出力は変換ステップなしでThree.jsシーンにそのまま組み込めます。
フレームからスプライトシートを作成
これがパッキングの経路です。フレームをドロップすると、シートは決定的に構築されます。左から右へ、上から下へ、指定した順序で並びます。最初のフレームがセル(0,0)を占め、2番目のフレームは1つ右のセルに配置され、行が埋まるまでこれが続き、その後パッキングは次の行に折り返します。
ここでは順序が何よりも重要です。パッカーはファイル名でソートせず、名前からアニメーショングループを推測することもありません。フレームにframe_1.pngからframe_8.pngまでの番号が付いていて、順序を間違えてドロップすると、書き出されたシートは誤ったものになり、JSONアトラスも誤った順序を忠実に記録します。ドロップする前にソートするか、書き出す前にサムネイルストリップを確認してください。
出力は2つのファイルです。PNGはパックされた画像です。JSONはフレーム名をキーとする小さなオブジェクトで、各値が矩形と元のサイズを保持します。ほとんどのエンジンはこのJSONをそのまま利用できます。利用できない場合でも、数値は手作業で再マッピングできるほど単純です。
01
フレームは透明付きのPNGとして書き出すか、アルファチャンネルが不要であればJPG/WebPで書き出します。すべてのフレームを同じピクセル寸法に保ちます。
02
フレームを再生順にパッカーへドロップします。サムネイルストリップが、アニメーションの再生どおりに左から右へ並んでいることを確認します。
03
列数を設定します。ほぼ正方形のシートにしたい場合は自動のままにし、1本の横長ストリップにしたい場合はフレーム数に固定します。
04
パディングとスケールを設定します。パディングはセル間に透明ピクセルを追加します。スケールは最近傍法を用いて各フレームを整数倍します。
05
PNGとJSONアトラスを一緒に書き出します。レンダラーに組み込む前に、JSON内の1つの矩形を目に見えるシートと照合して確認します。

プロンプトからスプライトシートを生成
スプライトメーカーの2つ目の意味は、グリッドパッキングとは関係ありません。キャラクターを説明すると、完全なシートが返ってきます。一貫したスタイルで描画されたポーズ一式が、すでにグリッドに配置された状態です。ソースアートをドロップする必要はありません。アートは出力そのものだからです。
有用なのは一貫性です。歩行サイクルの8方向を1回のパスで生成すると、シルエット、パレット、プロポーションがセル間で揃います。各フレームを別々のリクエストで生成すると揃わず、そのずれはフレーム間でキャラクターの質量が変わったように見える形で現れます。
Neta Studioは8方向の歩行サイクル、待機、攻撃、詠唱のセットを生成します。Agent Sprite Forgeは、これらのシートを生成するスタジオ内のアセットです。生成されたシートを3Dゲームビルダーのワールドにドロップし、パッカーが生成するはずだったのと同じアトラスJSONで駆動できます。
- 8方向の歩行8つのコンパス方向を網羅する1枚のシートにより、シーン内でキャラクターを回転させる処理は新しい生成ではなく行の参照に対応します。
- 待機、攻撃、詠唱歩行と同じスタイルで生成された個別のアクションセットにより、見た目のスタイルを崩さずに実行時に切り替えられます。
- スタイルの引き継ぎキャラクターを一度説明すれば、ポーズセットがパレットとプロポーションを継承します。これは、フレームを1つずつ生成する場合に通常失敗する部分です。
列数、パディング、スケール、JSONアトラス
4つの設定がシートを使い物になるかどうかを決めます。書き出し時に正しく設定してください。後から修正するとなると、再パッキングと、古い座標を参照していたすべてのアニメーションの再テストが必要になります。
JSONアトラスはシートとコードの間の契約です。フレームごとに、セルの位置とサイズを記録します。シートを変更してアトラスを再生成しないと、スプライトは誤った領域をサンプリングし、隣接フレームの帯がセルににじみ出ます。
- 列数折り返す前に1行あたり何個のセルを配置するかを決定します。横長ストリップでは列数はフレーム数と等しく、グリッドでは平方根に近い値を使います。
- パディングとスペーシングセル間に透明ピクセルを挿入します。これは、レンダラーが何らかのフィルタリングでサンプリングする場合に重要です。パディングがゼロだと、隣接フレームの端のピクセルが境界を越えてにじみ出すことがあります。
- スケール最近傍法を用いて各フレームを整数倍します。滑らかなフィルターによる非整数のスケーリングはピクセルの輪郭をぼかし、フレームを書き出した目的であるくっきりした見た目を損ないます。
- JSONアトラス各フレーム名をx、y、width、heightにマッピングします。原点は画像の左上ではなくキャラクターの足元として扱うと、地面への配置にフレームごとのオフセットが不要になります。
テクスチャアトラスとは
アトラスとは、多数の小さな画像を収めた1つのテクスチャと、それぞれがどこにあるかを記述するテーブルです。スプライトシートは、それらの小さな画像が同一の被写体のアニメーションフレームである一般的なケースです。
アトラスが存在する理由はドローコールです。フレームごとに別々のテクスチャをバインドすると、レンダラーはそれぞれの間で状態を切り替える必要があり、画面に多数のスプライトがあると、状態変化がフレーム時間を支配します。すべてを1つのテクスチャにパックすれば、グループ全体でバインドは1回です。ジオメトリは依然としてスプライトごとに描画されますが、テクスチャは変わりません。
トレードオフは、編集が大まかになることです。1つのフレームを変更すると、シートを再パッキングしてアトラスを更新する必要があり、古い矩形を保持しているコードはすべて誤ったものになります。だからこそ、アトラスは座標をハードコードするのではなくデータとして書き出されます。スプライトシートガイドでは、パッキングの判断についてより詳しく扱っています。
RPG、プラットフォーマー、アイソメトリック向けスプライトシートジェネレーター
望ましいレイアウトは、ほとんどジャンルによって決まります。RPGは方向とアニメーションのフェーズでインデックスするため、グリッドが自然に読めます。プラットフォーマーは通常一度に1つのアクションを実行するため、横長ストリップのほうが単純です。アイソメトリックのワールドでは、スプライトが重ならないよう、セルの寸法をダイヤモンド投影に合わせる必要があります。
列数を設定する前にレイアウトを選び、そのレイアウトに合わせて参照コードを書きます。ストリップベースのインデックスにグリッドを後付けするのは、機械的ですが退屈な変更で、すべてのアニメーション呼び出し箇所に影響します。
| ジャンル | 一般的なレイアウト | 備考 |
|---|---|---|
| RPG | 4方向グリッド | 行が方向、列がフレームです。方向、次にフェーズでインデックスします。 |
| プラットフォーマー | 横長の単一ストリップ | 1シートにつき1アクションです。再生は線形インデックスで、行の計算は不要です。 |
| アイソメトリック | ダイヤモンドセル | セルサイズは投影に合わせる必要があります。端のにじみを防ぐため、通常より多めにパディングします。 |
キャラクタースプライトシート
キャラクターが複数になると、キャストの一貫性を保つのが難しくなります。個別にはもっともらしいシートも、パレットがずれたり、プロポーションが変化したり、同じシーンに立つキャラクター間で光の方向が反転したりすると、全体として破綻します。
キャラクターのアクションセット全体を、アクションごとではなく1回のパスで生成します。パレットとプロポーションはパス内のポーズ間では引き継がれますが、パス間では引き継がれず、2体のキャラクターが同じフレームに収まった瞬間にその差は見えます。
キャスト内のすべてのキャラクターでセルサイズを同一に保ちます。アートがセルを埋めていなくても構いません。セルが統一されていれば、シーンはキャラクターごとのオフセットテーブルなしで、どのキャラクターをどのスロットにも配置できます。キャラクタースプライトメーカーのユースケースでは、キャスト全体についてこれを順を追って説明しています。
既存のシートを分割する
すでにシートがあり、フレームを取り出したい場合、それはパッキングではなくスライスであり、逆の操作です。GIFコンバーターとアニメーターがこの経路を扱います。シートを渡し、セルグリッドまたはフレーム境界を定義すると、個別のフレームが得られます。
スライスが失敗する原因は2つあります。パディングが不均一なシートは、推測したセルサイズで均等に分割できないため、画像幅を推定列数で割るのではなく、既知のセルを測定してください。非可逆形式から書き出されたシートはセル境界に沿って圧縮アーティファクトを帯びており、セルを分離して拡大するとそれらが見えるようになります。
その世界に入り込んで歩く
スプライトは、立つ場所を持たないキャラクターです。最後のステップは、他にはないものです。作ったばかりのシートを、誰かが歩き回れる世界に置きます。小さな島、惑星、雨の降る街角などです。このサイトのすべてのワールドは、1つの書かれた説明から作られ、プレイできるページとして公開されています。
FAQ
ソースフレームに使用できるファイル形式は何ですか? +
PNG、JPG、WebPです。このうちアルファチャンネルを確実に保持するのはPNGだけなので、透明が必要なものにはPNGを使用してください。
スプライトシートを拡大するとぼやけるのはなぜですか? +
非整数倍でスケーリングしたか、レンダラーが滑らかなフィルターを適用しています。整数倍のみでスケーリングし、テクスチャフィルターを最近傍法に設定してください。
フレーム間にパディングは必要ですか? +
通常は必要です。パディングがゼロでテクスチャフィルタリングがあると、あるフレームの端のピクセルが隣接セルへサンプリングされ、アニメーション中に目に見える継ぎ目が生じます。
JSONアトラスには実際に何が含まれますか? +
フレームごとに1つのエントリがあり、シート上のx、y、width、heightを保持します。一部のエクスポーターは元のフレームサイズと原点も記録します。キャラクターの場合、原点は通常足元にあります。
書き出し後に列数を変更できますか? +
再パッキングなしではできません。列数を変更するとシート上のすべてのフレームが移動するため、古いアトラスの矩形は正しいセルを指さなくなり、それらを参照するすべてのアニメーションが壊れます。
スプライトシートメーカーとスプライトシートジェネレーターの違いは何ですか? +
メーカーは、すでに持っているフレームをグリッドにパックします。ジェネレーターは、プロンプトからフレームを生成します。たとえば、一貫したスタイルの8方向歩行セット全体などです。つまり、アートは入力ではなく出力です。
3Dゲームビルダーに戻る
完成した31点の3Dワールド、ゲーム、シーンはすべて1つのページにあり、そのすべてがプレイ可能です。
ライブラリのテンプレートから始める
このライブラリのすべてのアセットは、透明でゲームにそのまま使えるPNGと、記録されたプロンプトです — Sprite resource libraryとFree sprite sheets、アクション、スタイル、被写体でタグ付けされています。閲覧とダウンロードは無料です。