scenario-unity-2d について
Unity 6.3での2D制作を開発者やアーティスト向けに支援し、ピクセルアート、レベル、ライティング、アニメーション、カメラ、キャラクター制御を扱います。再現可能な測定、テスト、品質ゲートに基づく制作手順が特徴です。
主な機能
- 01ピクセルアートの取り込みとカメラ調整
- 02アトラスとTilemapの構築
- 032Dライティングのコスト評価
- 04キャラクター制御とアニメーション設定
- 05PlayModeテストと画面レビュー
活用シーン
- 01ピクセルアートの2Dプロジェクト作成
- 02Tilemapレベルの構築と検査
- 03キャラクターのジャンプ挙動の調整
- 04ライティングとカメラ表示の評価
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ scenario-labs/ skills --skill scenario-unity-2dインストール後、Claude Code で/scenario-unity-2dを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
references/critique.mdexpert-notes.mdgui-paths.mdprocedures.mdsources.mdscripts/AgentKit/TwoD/AnimJobs.csAtlasJobs.csAudit2D.csCameraJobs.csCinemachineJobs.csLevelJobs.csLightJobs.csPhysicsJobs.csSpriteJobs.csTilemapJobs.csTwoDSetup.csTwoDUtil.csscripts/Runtime/TwoD/AgentKit.TwoD.Runtime.asmdefCameraShake2D.csFallDampingSwitch.csHazard2D.csHitStop.csPlatformerAnimatorBridge.csPlatformerController2D.csPlatformerStats.csTopDownMover2D.csscripts/Runtime/TwoDCinemachine/AgentKit.TwoD.Cinemachine.asmdefCinemachine2DRig.csCinemachineFallDamping.csCinemachineRoomSwap.cs詳細
Unity 2D(開発者およびアーティスト向け)
Unity 6.3 での高度な 2D 制作は、数値とフレームで裏付けられた、相互に連動する設定の積み重ねです。アートからカメラまで一貫した PPU を使い、アトラスは節約できるものを基準に評価し、タイルとライトはデータとして作成してコストを算出します。カメラは整数ピクセル単位で動かし、コントローラーの操作感は主張するのではなく測定します。以下の内容はすべて、バッチジョブと PlayMode テストを通じて Unity 6000.3.21f1 で実行しました
(references/procedures.md)。ここで名前が挙がっている関連スキルが利用可能なスキルにない場合は、ユーザーにインストールを依頼してください
(npx skills add scenario-labs/skills --skill <name>)。無人で進める場合は、ツールスキーマに従って進行し、不足している点を明記してください。
必須の背景知識: scenario-unity-expert(チャンネル、レビューループ、6.3 の注意点)。
方針(エキスパートならではの違い)
- ピクセルパーフェクトは一連の工程であり、URPにはすでにカメラが含まれています。 すべてのスプライトでPPUを統一します(タイルのpx=1ユニット)。Point、Compression None、ピボットは整数ピクセル単位、Assets PPU=スプライトのPPUに設定します。URPでは
com.unity.2d.pixel-perfectをインストールしないでください。これはBuilt-inのコンポーネントです(6.3 Manual)。測定結果:1080pで均一な6 x 6ブロックが100%。 - 何をピクセル化するかでGrid Snappingを選び、動きの中でピクセルを確認します。 Pixel Snappingがスナップするのはスプライトだけです。ライト、ブルーム、パーティクルは画面解像度のままです(2qeNu2QApAM [00:01:47])。Upscale Render Textureはすべてをピクセル化します。Retro AAとPointの違いは、ちらつきとぼやけです(Manual)。また、URP 17.3ではStretch Fillのときだけ動作します。サブピクセル単位のパンで測定した結果:整数単位のフレーミングではアートのピクセル単位で動きます(剛性0.9997)。Stretch Fill Pointでは1フレームあたり0.6%のピクセルがちらつき、Retro AAでは柔らかさが2倍になる代わりに0.3%です。Pixel Perfect Cameraなしでは2.8%です。
- SRP Batcherでは、アトラスが削減するのはテクスチャであり、バッチ数やSetPassではありません。 測定結果は、バッチ数21/21、SetPass 2/2、バインドされたテクスチャ20から1です(Unity hXlpnwD-TgY [00:05:55]、[00:07:32])。メモリが減るのは使用率が高い場合だけです。ピクセルアートのページはNoneのままにして、圧縮はアトラス上で一度だけ行います。圧縮するとピクセルの色が変わります(2qeNu2QApAM [00:02:24])。
AuditAtlasesは6.3 Sprite Atlas AnalyzerのレポートとRead/Writeの状態を再現します。共視認性でグループ化する手順は、どのツールにもできません。 - コントローラーが速度を管理します。操作の許容度は設計上の選択肢であり、各テクニックは個別に切り替えられるようにします。 入力はUpdateで保持し、衝突、ジャンプ、水平方向の動き、重力の適用はFixedUpdateで行います。コヨーテタイムと入力バッファはタイムスタンプの時間枠で実装します(Tarodev source)。プレイヤーの意図に沿って動作させるため(Thorson、GMTK yorTG9at90g [00:11:03])、コヨーテタイム、入力バッファ、可変ジャンプ、落下速度制限、頂点での滞空、角での補正は、それぞれA/Bプレイ用のオン/オフ切り替えを用意します(Tarodev 3sWTzMsmdx8 [00:02:24])。また、危険物の当たり判定はアートより小さくします(GMTK [00:09:28])。次の2つは操作感に関わる判断であり、デフォルトではありません。可変高度の方式(速度を50%カットすると精密、重力をx3にすると滑らかで、ボタンを長押しすると上昇が持続します。Dawnosaur 2S3g8CgBG1g [00:00:36])と、空中摩擦(TarodevのAirDeceleration 30では、ボタンを離した後も3.1ユニット、キャラクターの幅5.7個分だけ流れます。Celesteの「非常に大きな空中摩擦」では、ほぼ真下に落下します。GMTK [00:04:14]。240では3ステップで停止します)。
- ライトはソーティングレイヤーで振り分けられ、ライトバッチごとにコストがかかります。 連続するソーティングレイヤーがライトバッチを共有できるのは、表示されるすべてのライトが両方を照らすか、どちらも照らさない場合だけです。ノーマル、シャドウ、ライトの各パスはバッチごとに1回実行されます(URP 17.3 source)。Charactersレイヤーを照らさないプレイヤーのフィルライト(Sasquatch 1h-hSlffawM [00:01:35])によって、デモレベルのバッチ数は1から4に増え、ライトの描画範囲は0.99画面分から3.64画面分になりました。コストはフィルレートです(e-book p. 131)。4Kで6回測定した結果、シャドウはx5.4からx5.9、バッチ分割は+72から+101%、ノーマルマップは+15から+36%、大きなライトと小さなライトの差は+8から+43%でした(ばらつきあり)。完全な暗闇のエリアは作らないでください(Global 0.25、GDC YhrwKF_i-BI [00:11:43])。ライトでノーマルマップを有効にし(GDC [00:12:31])、低スペック層ではFastを使います。
- スプライトアニメーションはブレンドせず、コントローラーに従います。 Exit timeをオフ、durationを0、Any Stateの自己遷移をオフにします。パラメーターには入力ではなく、コントローラーが実行した動作を反映させます(Brackeys hkaysu1Z-N8 [00:16:17]、[00:18:57])。
- カメラと演出は操作感の一部です。 上昇中は垂直方向のダンピングを弱くし、速度しきい値を超えて落下したら強くし、垂直速度が0になったら元に戻します(ヒステリシス)。補間して切り替えます(Sasquatch 9dzBrLUIF8g [00:05:37]、[00:07:14])。40ユニットの落下では、ダンピングを一律0.6秒にすると足が画面の下端に達しましたが、切り替え方式では画面内に3.2から3.4ユニット分の余裕を保てました。部屋のカメラは、出口の方向に応じてトリガーのEXIT時に切り替えます([00:14:43])。境界は秘密の部屋の終端にぴったり合わせます([00:02:10])。ヒットストップは、非スケール時間で20 ms(Nijman AJdEqssNZ-U [00:18:22])から67 ms(Celeste、GMTK [00:08:40])に設定します。積み重ねずに延長します。シェイクにはオフのオプションを用意します(Nijman [00:32:14])。
- GUIのみのエディターについては、実態を正直に伝えます。 Tile Palette、Rule Tileインスペクター、AutoTileマスク、Sprite Editor、Skinning Editor、Animatorウィンドウはマウス操作のツールです。エージェントは
Tilemap.SetTiles、RuleTile.m_TilingRules、RuleOverrideTile.ApplyOverrides、ISpriteEditorDataProvider、AnimatorControllerを通じて作成します。リギングとAutoTileマスクは人間が担当します(references/gui-paths.md)。
最初に確認すること
一度だけ確認します。ピクセルアートか HD か(既定値:ピクセル、16 PPU、320 x 180)、21:9 や
スマートフォンを含む対象画面、カメラモデル(固定ルーム、バイアスと落下減衰を加えて追従、アクションの
方向へ先行)、リアルタイム 2D ライトか描き込みの光か、および最低ティア、コントローラープロファイル
(精密型:速度を直接制御し、空中摩擦は高め;慣性型:空中摩擦は低め;物理重視型:力を使う Dynamic ボディ;
トップダウン型:速度)、タイル単位のジャンプの高さと可変ジャンプ高さの方式、ハザードと一方通行
プラットフォーム、入力デバイスを確認します。その後、ut_2d.project(P) を実行します。
ワークフロー
- プロジェクト。
TwoDSetup.ProjectSetup:ソートレイヤーを背面から前面の順に設定します(数は少なめにします。ライトの バッチ処理に影響するためです)。Player レイヤーと Ground レイヤーを設定します。GATE:順序を読み戻して確認済み、 ピクセルパーフェクトパッケージなし、Input System、固定ステップ 0.02 s。 - インポート。
SpriteJobs.ImportPixelArt(スライス、ピクセル単位のピボット、_NormalMap)またはImportHD(PPU = height / (2 x ortho)、電子書籍 p. 21)。形状のあるタイルにはSetPhysicsOutlineを設定します(16 px のスプライトは 4 点の長方形を生成します)。GATE:AuditSpritesのエラー 0 件、PPU は 1 種類。 - アトラス。 共に表示されるグループごとに
AtlasJobs.BuildAtlasを実行し、ライトありとなしは分けます。ピクセルページは 非圧縮にします。GATE:ページ 1 枚、指摘 0 件、グループ化ルールを記録済み。 - レベル。
TilemapJobs.CreateRuleTileとBuildLevelを実行します。スキンの差し替えにはCreateRuleOverrideTileを 使用します。Composite は Merge、Outlines、Static に設定します。実行時に編集する場合のみタイルごとのコライダーを使い、 その後 Use Delaunay Mesh を使用します。GATE:rule_mismatches == 0(スキン差し替えの読み戻しも含む)、落下プローブの 誤差が 0.05 units 以内、キャプチャに継ぎ目がないこと。 - キャラクターとアニメーション。
AnimJobs.BuildSpriteAnimatorとLevelJobs.Populateを実行します(プレイヤー、 ヒットボックスを内側に設定したスパイクのHazard2D、一方通行プラットフォーム)。GATE:LintAnimatorのエラー 0 件、 ヒットボックスとアートの比率が 1 未満。 - ライト。
LightJobs.LightRigを実行し、続けてLightJobs.LightCostを実行します(ティア。カメラ作成後にエンジンの 確認を一度行います)。GATE:Audit2Dのエラー 0 件、レプリカのライトバッチ数が URP 自体のカウントと一致、すべての バッチ分割と表示領域の半分を超えるすべてのライトに理由があること、法線マップのオン/オフを切り替えたキャプチャの ペアに差があること。 - カメラ。
CameraJobs.SetupPixelPerfectとCapturePixelPerfectを実行します。サブピクセル単位のパン (ut_2d.pan_shots)をut_2d.shimmer_checkで採点します。追従カメラにはCinemachineJobs.Setup(CM 3.1.7 に固定)とCinemachineFallDamping、CinemachineRoomSwapを使用します。GATE:1080p と 720p でpixel_block_check>= 0.999、 パンの最小リジッド値 >= 0.99、21:9 でvoid_columnsが 0、bounds_hide_secretsが ok、コンタクトシートを確認済み。 - 操作感。 シミュレートした入力で PlayMode テストを実施します(
ut_run.run_tests(P, "PlayMode", graphics=True))。 GATE:頂点が 50 Hz の予測値と一致、ウィンドウの誤差が 1 ステップ以内、30/60/144 fps で 1 回の押下につきジャンプ 1 回、 各切り替えを A/B テストし、方式と空中でのドリフト数値を明記します。操作感そのものは人間が判定します。切り替え項目と 数値を出荷します。 - 納品。
Audit2D.Sceneがクリーンであること、AgentProfile.PlayModeTimingsの予算チェックに合格していることを確認します。 各ステップについて Unity の呼び出しとともに報告し、その後に Verified と Assumed を記載します。
数値
| 値 | 基準 | 出典 |
|---|---|---|
| PPU = H / (2 x ortho size):4K、Size 5 で 216 | HD アート、最も近いズーム | 電子書籍 p. 21 |
| 320 x 180:x4 で 720p、x6 で 1080p、x8 で 1440p、x12 で 4K;16 PPU で ortho 5.625 | ピクセル基準 | マニュアル;[追加] 計算 |
| MaxSpeed 14、Accel 120、GroundDecel 60、AirDecel 30、JumpPower 36、FallAccel 110、MaxFall 40、release x3、Coyote 0.15 s、Buffer 0.2 s | Tarodev の統計値(u/s、u/s^2) | Tarodev リポジトリ |
| 50 Hz で頂点 5.536(式では 5.89)、上昇 0.32 s;タップ時:重力 x3 で 2.08、cut 0.5 で 1.81、維持(JumpPower 18.7)で 5.52 の 1.78 | 上記の統計値 | 実測、リプレイ |
| 最高速度で離した後の空中ドリフト:AirDecel 30 で 3.13 ユニット(24 ステップ)、240 で 0.27(3 ステップ) | 幅 0.55 ユニットのボディ | 実測 |
| Celeste:最高速度まで約 6 フレーム、停止まで 3 フレーム、ジャンプはボディの高さ約 3 個分(Mario は 4、Meat Boy は 6) | 60 fps のフレーム | GMTK [00:02:01]、[00:03:42] |
| 頂点付近の帯域では、5 u/s 未満で重力 x0.5(維持時に +0.08 s);角での微調整は 0.25 ユニット | 追加のテクニック | Dawnosaur [00:02:06];[追加] |
| ハザードの当たり判定の内側への縮小:側面 2 px、上部 3 px。16 x 8 のトゲに対して 0.75 x 0.625 | アート | [追加] の値 |
| 落下時の減衰:緩い場合 0.6 s、強い場合 0.1 s、-15 u/s 未満で切り替え、0 で戻し、0.2 s でブレンド | 追従カメラ | [追加] の値;ルールは Sasquatch |
| ヒットストップ 0.02~0.07 s | 実時間 | Nijman;GMTK |
| Global light 0.25;light render scale 0.5(テンプレート) | ライティング | GDC;観察値 |
| アトラスページ 1 枚;無駄領域のフラグ > 400 KB | アトラスごと | hXlpnwD-TgY |
| スプライトクリップは 1 秒あたり 12 サンプル | コマ送り | Brackeys [00:03:42] |
品質ゲート
- 測定可能: 監査でエラー 0(
AuditSprites、AuditAtlases、Audit2D、LintAnimator);rule_mismatches == 0;ドロッププローブ < 0.05;pixel_block_check>= 0.999;パンの剛性 >= 0.99; 21:9 でvoid_columns0;ライトバッチのレプリカ = エンジン;PlayMode スイートの失敗 0;ut_stat.summarize_csvによるフレーム予算の合格。 - 視覚: すべてのキャプチャを
ut_review.review_imagesに通し、開いて確認するコンタクトシートを用意します。ピクセルエッジは 2x で切り抜きます; ライティングのペア;critique.mdのセクション A~H。
よくある間違い
| 間違い | どのような問題が起きるか | 修正方法 |
|---|---|---|
| URP で 2D Pixel Perfect パッケージを使用する | コンポーネントが間違っており、設定が無視されます | URP の PixelPerfectCamera |
| スプライトごとに異なる PPU、Bilinear、圧縮を使用する | ぼやけ、色ずれ、ピクセルの不揃いが発生します | ImportPixelArt + AuditSprites |
| 静止画でちらつきを判定する | フレームは鮮明でも、動きの中でピクセルがちらつきます | pan_shots + shimmer_check;整数値の Crop Frame |
| OpenScene の直後に一括キャプチャする | Global ライトしか表示されません | CameraJobs.WarmLights2D |
| スクリプトで Light2D を追加する | シャドウは有効でも、法線は無効です(normalMapQuality は読み取り専用) | 両方を設定し、SerializedObject で m_NormalMapQuality を指定します |
| あるライトがソーティングレイヤーを 1 つ飛ばす | ライトのバッチが分割され、すべてのライトが再描画されます | 見た目に問題がない場合は Target Sorting Layers を統一し、LightCost を確認します |
| モバイルで Accurate normals、大きなライト、多数のシャドウを使う | フィルレートがボトルネックになります | Fast、小さめのライト、シャドウライトは 1~2 個にします |
| Batches や SetPass でアトラスを評価する | 「アトラスに効果がない」と感じます | 使用テクスチャとメモリを確認します |
| ピクセルアートのアトラスページを圧縮する | 単色ピクセルの色がずれます | ピクセル用ページでは Compression を None にします |
_timeJumpWasPressed = 0(Tarodev) | 最初の着地時に意図しないジャンプが発生します | float.MinValue |
| FixedUpdate で入力を読み取る | 高い FPS で入力が失われます | Update で入力を保持します |
| トリガーや一方通行プラットフォームに当たる地面・天井判定のキャスト | トリガー上で「接地」と判定されたり、プラットフォームの下で頭をぶつけたりします | useTriggers = false;一方通行コライダーをスキップします(PlatformerController2D と同様) |
| すべてのゲームで同じ AirDeceleration を使う | 小さなプラットフォームから滑り落ちる、または勢いがなくなります | レベルに合わせて選び、滑り具合を明示します |
| ハザードの当たり判定をアートと同じにする | 1 px かすっただけで死亡します | Hazard2D.FitHitbox で内側に調整します |
| 地面で Rotated ルールの変換を使う | 壁に草が生えます | Fixed または MirrorX |
| スキン変更のために Rule Tile を複製する | ルールの修正が二重に適用されたり、適用漏れが起きたりします | Rule Override Tile |
| スプライトの遷移をブレンドする | 切り替えが遅れ、にじみます | exit time をオフにし、duration を 0 にします |
| 追従カメラの垂直ダンピングを固定する | プレイヤーがフレームから外れます | CinemachineFallDamping |
| トリガー侵入時に部屋を切り替える | プレイヤーが引き返したときにカメラが間違います | 方向に応じて退出時に切り替えます |
古い Input.GetAxis | 実行時例外が発生します(テンプレート) | Input System のアクション |
引き継ぎ
- 受け取るもの: scenario-game-assets、scenario-sprite-pipeline、scenario-textures からのスプライトとタイル(PNG、想定 PPU、パレット);scenario-unity-architecture からの入力アクション;scenario-unity-rendering-lighting からのパイプラインアセット。
- 引き渡すもの: scenario-unity-animation には Cinemachine 3 のリグ(境界、オルソ、ピクセル比、落下時のダンピング、ルーム切り替え);scenario-unity-shaders には Sprite Custom Lit と Sort 3D as 2D のシェーダー;scenario-unity-vfx にはピクセルグリッドのパーティクル;scenario-unity-performance にはライトのバッチ、フィルライト、ベンチマーク数値;scenario-unity-mobile にはテクスチャ形式;scenario-unity-web には Web サイズ;scenario-unity-pipeline-automation にはポストプロセッサーと CI の実行結果;scenario-unity-ui には HUD;scenario-unity-gameplay にはプラットフォーマー以外の物理演算。すべてのパケットにジョブ ID、監査件数、PlayMode のメトリクス、コンタクトシートを含めます。
Unity 6.3 に関する注意事項
UnityEngine.Rendering.Universal.PixelPerfectCamera(URP 17.3):Grid Snapping ドロップダウンがあります。Filter Mode にパブリックセッターはありません。カメラ位置は各レンダリングの前にピクセルグリッドに丸められます。- Universal 2D テンプレート:Input System のみ、Sprite Atlas V2、2D Tooling 1.0.3(Window > Analysis > Sprite Atlas Analyzer)、Tilemap Extras 6.0.2(AutoTile マスクにパブリック API はありません)、2D Animation 13.0.5、SRP Batcher は有効です。Window > 2D > Light Batching Debugger で、
LightCostが計算するライトのバッチを確認できます。 Rigidbody2D.linearVelocity、bodyType;Physics2D.autoSyncTransformsは非推奨;LowLevelPhysics2D は 6.5 で PhysicsCore2D に名称変更されました。- 2D 内の 3D:Mesh2D-Lit-Default と Sort 3D as 2D;2D ライトは Sorting Group を介してメッシュに届きます。
- Cinemachine のデフォルトは 2.10.7 です。
com.unity.cinemachineを 3.1.7 に固定してください。コアは 6.6 に含まれます。ランタイムアトラスは 6.4 で導入されます。PVRTC は 6.4 で削除されます。
参考資料
references/procedures.md:手順 P0 から P14、Unity API、ライブテスト、測定結果。references/expert-notes.md:専門家別の原則、タイムスタンプ、判断条件。references/critique.md:評価基準(インポート、アトラス、タイル、ライト、カメラ、操作感、アニメーションと演出、レポート)。references/gui-paths.md:同じ作業に使うウィンドウとメニュー。references/sources.md:情報源、認証情報、タイムスタンプ、改訂履歴。scripts/ut_2d.py:インストール、解像度、操作感の計算(ジャンプ方式、空中ドリフト)、アート生成ツール、pixel_block_check、shimmer_check、void_columns、bounds_hide_secrets、メトリクス。scripts/AgentKit/TwoD/:エディタージョブ(セットアップ、スプライト、アトラス、タイルマップ、レベル、ライトとライトコスト、カメラ、Cinemachine、アニメーション、監査、LowLevelPhysics2D)。scripts/Runtime/TwoD/:PlatformerController2D、PlatformerStats、Hazard2D、FallDampingSwitch、PlatformerAnimatorBridge、HitStop、CameraShake2D、TopDownMover2D;scripts/Runtime/TwoDCinemachine/:Cinemachine2DRig、CinemachineFallDamping、CinemachineRoomSwap(CM3 でのみコンパイル)。