Unity Debug
Diagnostic et correction systematique de bugs Unity. Trace le chemin d'execution, identifie la cause racine, propose fix + prevention.
Ce que fait cette skill
- Collecte les symptomes (message d'erreur, stack trace, description)
- Classifie le type de bug
- Lit le code implique
- Applique l'arbre diagnostique par categorie
- Propose un fix avec explication
- Ajoute du code defensif et des recommendations de prevention
Prerequis
- Acces aux fichiers sources du projet Unity
- Idealement : le message d'erreur exact ou la stack trace
- Outils Claude Code uniquement (Read, Grep, Glob) — pas de MCP Unity requis
Demarrage rapide
- L'utilisateur decrit le bug ou colle l'erreur
- Classifier le type de bug (voir categories)
- Lire les fichiers impliques
- Suivre l'arbre diagnostique
- Produire le diagnostic au format :
Symptome | Cause | Fix | Prevention
Arbre de decision
Le bug est...
|
+-- Erreur de compilation (code rouge, pas de Play)
| +-- COMPILE ERROR -> verifier syntaxe, references, asmdef
|
+-- Exception a l'execution (message en console, peut crasher)
| +-- NullReferenceException -> ARBRE NULL REF
| +-- MissingComponentException -> ARBRE MISSING COMPONENT
| +-- MissingReferenceException -> ARBRE DESTROYED OBJECT
| +-- IndexOutOfRangeException -> verifier tailles collections
| +-- InvalidOperationException -> verifier etat collection pendant iteration
| +-- StackOverflowException -> verifier recursion / boucle d'events
| +-- OperationCanceledException -> ARBRE ASYNC/AWAITABLE
|
+-- Comportement incorrect (pas d'erreur visible)
| +-- LOGIC BUG -> tracer le chemin d'execution
|
+-- Performance (lag, stutter, freeze)
| +-- Bug de perf specifique -> PERF ISSUE -> chercher allocations, Update lourd, physics
| +-- Audit systematique -> utiliser /perf-audit a la place
|
+-- Probleme visuel (rendu, UI, shader)
| +-- VISUAL GLITCH -> verifier materials, sorting, render pipeline
|
+-- Probleme physique (traverse les murs, jitter)
| +-- PHYSICS BUG -> verifier Update vs FixedUpdate, layers, scale
|
+-- Probleme async / Awaitable
+-- ASYNC BUG -> ARBRE ASYNC/AWAITABLE
Workflow de diagnostic
1 — Collecter les symptomes
Informations a obtenir de l'utilisateur :
- Message d'erreur exact (copie complete avec stack trace)
- Quand ca arrive (au lancement, apres une action, aleatoire)
- Reproductibilite (toujours, parfois, seulement en build)
- Changements recents (qu'est-ce qui a ete modifie avant que ca casse)
Si une stack trace est disponible, extraire :
- Le fichier et la ligne (
at Namespace.Class.Method () in File.cs:line X)
- La chaine d'appel (qui appelle qui)
2 — Lire les fichiers impliques
Grep("class NomDuScript", type: "cs") -> trouver le fichier
Read(fichier identifie) -> lire le code complet
Grep("GetComponent|Find|SendMessage", fichier) -> reperer les appels risques
Grep("void Update|void FixedUpdate", fichier) -> reperer les hot paths
Pour les stack traces, lire CHAQUE fichier mentionne dans la chaine d'appel, du plus profond au plus haut.
3 — Appliquer l'arbre diagnostique
Arbres de diagnostic detailles : voir references/diagnostic-trees.md
4 — Proposer le fix
Format de sortie
Format obligatoire pour chaque diagnostic :
## Diagnostic
**Symptome** : [description precise de ce qui se passe]
**Cause** : [explication technique de pourquoi ca arrive]
**Fix** : [code corrige avec diff ou snippet]
**Prevention** : [comment eviter ce bug a l'avenir]
Code defensif — patterns
// Null check avec log explicite
if (_target == null)
{
Debug.LogWarning($"[{name}] Target reference is missing.", this);
return;
}
// TryGetComponent au lieu de GetComponent
if (!TryGetComponent(out Rigidbody rb))
{
Debug.LogError($"[{name}] Missing Rigidbody.", this);
return;
}
// Verifier destruction avant callback
private IEnumerator DelayedAction()
{
yield return new WaitForSeconds(1f);
if (this == null) yield break; // objet detruit pendant le wait
DoAction();
}
// Desubscription propre
private void OnEnable() => _eventChannel.Subscribe(OnEvent);
private void OnDisable() => _eventChannel.Unsubscribe(OnEvent);
Regles strictes
TOUJOURS :
- Lire le code source reel avant de diagnostiquer
- Tracer le chemin d'execution complet (pas de deduction sans preuve)
- Proposer une prevention en plus du fix
- Commencer par l'explication la plus simple (rasoir d'Occam)
- Verifier les references Inspector (champs
[SerializeField] non assignes)
- Verifier l'ordre de lifecycle Unity (
Awake -> OnEnable -> Start)
- Fournir le diagnostic au format
Symptome | Cause | Fix | Prevention
JAMAIS :
- Deviner la cause sans lire le code
- Proposer un fix sans comprendre la cause racine
- Ignorer la stack trace (chaque ligne est un indice)
- Proposer
try/catch comme fix (ca masque le bug, ca ne le resout pas)
- Supposer que le bug est dans Unity Engine (c'est presque toujours le code utilisateur)
- Proposer un fix qui introduit un nouveau probleme (regression)
Skills connexes
- Le bug est un probleme de performance general, pas un cas specifique ? Utiliser
/perf-audit (Unity Perf Audit)
- Le fix necessite un refactoring important ? Utiliser
/unity-refactor (Unity Refactor)
- Le fix necessite de valider avec des tests ? Utiliser
/unity-test (Unity Test)
Troubleshooting
| Probleme |
Solution |
| Pas de stack trace disponible |
Demander a l'utilisateur de reproduire avec la console ouverte, ou chercher des Debug.Log existants pour tracer |
| Bug non reproductible |
Chercher les race conditions, verifier si ca depend de l'ordre de chargement des scenes ou du framerate |
| Erreur dans un package tiers |
Lire le code du package (Library/PackageCache/), chercher des issues connues, proposer un workaround |
| Bug seulement en build (pas en Editor) |
Verifier : stripping de code (IL2CPP), differences de serialisation, #if UNITY_EDITOR mal place, SO modifies a runtime |
| Bug intermittent lie au framerate |
Chercher du code dependant du frame dans Update qui devrait etre dans FixedUpdate, ou des comparaisons float sans epsilon |
| Performance degrade progressivement |
Chercher des fuites : events non desubscrits, listes qui grandissent sans clear, objets instancies sans pool |
Table des bugs courants : voir references/common-bugs.md
1---2name: unity-debug3description: Diagnostic et correction systematique de bugs Unity par analyse de code. Classifie le bug, trace le chemin d'execution, propose un fix avec prevention. Triggers: /unity-debug, /debug, 'bug Unity', 'NullReferenceException', 'crash Unity', 'erreur Unity', 'ne marche pas', 'comportement bizarre', 'MissingComponentException', 'glitch visuel', 'physics bug'. Utiliser quand l'utilisateur rapporte un bug, une erreur, un crash ou un comportement inattendu dans Unity. Produit un diagnostic structure : Symptome, Cause, Fix, Prevention.4---5
6# Unity Debug
7
8Diagnostic et correction systematique de bugs Unity. Trace le chemin d'execution, identifie la cause racine, propose fix + prevention.
9
10## Ce que fait cette skill
11
121. Collecte les symptomes (message d'erreur, stack trace, description)
132. Classifie le type de bug
143. Lit le code implique
154. Applique l'arbre diagnostique par categorie
165. Propose un fix avec explication
176. Ajoute du code defensif et des recommendations de prevention
18
19## Prerequis
20
21- Acces aux fichiers sources du projet Unity
22- Idealement : le message d'erreur exact ou la stack trace
23- Outils Claude Code uniquement (Read, Grep, Glob) — pas de MCP Unity requis
24
25## Demarrage rapide
26
271. L'utilisateur decrit le bug ou colle l'erreur
282. Classifier le type de bug (voir categories)
293. Lire les fichiers impliques
304. Suivre l'arbre diagnostique
315. Produire le diagnostic au format : `Symptome | Cause | Fix | Prevention`
32
33---
34
35## Arbre de decision
36
37```
38Le bug est...
39|
40+-- Erreur de compilation (code rouge, pas de Play)
41| +-- COMPILE ERROR -> verifier syntaxe, references, asmdef
42|
43+-- Exception a l'execution (message en console, peut crasher)
44| +-- NullReferenceException -> ARBRE NULL REF
45| +-- MissingComponentException -> ARBRE MISSING COMPONENT
46| +-- MissingReferenceException -> ARBRE DESTROYED OBJECT
47| +-- IndexOutOfRangeException -> verifier tailles collections
48| +-- InvalidOperationException -> verifier etat collection pendant iteration
49| +-- StackOverflowException -> verifier recursion / boucle d'events
50| +-- OperationCanceledException -> ARBRE ASYNC/AWAITABLE
51|
52+-- Comportement incorrect (pas d'erreur visible)
53| +-- LOGIC BUG -> tracer le chemin d'execution
54|
55+-- Performance (lag, stutter, freeze)
56| +-- Bug de perf specifique -> PERF ISSUE -> chercher allocations, Update lourd, physics
57| +-- Audit systematique -> utiliser /perf-audit a la place
58|
59+-- Probleme visuel (rendu, UI, shader)
60| +-- VISUAL GLITCH -> verifier materials, sorting, render pipeline
61|
62+-- Probleme physique (traverse les murs, jitter)
63| +-- PHYSICS BUG -> verifier Update vs FixedUpdate, layers, scale
64|
65+-- Probleme async / Awaitable
66 +-- ASYNC BUG -> ARBRE ASYNC/AWAITABLE
67```
68
69## Workflow de diagnostic
70
71### 1 — Collecter les symptomes
72
73Informations a obtenir de l'utilisateur :
74- **Message d'erreur exact** (copie complete avec stack trace)
75- **Quand ca arrive** (au lancement, apres une action, aleatoire)
76- **Reproductibilite** (toujours, parfois, seulement en build)
77- **Changements recents** (qu'est-ce qui a ete modifie avant que ca casse)
78
79Si une stack trace est disponible, extraire :
80- Le fichier et la ligne (`at Namespace.Class.Method () in File.cs:line X`)
81- La chaine d'appel (qui appelle qui)
82
83### 2 — Lire les fichiers impliques
84
85```
86Grep("class NomDuScript", type: "cs") -> trouver le fichier
87Read(fichier identifie) -> lire le code complet
88Grep("GetComponent|Find|SendMessage", fichier) -> reperer les appels risques
89Grep("void Update|void FixedUpdate", fichier) -> reperer les hot paths
90```
91
92Pour les stack traces, lire CHAQUE fichier mentionne dans la chaine d'appel, du plus profond au plus haut.
93
94### 3 — Appliquer l'arbre diagnostique
95
96Arbres de diagnostic detailles : voir `references/diagnostic-trees.md`
97
98### 4 — Proposer le fix
99
100## Format de sortie
101
102Format obligatoire pour chaque diagnostic :
103
104```
105## Diagnostic
106
107**Symptome** : [description precise de ce qui se passe]
108**Cause** : [explication technique de pourquoi ca arrive]
109**Fix** : [code corrige avec diff ou snippet]
110**Prevention** : [comment eviter ce bug a l'avenir]
111```
112
113## Code defensif — patterns
114
115```csharp
116// Null check avec log explicite
117if (_target == null)
118{
119 Debug.LogWarning($"[{name}] Target reference is missing.", this);
120 return;
121}
122
123// TryGetComponent au lieu de GetComponent
124if (!TryGetComponent(out Rigidbody rb))
125{
126 Debug.LogError($"[{name}] Missing Rigidbody.", this);
127 return;
128}
129
130// Verifier destruction avant callback
131private IEnumerator DelayedAction()
132{
133 yield return new WaitForSeconds(1f);
134 if (this == null) yield break; // objet detruit pendant le wait
135 DoAction();
136}
137
138// Desubscription propre
139private void OnEnable() => _eventChannel.Subscribe(OnEvent);
140private void OnDisable() => _eventChannel.Unsubscribe(OnEvent);
141```
142
143---
144
145## Regles strictes
146
147**TOUJOURS :**
148- Lire le code source reel avant de diagnostiquer
149- Tracer le chemin d'execution complet (pas de deduction sans preuve)
150- Proposer une prevention en plus du fix
151- Commencer par l'explication la plus simple (rasoir d'Occam)
152- Verifier les references Inspector (champs `[SerializeField]` non assignes)
153- Verifier l'ordre de lifecycle Unity (`Awake` -> `OnEnable` -> `Start`)
154- Fournir le diagnostic au format `Symptome | Cause | Fix | Prevention`
155
156**JAMAIS :**
157- Deviner la cause sans lire le code
158- Proposer un fix sans comprendre la cause racine
159- Ignorer la stack trace (chaque ligne est un indice)
160- Proposer `try/catch` comme fix (ca masque le bug, ca ne le resout pas)
161- Supposer que le bug est dans Unity Engine (c'est presque toujours le code utilisateur)
162- Proposer un fix qui introduit un nouveau probleme (regression)
163
164---
165
166## Skills connexes
167
168- Le bug est un probleme de performance general, pas un cas specifique ? Utiliser `/perf-audit` (Unity Perf Audit)
169- Le fix necessite un refactoring important ? Utiliser `/unity-refactor` (Unity Refactor)
170- Le fix necessite de valider avec des tests ? Utiliser `/unity-test` (Unity Test)
171
172## Troubleshooting
173
174| Probleme | Solution |
175|----------|----------|
176| Pas de stack trace disponible | Demander a l'utilisateur de reproduire avec la console ouverte, ou chercher des `Debug.Log` existants pour tracer |
177| Bug non reproductible | Chercher les race conditions, verifier si ca depend de l'ordre de chargement des scenes ou du framerate |
178| Erreur dans un package tiers | Lire le code du package (`Library/PackageCache/`), chercher des issues connues, proposer un workaround |
179| Bug seulement en build (pas en Editor) | Verifier : stripping de code (IL2CPP), differences de serialisation, `#if UNITY_EDITOR` mal place, SO modifies a runtime |
180| Bug intermittent lie au framerate | Chercher du code dependant du frame dans `Update` qui devrait etre dans `FixedUpdate`, ou des comparaisons float sans epsilon |
181| Performance degrade progressivement | Chercher des fuites : events non desubscrits, listes qui grandissent sans clear, objets instancies sans pool |
182
183---
184
185> Table des bugs courants : voir `references/common-bugs.md`