Unity Code Generation
Generation de code C# Unity production-ready. Analyse le projet existant, choisit le pattern adapte, genere code + tests.
Ce que fait cette skill
- Analyse la demande (feature, systeme, type de composant)
- Inspecte la codebase existante (conventions, namespaces, assembly definitions)
- Choisit le pattern architectural via un arbre de decision
- Genere du C# propre avec les attributs Unity adequats
- Genere les tests unitaires correspondants (NUnit)
- Place les fichiers dans les bons repertoires
Prerequis
- Un projet Unity existant avec une structure de dossiers identifiable
- Acces aux fichiers du projet via les outils Claude Code (Read, Write, Edit, Grep, Glob)
- Aucune dependance MCP Unity requise
Demarrage rapide
- L'utilisateur decrit la feature ou le composant souhaite
- Inspecter le projet avec Glob/Grep pour comprendre les conventions
- Appliquer l'arbre de decision pour choisir le pattern
- Generer le code + tests dans les bons repertoires
Arbre de decision
La chose a creer...
│
├─ Stocke des donnees configurables (stats, settings) ?
│ └─ OUI → ScriptableObject Data Container
│
├─ Sert de canal de communication entre systemes ?
│ └─ OUI → ScriptableObject Event Channel
│
├─ Vit sur un GameObject dans la scene ?
│ ├─ Controle du comportement runtime ? → MonoBehaviour
│ └─ Juste un data holder sur un GO ? → MonoBehaviour simple (struct-like)
│
├─ Definit un contrat que plusieurs classes implementent ?
│ └─ OUI → Interface (+ implementations MonoBehaviour ou pure C#)
│
├─ Logique pure sans dependance Unity (math, algo, parsing) ?
│ └─ OUI → Pure C# class (pas de MonoBehaviour)
│
├─ Utilitaire stateless reutilisable ?
│ └─ OUI → Static class ou extension methods
│
├─ Gestion d'etats discrets (joueur, IA, game flow) ?
│ └─ OUI → State Machine (enum + switch ou state classes)
│
├─ Gestion d'inputs avec undo/replay ?
│ └─ OUI → Command Pattern
│
├─ Objets crees/detruits frequemment (projectiles, VFX) ?
│ └─ OUI → Object Pool
│
├─ Logique asynchrone (chargement, timer, sequence) ?
│ └─ OUI → Async Awaitable Component (Unity 6+)
│
└─ Milliers d'entites similaires a traiter en parallele ?
└─ OUI → ECS (DOTS) — hors scope de cette skill
Guide etape par etape
Etape 1 — Analyser la demande
Identifier clairement :
- Quoi : feature, systeme, composant, data container, event ?
- Ou : quel module du projet ? quel assembly definition ?
- Interactions : avec quels systemes existants ?
- Donnees : quelles donnees manipulees, persistees, serialisees ?
Etape 2 — Inspecter la codebase existante
Avant d'ecrire une seule ligne, toujours executer ces recherches :
Glob("Assets/**/*.asmdef") → assembly definitions, structure modules
Glob("Assets/**/*.cs", limit aux dossiers cibles) → fichiers existants
Grep("namespace ", type: "cs") → conventions de namespace
Grep("class .* : MonoBehaviour", type: "cs") → MonoBehaviours existants
Grep("class .* : ScriptableObject", type: "cs") → SOs existants
Grep("\\[SerializeField\\]", fichier cible) → style de serialisation
Identifier :
- Le pattern de nommage (
_camelCase pour private ? prefixes ?)
- La structure de namespace (
Game.Core, Game.Player, etc.)
- Les conventions d'attributs (
[Header], [Tooltip], [Range])
- Les patterns deja utilises (events, interfaces, state machines)
Etape 3 — Choisir le pattern
Appliquer l'arbre de decision ci-dessus. En cas de doute, privilegier la composition et les patterns simples.
Etape 4 — Generer le code C#
Appliquer systematiquement ces conventions Unity :
Attributs obligatoires :
[SerializeField] private pour les champs editables dans l'Inspector (jamais public)
[RequireComponent(typeof(X))] quand le script depend d'un autre composant
[Header("Section")] pour organiser l'Inspector par groupes logiques
[Tooltip("Explication")] sur les champs non evidents
[Range(min, max)] sur les valeurs numeriques bornees
Structure d'un fichier :
// 1. Namespace
// 2. Attributs de classe ([RequireComponent], [DisallowMultipleComponent])
// 3. Declaration de classe
// 4. Constantes
// 5. [SerializeField] champs groupes par [Header]
// 6. Events publics
// 7. Proprietes publiques (read-only si possible)
// 8. Champs prives
// 9. Awake / OnEnable / Start
// 10. OnDisable / OnDestroy
// 11. Update / FixedUpdate (si necessaire)
// 12. Methodes publiques
// 13. Methodes privees
// 14. Coroutines
Namespace : matcher la structure existante. Si le projet utilise Game.Player, ne pas inventer MyNamespace.Scripts.
Etape 5 — Generer les tests
Pour chaque fichier genere, creer le test correspondant :
- EditMode tests : logique pure, calculs, state machines, data validation
- PlayMode tests : comportement MonoBehaviour, interactions composants, coroutines
Placement des tests :
Assets/Tests/EditMode/ → tests logique (assembly ref: Game.Core, etc.)
Assets/Tests/PlayMode/ → tests comportement (assembly ref + UnityEngine.TestRunner)
Etape 6 — Placer les fichiers
- Respecter les assembly definitions et la structure de dossiers existante
- Les tests vont dans le dossier
Tests/ miroir
- Produire : fichier(s) C# source, tests NUnit, resume (pattern choisi, fichiers crees)
Regles strictes
TOUJOURS :
- Inspecter la codebase existante avant de generer (Glob + Grep)
- Matcher les conventions de nommage du projet
- Generer les tests en meme temps que le code
- Utiliser
[SerializeField] private pour les champs Inspector
- Utiliser des namespaces coherents avec la structure projet
- Ajouter
[Header] et [Tooltip] pour la lisibilite Inspector
- Privilegier la composition sur l'heritage
- Desubscribe les events dans
OnDisable ou OnDestroy
JAMAIS :
- Coder sans avoir inspecte le projet existant
- Utiliser le pattern Singleton MonoBehaviour (preferer SO ou Service Locator)
- Utiliser des champs
public (utiliser [SerializeField] private + propriete)
- Utiliser
Find*() ou SendMessage() avec des strings
- Ecrire de la logique dans
Update() sans cacher les references
- Generer du code sans tests
- Creer un fichier de plus de 500 lignes (modulariser)
- Hardcoder des valeurs magiques (utiliser SO ou
const)
Skills connexes
- Prototype rapide sans architecture ? Utiliser
/proto (Unity Rapid Proto)
- Refactorer du code existant ? Utiliser
/unity-refactor (Unity Refactor)
- Creer un custom inspector pour le composant genere ? Utiliser
/unity-editor-tools (Unity Editor Tools)
- Generer et executer les tests NUnit ? Utiliser
/unity-test (Unity Test)
Troubleshooting
| Probleme |
Solution |
| Pas de convention claire dans le projet |
Utiliser les conventions Unity standard (_camelCase, PascalCase) et creer un patron coherent |
| Pas d'assembly definition existante |
Generer le code dans le dossier principal, proposer de creer des asmdef si le projet grossit |
| Le namespace ne correspond a rien |
Utiliser le nom du projet + module, ex: ProjectName.Module |
| Tests impossibles car tout est couple |
Extraire la logique dans des classes pure C# testables, garder le MonoBehaviour comme "glue" |
| Le projet utilise des Singletons partout |
Ne pas en ajouter de nouveaux, proposer une migration progressive vers SO/Service Locator |
| Conflit de nommage avec un package tiers |
Prefixer le namespace avec le nom du projet |
Templates de code detailles : voir references/code-templates.md.
1---2name: unity-code-gen3description: Generation de code C# Unity production-ready a partir de specifications fonctionnelles. Analyse la codebase existante, choisit le bon pattern architectural, genere le code et les tests. Triggers: /unity-code-gen, 'generer script Unity', 'creer composant', 'nouveau MonoBehaviour', 'creer ScriptableObject', 'generer code Unity', 'nouveau systeme Unity', 'ajouter feature Unity'. Utiliser quand l'utilisateur demande de creer un nouveau script, composant, systeme ou feature dans Unity. Produit des fichiers C# respectant les conventions du projet avec tests NUnit associes.4---5
6# Unity Code Generation
7
8Generation de code C# Unity production-ready. Analyse le projet existant, choisit le pattern adapte, genere code + tests.
9
10## Ce que fait cette skill
11
121. Analyse la demande (feature, systeme, type de composant)
132. Inspecte la codebase existante (conventions, namespaces, assembly definitions)
143. Choisit le pattern architectural via un arbre de decision
154. Genere du C# propre avec les attributs Unity adequats
165. Genere les tests unitaires correspondants (NUnit)
176. Place les fichiers dans les bons repertoires
18
19## Prerequis
20
21- Un projet Unity existant avec une structure de dossiers identifiable
22- Acces aux fichiers du projet via les outils Claude Code (Read, Write, Edit, Grep, Glob)
23- Aucune dependance MCP Unity requise
24
25## Demarrage rapide
26
271. L'utilisateur decrit la feature ou le composant souhaite
282. Inspecter le projet avec Glob/Grep pour comprendre les conventions
293. Appliquer l'arbre de decision pour choisir le pattern
304. Generer le code + tests dans les bons repertoires
31
32## Arbre de decision
33
34```
35La chose a creer...
36│
37├─ Stocke des donnees configurables (stats, settings) ?
38│ └─ OUI → ScriptableObject Data Container
39│
40├─ Sert de canal de communication entre systemes ?
41│ └─ OUI → ScriptableObject Event Channel
42│
43├─ Vit sur un GameObject dans la scene ?
44│ ├─ Controle du comportement runtime ? → MonoBehaviour
45│ └─ Juste un data holder sur un GO ? → MonoBehaviour simple (struct-like)
46│
47├─ Definit un contrat que plusieurs classes implementent ?
48│ └─ OUI → Interface (+ implementations MonoBehaviour ou pure C#)
49│
50├─ Logique pure sans dependance Unity (math, algo, parsing) ?
51│ └─ OUI → Pure C# class (pas de MonoBehaviour)
52│
53├─ Utilitaire stateless reutilisable ?
54│ └─ OUI → Static class ou extension methods
55│
56├─ Gestion d'etats discrets (joueur, IA, game flow) ?
57│ └─ OUI → State Machine (enum + switch ou state classes)
58│
59├─ Gestion d'inputs avec undo/replay ?
60│ └─ OUI → Command Pattern
61│
62├─ Objets crees/detruits frequemment (projectiles, VFX) ?
63│ └─ OUI → Object Pool
64│
65├─ Logique asynchrone (chargement, timer, sequence) ?
66│ └─ OUI → Async Awaitable Component (Unity 6+)
67│
68└─ Milliers d'entites similaires a traiter en parallele ?
69 └─ OUI → ECS (DOTS) — hors scope de cette skill
70```
71
72## Guide etape par etape
73
74### Etape 1 — Analyser la demande
75
76Identifier clairement :
77- **Quoi** : feature, systeme, composant, data container, event ?
78- **Ou** : quel module du projet ? quel assembly definition ?
79- **Interactions** : avec quels systemes existants ?
80- **Donnees** : quelles donnees manipulees, persistees, serialisees ?
81
82### Etape 2 — Inspecter la codebase existante
83
84Avant d'ecrire une seule ligne, toujours executer ces recherches :
85
86```
87Glob("Assets/**/*.asmdef") → assembly definitions, structure modules
88Glob("Assets/**/*.cs", limit aux dossiers cibles) → fichiers existants
89Grep("namespace ", type: "cs") → conventions de namespace
90Grep("class .* : MonoBehaviour", type: "cs") → MonoBehaviours existants
91Grep("class .* : ScriptableObject", type: "cs") → SOs existants
92Grep("\\[SerializeField\\]", fichier cible) → style de serialisation
93```
94
95Identifier :
96- Le pattern de nommage (`_camelCase` pour private ? prefixes ?)
97- La structure de namespace (`Game.Core`, `Game.Player`, etc.)
98- Les conventions d'attributs (`[Header]`, `[Tooltip]`, `[Range]`)
99- Les patterns deja utilises (events, interfaces, state machines)
100
101### Etape 3 — Choisir le pattern
102
103Appliquer l'arbre de decision ci-dessus. En cas de doute, privilegier la composition et les patterns simples.
104
105### Etape 4 — Generer le code C#
106
107Appliquer systematiquement ces conventions Unity :
108
109**Attributs obligatoires :**
110- `[SerializeField] private` pour les champs editables dans l'Inspector (jamais `public`)
111- `[RequireComponent(typeof(X))]` quand le script depend d'un autre composant
112- `[Header("Section")]` pour organiser l'Inspector par groupes logiques
113- `[Tooltip("Explication")]` sur les champs non evidents
114- `[Range(min, max)]` sur les valeurs numeriques bornees
115
116**Structure d'un fichier :**
117```csharp
118// 1. Namespace
119// 2. Attributs de classe ([RequireComponent], [DisallowMultipleComponent])
120// 3. Declaration de classe
121// 4. Constantes
122// 5. [SerializeField] champs groupes par [Header]
123// 6. Events publics
124// 7. Proprietes publiques (read-only si possible)
125// 8. Champs prives
126// 9. Awake / OnEnable / Start
127// 10. OnDisable / OnDestroy
128// 11. Update / FixedUpdate (si necessaire)
129// 12. Methodes publiques
130// 13. Methodes privees
131// 14. Coroutines
132```
133
134**Namespace :** matcher la structure existante. Si le projet utilise `Game.Player`, ne pas inventer `MyNamespace.Scripts`.
135
136### Etape 5 — Generer les tests
137
138Pour chaque fichier genere, creer le test correspondant :
139
140- **EditMode tests** : logique pure, calculs, state machines, data validation
141- **PlayMode tests** : comportement MonoBehaviour, interactions composants, coroutines
142
143Placement des tests :
144```
145Assets/Tests/EditMode/ → tests logique (assembly ref: Game.Core, etc.)
146Assets/Tests/PlayMode/ → tests comportement (assembly ref + UnityEngine.TestRunner)
147```
148
149### Etape 6 — Placer les fichiers
150
151- Respecter les assembly definitions et la structure de dossiers existante
152- Les tests vont dans le dossier `Tests/` miroir
153- Produire : fichier(s) C# source, tests NUnit, resume (pattern choisi, fichiers crees)
154
155## Regles strictes
156
157**TOUJOURS :**
158- Inspecter la codebase existante avant de generer (Glob + Grep)
159- Matcher les conventions de nommage du projet
160- Generer les tests en meme temps que le code
161- Utiliser `[SerializeField] private` pour les champs Inspector
162- Utiliser des namespaces coherents avec la structure projet
163- Ajouter `[Header]` et `[Tooltip]` pour la lisibilite Inspector
164- Privilegier la composition sur l'heritage
165- Desubscribe les events dans `OnDisable` ou `OnDestroy`
166
167**JAMAIS :**
168- Coder sans avoir inspecte le projet existant
169- Utiliser le pattern Singleton MonoBehaviour (preferer SO ou Service Locator)
170- Utiliser des champs `public` (utiliser `[SerializeField] private` + propriete)
171- Utiliser `Find*()` ou `SendMessage()` avec des strings
172- Ecrire de la logique dans `Update()` sans cacher les references
173- Generer du code sans tests
174- Creer un fichier de plus de 500 lignes (modulariser)
175- Hardcoder des valeurs magiques (utiliser SO ou `const`)
176
177---
178
179## Skills connexes
180
181- Prototype rapide sans architecture ? Utiliser `/proto` (Unity Rapid Proto)
182- Refactorer du code existant ? Utiliser `/unity-refactor` (Unity Refactor)
183- Creer un custom inspector pour le composant genere ? Utiliser `/unity-editor-tools` (Unity Editor Tools)
184- Generer et executer les tests NUnit ? Utiliser `/unity-test` (Unity Test)
185
186## Troubleshooting
187
188| Probleme | Solution |
189|----------|----------|
190| Pas de convention claire dans le projet | Utiliser les conventions Unity standard (`_camelCase`, `PascalCase`) et creer un patron coherent |
191| Pas d'assembly definition existante | Generer le code dans le dossier principal, proposer de creer des asmdef si le projet grossit |
192| Le namespace ne correspond a rien | Utiliser le nom du projet + module, ex: `ProjectName.Module` |
193| Tests impossibles car tout est couple | Extraire la logique dans des classes pure C# testables, garder le MonoBehaviour comme "glue" |
194| Le projet utilise des Singletons partout | Ne pas en ajouter de nouveaux, proposer une migration progressive vers SO/Service Locator |
195| Conflit de nommage avec un package tiers | Prefixer le namespace avec le nom du projet |
196
197Templates de code detailles : voir `references/code-templates.md`.