Richten Sie pixelgenaues 2D-Rendering in Unity-Projekten ein, diagnostizieren und beheben Sie es.
⚠️ Es gibt zwei komplett separate Implementierungen
Pixelgenaues Rendering in Unity ist nicht ein System — es sind zwei separate, inkompatible Implementierungen, eine pro Render-Pipeline. Erkennen Sie immer die Pipeline, bevor Sie Code schreiben oder diagnostizieren.
| URP | Built-in | |
|---|---|---|
| Komponente | UnityEngine.Rendering.Universal.PixelPerfectCamera | UnityEngine.U2D.PixelPerfectCamera |
| Paket | In URP integriert — keine zusätzliche Installation | com.unity.2d.pixel-perfect v6.0.0+ |
| API-Stil | Enums (gridSnapping, cropFrame) | Booleans (pixelSnapping, upscaleRT, cropFrameX/Y) |
Installieren Sie com.unity.2d.pixel-perfect nicht in einem URP-Projekt.
→ Rufen Sie immer zuerst DetectPipeline() auf (references/pipeline-detection.cs), dann verzweigen Sie Ihre Einrichtung, Diagnose und Fehlerbehebung basierend auf dem Ergebnis.
Wann diese Fähigkeit NICHT verwendet werden sollte
- HD 2D- oder hochauflösende 2D-Spiele — Pixel-Snapping und Point-Filtering lassen glatte Grafiken falsch aussehen
- Nur-UI-Szenen — verwenden Sie stattdessen den Canvas Scaler
- HDRP-Projekte — Pixel Perfect Camera wird nicht unterstützt
Kritische Erinnerungen
⚠️ Erkennen Sie zuerst die Render-Pipeline — URP und Built-in verwenden unterschiedliche Pixel Perfect Camera-Komponenten, die nicht austauschbar sind. ⚠️ Filter Mode = Point ist die #1-Lösung — Bilineare Filterung ist Unitys Standard und fast immer die Ursache für verschwommene Sprites. ⚠️ Anti-Aliasing muss deaktiviert werden — in den Qualitätseinstellungen und an der Kamera. AA verwischt aktiv Pixelkanten.
Schlüsselprinzipien
1. Pipeline-Erkennung & Kamera-Komponentenauswahl
Siehe die Zwei-Pfade-Vergleichstabelle am Anfang dieser Datei. Hinweis zum Assembly-Namen: Das eigenständige Built-in-Paket installiert in einem Runtime/-Ordner, aber das asmdef "name"-Feld ist Unity.2D.PixelPerfect — ohne Runtime-Suffix. HDRP wird nicht unterstützt — siehe den HDRP-Fallback-Abschnitt unter Häufige Probleme.
→ Code: references/pipeline-detection.cs — DetectPipeline(), GetPixelPerfectCameraType() und Migrations-Mismatch-Prüfung.
2. Diagnose-zuerst-Ansatz
Diagnostizieren Sie immer, bevor Sie Änderungen vornehmen. Melden Sie die Ergebnisse und beheben Sie dann nur, was defekt ist.
3. Arbeiten Sie im richtigen Gültigkeitsbereich
Standardmäßig im Szenenbereich. Durchsuchen Sie das gesamte Projekt nur, wenn der Benutzer dies ausdrücklich anfordert.
Diagnose-Checkliste
Sprite-Importeinstellungen:
- Filter Mode =
Point (no filter)auf allen relevanten Sprites - Mip Maps = deaktiviert
- Komprimierung =
None/ Unkomprimiert - PPU konsistent über alle Sprites in der Szene
- Sprite-Pivots auf Custom / Pixels Modus gesetzt — ein zentraler Pivot auf einem Sprite mit ungeraden Abmessungen (z.B. 15×15) landet bei 7,5px, was einen 0,5px-Versatz verursacht
→ Code: references/sprite-settings.cs — GetImporter() und FixSpriteImportSettings().
Editor-Snap-Einstellungen:
- Grid-Größe =
1 / assetsPPUauf allen Achsen (z.B. PPU 16 → 0,0625, PPU 100 → 0,01) - Grid-Snapping im Grid- und Snap-Overlay aktiviert
- Zum Snappen vorhandener GameObjects: diese auswählen → Align Selected → All Axes
Kameraeinrichtung:
- Kameraprojektion = Orthographic
- Pixel Perfect Camera-Komponente vorhanden und korrekter Typ für die Pipeline
-
allowHDR,allowMSAA,allowDynamicResolutionallefalse - Die Szenenansicht zeigt zwei grüne Begrenzungsrahmen auf dem Kamera-Gizmo — durchgehend = sichtbarer Bereich, gepunktet = Referenzauflösung
→ Code: references/camera-setup-urp.cs — vollständige URP-Kamera + PP-Kamera-Konfiguration.
→ Code: references/camera-setup-builtin.cs — eigenständige Built-in-Konfiguration.
Projekt-Qualitätseinstellungen:
- Anti-Aliasing = 0 in den Qualitätseinstellungen
- Anisotrope Filterung = Deaktiviert
API-Referenz
Vollständige Tabellen mit Eigenschaften/Methoden, GridSnapping- und CropFrame-Enum-Werte und empfohlene Konfigurationen:
→ references/api-reference.md — lesen Sie dies, wenn Sie Kameraeinrichtungscode schreiben oder überprüfen.
Kurze Enum-Zusammenfassung:
GridSnapping: None · PixelSnapping (Standard) · UpscaleRenderTexture (authentisch niedrige Auflösung; inkompatibel mit Nachbearbeitung und UI-Text)
CropFrame: None · Pillarbox · Letterbox · Windowbox (sicherster Standard) · StretchFill
Referenzauflösung
Wählen Sie aus, bevor Sie Assets erstellen. Ändern Sie sie nie, nachdem die Asset-Produktion begonnen hat.
| Referenzauflösung | 1080p | 1440p | 4K |
|---|---|---|---|
| 320 × 180 | 6× | 8× | 12× |
| 480 × 270 | 4× | ~5,3× | 8× |
| 640 × 360 | 3× | 4× | 6× |
320×180 ist die sicherste allgemeine Wahl. Für Bildschirme ohne ganzzahligen Skalierungsfaktor (z.B. 1366×768) verwenden Sie cropFrame = Windowbox, um schwarze Balken hinzuzufügen, anstatt auf einen Bruchfaktor zu skalieren.
Migration & Kompatibilität
URP-Projekt mit der eigenständigen Built-in-Komponente
Symptom: DetectPipeline() gibt URP zurück, aber die Kamera hat UnityEngine.U2D.PixelPerfectCamera. Symptome sind subtil, da die eigenständige Komponente ENABLE_URP-bedingten Code hat.
Fix:
- Entfernen Sie
com.unity.2d.pixel-perfectaus dem Paketmanager - Entfernen Sie
UnityEngine.U2D.PixelPerfectCameravon jeder Kamera - Fügen Sie
UnityEngine.Rendering.Universal.PixelPerfectCamerahinzu - Konfigurieren Sie neu — Booleans (
pixelSnapping,upscaleRT,cropFrameX/Y) werden zu Enums (gridSnapping,cropFrame)
→ Erkennungscode: references/pipeline-detection.cs (Ende der Datei).
Alter URP-Namespace (vor Unity 2022 / URP vor 13.x)
Symptom: Compilerfehler, die auf UnityEngine.Experimental.Rendering.Universal verweisen.
Fix: Ersetzen Sie using UnityEngine.Experimental.Rendering.Universal; durch using UnityEngine.Rendering.Universal;. Aktualisieren Sie alle assembly-qualifizierten Typzeichenfolgen. Das [MovedFrom]-Attribut kümmert sich automatisch um die Serialisierung — Komponenten auf GameObjects überleben das Upgrade.
Häufige Probleme & Lösungen
Verschwommene Sprites
Fix: Setzen Sie Filter Mode auf Point für alle relevanten Sprites, deaktivieren Sie Mip Maps und deaktivieren Sie AA in den Qualitätseinstellungen.
→ Code: references/sprite-settings.cs
Tilemap-Lücken zwischen Kacheln
Arbeiten Sie der Reihe nach durch — Workarounds wie negativer Zellabstand oder PPU = 31,99 brechen, wenn sich die Kamera bewegt.
| # | Überprüfung | Fix |
|---|---|---|
| 1 | Sprite-Atlas mit Tight Packing aus, Padding ≥ 4, Sprite Packer Mode aktiviert? | Aktivieren Sie den Sprite Packer Mode in den Editor-Einstellungen; setzen Sie im Atlas Padding ≥ 4 und schalten Sie Tight Packing aus |
| 2 | Mipmaps auf Kacheltexturen und Atlas deaktiviert? | Deaktivieren Sie Generate Mip Maps |
| 3 | AA = 0, MSAA an der Kamera aus? | Deaktivieren Sie AA global |
| 4 | Komprimierung = None? | RGBA 32-Bit unkomprimiert |
| 5 | Alle Kachel-Sprites haben gerade Pixelabmessungen? | Ungerade Abmessungen verursachen einen 0,5px-Grid-Versatz |
| 6 | PPU = Kachel-Pixelbreite? (16×16 → PPU 16) | PPU-Mismatch hinterlässt physische Lücken |
| 7 | Lücken nur während Kamerabewegung, nachdem alle oben genannten Punkte bestanden sind? | Verwenden Sie PP-Kamera-Pixel-Snapping; verwenden Sie nicht cellGap = -0.01f |
Cinemachine-Konflikt
Ursache: Sowohl Cinemachine als auch die Pixel Perfect Camera schreiben jedes Bild in die orthografische Größe.
Fix: Fügen Sie die CinemachinePixelPerfect-Erweiterung über das Dropdown-Menü „Add Extension“ auf jeder virtuellen Kamera hinzu. Fügen Sie sie nicht über AddComponent im Code hinzu.
Bekannte Einschränkungen:
- Kamera-Überblendungen zwischen virtuellen Kameras sind während Übergängen nicht pixelgenau
UpscaleRenderTexturereduziert gültige pixelgenaue orthografische Größen, was zu Abweichungen beim Bildausschnitt führen kann- Target Group + Framing Transposer verursachen sichtbare Ruckler (keine Lösung verfügbar)
Nachbearbeitungsunschärfe mit upscaleRT
Ursache: Die Nachbearbeitung läuft, nachdem die PP-Kamera die Render-Textur hochskaliert hat.
Einfache Lösung: Deaktivieren Sie upscaleRT. Die Nachbearbeitung läuft dann in nativer Bildschirmauflösung.
Erweiterte Lösung (Unity 6 URP): Fügen Sie eine ScriptableRendererFeature2D bei RenderPassEvent2D.AfterRenderingPostProcessing ein. Verwenden Sie 2D-spezifische Basisklassen — ScriptableRendererFeature (3D-Basisklasse) wird in einem URP 2D-Renderer stillschweigend ignoriert.
UI-Text verschwommen mit upscaleRT
Status: Bekanntes U