Configurer, diagnostiquer et corriger le rendu pixel perfect 2D dans les projets Unity.
⚠️ Il existe deux implémentations complètement séparées
Le rendu pixel perfect dans Unity n'est pas un système unique — il s'agit de deux implémentations distinctes et incompatibles, une par pipeline de rendu. Détectez toujours le pipeline avant d'écrire ou de diagnostiquer du code.
| URP | Built-in | |
|---|---|---|
| Composant | UnityEngine.Rendering.Universal.PixelPerfectCamera | UnityEngine.U2D.PixelPerfectCamera |
| Package | Intégré dans URP — pas d'installation supplémentaire | com.unity.2d.pixel-perfect v6.0.0+ |
| Style d'API | Énumérations (gridSnapping, cropFrame) | Booléens (pixelSnapping, upscaleRT, cropFrameX/Y) |
N'installez pas com.unity.2d.pixel-perfect dans un projet URP.
→ Appelez toujours DetectPipeline() en premier (references/pipeline-detection.cs), puis branchez votre configuration, vos diagnostics et vos correctifs en fonction du résultat.
Quand NE PAS utiliser cette compétence
- Jeux HD 2D ou haute résolution 2D — le pixel snapping et le filtrage ponctuel rendront l'art lisse incorrect
- Scènes d'interface utilisateur uniquement — utilisez plutôt Canvas Scaler
- Projets HDRP — Pixel Perfect Camera n'est pas pris en charge
Rappels critiques
⚠️ Détectez d'abord le pipeline de rendu — URP et Built-in utilisent des composants Pixel Perfect Camera différents qui ne sont pas interchangeables. ⚠️ Le mode de filtre = Point est le correctif n°1 — le filtrage bilinéaire est la valeur par défaut d'Unity et est presque toujours la cause des sprites flous. ⚠️ L'anti-aliasing doit être désactivé — dans les paramètres de qualité et sur la caméra. L'AA brouille activement les bords des pixels.
Principes clés
1. Détection du pipeline et sélection du composant de caméra
Voir le tableau de comparaison des deux chemins en haut de ce fichier. Note sur le nom de l'assembly : le package autonome Built-in s'installe dans un dossier Runtime/, mais le champ "name" de l'asmdef est Unity.2D.PixelPerfect — pas de suffixe Runtime. HDRP n'est pas pris en charge — voir la section de repli HDRP sous Problèmes courants.
→ Code : references/pipeline-detection.cs — DetectPipeline(), GetPixelPerfectCameraType(), et vérification des écarts de migration.
2. Approche axée sur le diagnostic en premier
Diagnostiquez toujours avant d'apporter des modifications. Rapportez les résultats, puis corrigez uniquement ce qui est cassé.
3. Travaillez dans le bon scope
Par défaut, travaillez au niveau de la scène. Analysez à l'échelle du projet uniquement si l'utilisateur le demande explicitement.
Liste de contrôle de diagnostic
Paramètres d'importation des sprites :
- Mode de filtre =
Point (sans filtre)sur tous les sprites concernés - Mip Maps = désactivés
- Compression =
Aucune/ Non compressé - PPU cohérent sur tous les sprites de la scène
- Pivots des sprites réglés sur Personnalisé / mode Pixels — un pivot central sur un sprite de dimensions impaires (par exemple 15×15) atterrit à 7,5 px, provoquant un décalage de 0,5 px
→ Code : references/sprite-settings.cs — GetImporter() et FixSpriteImportSettings().
Paramètres de snapping de l'éditeur :
- Taille de la grille =
1 / assetsPPUsur tous les axes (par exemple PPU 16 → 0,0625, PPU 100 → 0,01) - Snapping de grille activé dans la superposition Grille et Snap
- Pour accrocher les GameObjects existants : sélectionnez-les → Aligner la sélection → Tous les axes
Configuration de la caméra :
- Projection de la caméra = Orthographique
- Composant Pixel Perfect Camera présent et type correct pour le pipeline
-
allowHDR,allowMSAA,allowDynamicResolutiontousfalse - La vue Scène montre deux boîtes englobantes vertes sur le gizmo de la caméra — plein = zone visible, pointillé = résolution de référence
→ Code : references/camera-setup-urp.cs — configuration complète de la caméra URP + PP Camera.
→ Code : references/camera-setup-builtin.cs — configuration autonome Built-in.
Paramètres de qualité du projet :
- Anti-Aliasing = 0 dans les paramètres de qualité
- Filtrage anisotrope = Désactivé
Référence API
Tableaux complets des propriétés/méthodes, valeurs des énumérations GridSnapping et CropFrame, et configurations recommandées :
→ references/api-reference.md — à lire lors de l'écriture ou de la révision du code de configuration de la caméra.
Résumé rapide des énumérations :
GridSnapping : None · PixelSnapping (standard) · UpscaleRenderTexture (basse résolution authentique ; incompatible avec le post-processing et le texte UI)
CropFrame : None · Pillarbox · Letterbox · Windowbox (valeur par défaut la plus sûre) · StretchFill
Résolution de référence
Choisissez avant de construire des assets. Ne changez jamais après le début de la production des assets.
| Résolution de référence | 1080p | 1440p | 4K |
|---|---|---|---|
| 320 × 180 | 6× | 8× | 12× |
| 480 × 270 | 4× | ~5,3× | 8× |
| 640 × 360 | 3× | 4× | 6× |
320×180 est le choix général le plus sûr. Pour les écrans sans ajustement entier (par exemple 1366×768), utilisez cropFrame = Windowbox pour ajouter des barres noires plutôt que d'étirer à une échelle fractionnaire.
Migration et compatibilité
Projet URP avec le composant autonome Built-in
Symptôme : DetectPipeline() renvoie URP mais la caméra a UnityEngine.U2D.PixelPerfectCamera. Les symptômes sont subtils car le composant autonome a du code conditionnel ENABLE_URP.
Correctif :
- Supprimez
com.unity.2d.pixel-perfectdu gestionnaire de packages - Supprimez
UnityEngine.U2D.PixelPerfectCamerade chaque caméra - Ajoutez
UnityEngine.Rendering.Universal.PixelPerfectCamera - Reconfigurez — les booléens (
pixelSnapping,upscaleRT,cropFrameX/Y) deviennent des énumérations (gridSnapping,cropFrame)
→ Code de détection : references/pipeline-detection.cs (bas du fichier).
Ancien espace de noms URP (avant Unity 2022 / URP avant 13.x)
Symptôme : Erreurs de compilation référençant UnityEngine.Experimental.Rendering.Universal.
Correctif : Remplacez using UnityEngine.Experimental.Rendering.Universal; par using UnityEngine.Rendering.Universal;. Mettez à jour toutes les chaînes de type qualifiées par assembly. L'attribut [MovedFrom] gère la sérialisation automatiquement — les composants sur les GameObjects survivent à la mise à niveau.
Problèmes courants et solutions
Sprites flous
Correctif : Réglez le mode de filtre sur Point sur tous les sprites concernés, désactivez les Mip Maps, désactivez l'AA dans les paramètres de qualité.
→ Code : references/sprite-settings.cs
Espaces dans les tilemaps entre les tuiles
Travaillez dans l'ordre — les solutions de contournement comme l'espace négatif entre les cellules ou PPU = 31,99 se cassent lorsque la caméra bouge.
| # | Vérification | Correctif |
|---|---|---|
| 1 | Sprite Atlas avec Tight Packing désactivé, Padding ≥ 4, mode Sprite Packer activé ? | Activez le mode Sprite Packer dans les paramètres de l'éditeur ; sur l'atlas, définissez Padding ≥ 4 et désactivez Tight Packing |
| 2 | Mipmaps désactivés sur les textures de tileset et l'atlas ? | Désactivez Générer les Mip Maps |
| 3 | AA = 0, MSAA désactivé sur la caméra ? | Désactivez AA globalement |
| 4 | Compression = Aucune ? | RGBA 32 bits non compressé |
| 5 | Toutes les tuiles de sprite ont des dimensions de pixels paires ? | Les dimensions impaires provoquent un décalage de grille de 0,5 px |
| 6 | PPU = largeur en pixels de la tuile ? (16×16 → PPU 16) | Un décalage de PPU laisse des espaces physiques |
| 7 | Espaces uniquement pendant le mouvement de la caméra après toutes les vérifications ci-dessus ? | Utilisez le pixel snapping de la PP Camera ; n'utilisez pas cellGap = -0.01f |
Conflit avec Cinemachine
Cause : Cinemachine et la Pixel Perfect Camera écrivent toutes deux dans la taille orthographique à chaque image.
Correctif : Ajoutez l'extension CinemachinePixelPerfect via le menu déroulant Ajouter une extension sur chaque caméra virtuelle. Ne l'ajoutez pas via AddComponent dans le code.
Limitations connues :
- Les transitions de caméra entre caméras virtuelles ne sont pas pixel perfect pendant les transitions
UpscaleRenderTextureréduit les tailles orthographiques pixel perfect valides, ce qui peut faire dévier le cadrage- Target Group + Framing Transposer provoque un saccade visible (aucun correctif disponible)
Flou du post-processing avec upscaleRT
Cause : Le post-processing s'exécute après que la PP Camera a augmenté la résolution de la texture de rendu.
Correctif simple : Désactivez upscaleRT. Le post-processing s'exécute alors à la résolution native de l'écran.
Correctif avancé (Unity 6 URP) : Injectez un ScriptableRendererFeature2D à RenderPassEvent2D.AfterRenderingPostProcessing. Utilisez des classes de base spécifiques à la 2D — ScriptableRendererFeature (classe de base 3D) est ignoré silencieusement dans un rendu 2D URP.
Texte UI flou avec upscaleRT
Statut : Problème connu d'Unity. Utilisez un Canvas Scaler avec mise à l'échelle constante (Constant Pixel Size) ou désactivez upscaleRT. Envisagez d'utiliser TextMeshPro avec des polices bitmap pour les jeux pixel art.