Unityプロジェクトでピクセルパーフェクトな2Dレンダリングを設定、診断、修正します。
⚠️ 完全に別々の2つの実装があります
Unityのピクセルパーフェクトレンダリングは1つのシステムではありません。レンダーパイプラインごとに、互換性のない2つの独立した実装があります。コードを記述または診断する前に、必ずパイプラインを検出してください。
| URP | Built-in | |
|---|---|---|
| コンポーネント | UnityEngine.Rendering.Universal.PixelPerfectCamera | UnityEngine.U2D.PixelPerfectCamera |
| パッケージ | URPに組み込み — 追加インストール不要 | com.unity.2d.pixel-perfect v6.0.0以上 |
| APIスタイル | 列挙型(gridSnapping、cropFrame) | ブール値(pixelSnapping、upscaleRT、cropFrameX/Y) |
URPプロジェクトには com.unity.2d.pixel-perfect をインストールしないでください。
→ 常に最初に DetectPipeline() を呼び出し(references/pipeline-detection.cs)、その結果に基づいてセットアップ、診断、修正を分岐させてください。
このスキルを使用すべきでない場合
- HD 2Dや高解像度2Dゲーム — ピクセルスナップとポイントフィルタリングにより、滑らかなアートが不自然に見えます
- UIのみのシーン — 代わりにCanvas Scalerを使用してください
- HDRPプロジェクト — Pixel Perfect Cameraはサポートされていません
重要な注意点
⚠️ 最初にレンダーパイプラインを検出してください — URPとBuilt-inでは異なるPixel Perfect Cameraコンポーネントが使用され、互換性がありません。 ⚠️ フィルターモード = Pointが最も重要な修正です — バイリニアフィルタリングはUnityのデフォルトであり、スプライトがぼやける原因のほとんどです。 ⚠️ アンチエイリアシングは無効にする必要があります — 品質設定とカメラの両方で。AAはピクセルのエッジを積極的にぼかします。
主要な原則
1. パイプライン検出とカメラコンポーネントの選択
このファイル上部の2パス比較表を参照してください。アセンブリ名の注意点:スタンドアロンのBuilt-inパッケージは Runtime/ フォルダにインストールされますが、asmdefの "name" フィールドは Unity.2D.PixelPerfect であり、Runtime サフィックスは付きません。HDRPはサポートされていません — 「よくある問題」セクションのHDRPフォールバックセクションを参照してください。
→ コード:references/pipeline-detection.cs — DetectPipeline()、GetPixelPerfectCameraType()、および移行時の不一致チェック。
2. 診断優先のアプローチ
変更を行う前に必ず診断してください。調査結果を報告し、壊れているものだけを修正してください。
3. 適切なスコープで作業する
デフォルトはシーンスコープです。ユーザーが明示的に要求した場合にのみ、プロジェクト全体をスキャンしてください。
診断チェックリスト
スプライトインポート設定:
- フィルターモード =
Point (no filter)— 対象範囲のすべてのスプライトで - ミップマップ = 無効
- 圧縮 =
None/ 無圧縮 - PPUがシーン内のすべてのスプライトで一貫している
- スプライトピボットがカスタム/ピクセルモードに設定されている — 奇数サイズのスプライト(例:15×15)の中央ピボットは7.5pxに位置し、0.5pxの位置ずれが発生します
→ コード:references/sprite-settings.cs — GetImporter() および FixSpriteImportSettings()。
エディタースナップ設定:
- グリッドサイズ = すべての軸で
1 / assetsPPU(例:PPU 16 → 0.0625、PPU 100 → 0.01) - グリッドスナップがグリッドおよびスナップオーバーレイで有効
- 既存のGameObjectをスナップするには:選択 → Align Selected → All Axes
カメラ設定:
- カメラ投影 = 直交
- Pixel Perfect Cameraコンポーネントが存在し、パイプラインに適したタイプである
-
allowHDR、allowMSAA、allowDynamicResolutionがすべてfalse - シーンビューにカメラギズモに2つの緑色のバウンディングボックスが表示される — 実線 = 表示領域、点線 = 基準解像度
→ コード:references/camera-setup-urp.cs — URPカメラ + PP Cameraの完全な設定。
→ コード:references/camera-setup-builtin.cs — Built-inスタンドアロン設定。
プロジェクト品質設定:
- アンチエイリアシング = 品質設定で0
- 異方性フィルタリング = 無効
APIリファレンス
完全なプロパティ/メソッドテーブル、GridSnapping および CropFrame 列挙値、推奨設定:
→ references/api-reference.md — カメラ設定コードを作成またはレビューする際に参照してください。
列挙型の簡単な概要:
GridSnapping:None · PixelSnapping(標準) · UpscaleRenderTexture(本物の低解像度感;ポストプロセッシングやUIテキストとは互換性がありません)
CropFrame:None · Pillarbox · Letterbox · Windowbox(最も安全なデフォルト) · StretchFill
基準解像度
アセット作成前に選択してください。アセット制作開始後は変更しないでください。
| 基準解像度 | 1080p | 1440p | 4K |
|---|---|---|---|
| 320 × 180 | 6× | 8× | 12× |
| 480 × 270 | 4× | ~5.3× | 8× |
| 640 × 360 | 3× | 4× | 6× |
320×180が最も安全な一般的な選択肢です。整数倍が合わない画面(例:1366×768)の場合は、cropFrame = Windowbox を使用して黒いバーを追加し、小数倍にストレッチするのを避けてください。
移行と互換性
Built-inスタンドアロンコンポーネントを使用したURPプロジェクト
症状:DetectPipeline() がURPを返すが、カメラに UnityEngine.U2D.PixelPerfectCamera がある。スタンドアロンコンポーネントに ENABLE_URP 条件付きコードがあるため、症状は微妙です。
修正:
- パッケージマネージャーから
com.unity.2d.pixel-perfectを削除 - 各カメラから
UnityEngine.U2D.PixelPerfectCameraを削除 UnityEngine.Rendering.Universal.PixelPerfectCameraを追加- 再設定 — ブール値(
pixelSnapping、upscaleRT、cropFrameX/Y)が列挙型(gridSnapping、cropFrame)になります
→ 検出コード:references/pipeline-detection.cs(ファイル下部)。
古いURP名前空間(Unity 2022未満 / URP 13.x未満)
症状:UnityEngine.Experimental.Rendering.Universal を参照するコンパイラエラー。
修正:using UnityEngine.Experimental.Rendering.Universal; を using UnityEngine.Rendering.Universal; に置き換えてください。アセンブリ修飾されたタイプ文字列を更新してください。[MovedFrom] 属性が自動的にシリアル化を処理します — GameObject上のコンポーネントはアップグレード後も維持されます。
よくある問題と解決策
ぼやけたスプライト
修正:対象範囲のすべてのスプライトでフィルターモードをPointに設定し、ミップマップを無効にし、品質設定でAAを無効にします。
→ コード:references/sprite-settings.cs
タイルマップのタイル間の隙間
順番に確認してください — 負のセルギャップやPPU = 31.99のような回避策は、カメラが移動すると壊れます。
| # | チェック項目 | 修正方法 |
|---|---|---|
| 1 | スプライトアトラスでTight Packingがオフ、Padding ≥ 4、Sprite Packer Modeが有効? | エディター設定でSprite Packer Modeを有効にする;アトラスでPadding ≥ 4に設定し、Tight Packingをオフにする |
| 2 | タイルセットテクスチャとアトラスでミップマップが無効? | Generate Mip Mapsを無効にする |
| 3 | AA = 0、カメラでMSAAがオフ? | AAをグローバルに無効にする |
| 4 | 圧縮 = None? | RGBA 32ビット無圧縮 |
| 5 | すべてのタイルスプライトのピクセル寸法が偶数? | 奇数の寸法は0.5pxのグリッドオフセットを引き起こします |
| 6 | PPU = タイルのピクセル幅?(16×16 → PPU 16) | PPUの不一致は物理的な隙間を残します |
| 7 | 上記すべてを通過後、カメラ移動時のみ隙間が発生? | PP Cameraのピクセルスナップを使用;cellGap = -0.01f は使用しないでください |
Cinemachineとの競合
原因:CinemachineとPixel Perfect Cameraの両方が毎フレーム直交サイズに書き込みます。
修正:各Virtual CameraのAdd Extensionドロップダウンから CinemachinePixelPerfect 拡張を追加してください。コード内で AddComponent を使用して追加しないでください。
既知の制限事項:
- 仮想カメラ間のカメラブレンドは、遷移中はピクセルパーフェクトではありません
UpscaleRenderTextureは有効なピクセルパーフェクト直交サイズを減らし、フレーミングがずれる可能性があります- Target Group + Framing Transposerは目に見えるカクつきを引き起こします(修正不可)
upscaleRT 使用時のポストプロセッシングのぼやけ
原因:ポストプロセッシングはPP Cameraがレンダーテクスチャをアップスケールした後に実行されます。
簡単な修正:upscaleRT を無効にします。ポストプロセッシングはネイティブ画面解像度で実行されます。
高度な修正(Unity 6 URP):RenderPassEvent2D.AfterRenderingPostProcessing で ScriptableRendererFeature2D を注入します。2D固有の基本クラスを使用してください — ScriptableRendererFeature(3D基本クラス)はURP 2Dレンダラーでは静かに無視されます。
upscaleRT 使用時のUIテキストのぼやけ
ステータス:既知のUn