关于 Unity Code Gen
用于在现有 Unity 项目中生成 C# 代码和 NUnit 测试的技能。它会先检查项目结构与惯例,再选择模式并将生成文件放入相应位置。
主要功能
- 01检查 Unity 项目结构与惯例
- 02通过决策树选择模式
- 03生成带 Unity 属性的 C# 代码
- 04创建对应的 NUnit 测试
- 05将文件放入项目目录
适用场景
- 01为现有 Unity 项目添加功能
- 02生成符合项目惯例的组件
- 03随生成代码一并创建测试
MCP 相关
此技能无需 Unity MCP 服务,而是使用 Claude Code 工具检查和编辑项目文件。
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ juliankerignard/ unity-skills --skill unity-code-gen安装后在 Claude Code 中输入/unity-code-gen确认已加载。
附带文件references/code-templates.md
详细介绍
Unity 代码生成
生成可用于生产环境的 Unity C# 代码。分析现有项目,选择合适的模式,生成代码和测试。
此技能的功能
- 分析需求(功能、系统、组件类型)
- 检查现有代码库(约定、命名空间、程序集定义)
- 通过决策树选择架构模式
- 使用合适的 Unity 属性生成整洁的 C# 代码
- 生成相应的单元测试(NUnit)
- 将文件放入正确的目录
前置条件
- 已有一个目录结构清晰的 Unity 项目
- 可通过 Claude Code 工具(Read、Write、Edit、Grep、Glob)访问项目文件
- 无需依赖 Unity MCP
快速开始
- 用户描述所需的功能或组件
- 使用 Glob/Grep 检查项目,了解现有约定
- 应用决策树选择模式
- 在正确的目录中生成代码和测试
决策树
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
分步指南
第 1 步 — 分析需求
明确以下内容:
- 内容:功能、系统、组件、数据容器、事件?
- 位置:项目中的哪个模块?哪个程序集定义?
- 交互:与哪些现有系统交互?
- 数据:处理、持久化和序列化哪些数据?
第 2 步 — 检查现有代码库
在编写任何代码之前,始终执行以下搜索:
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
识别:
- 命名模式(私有字段使用
_camelCase?是否有前缀?) - 命名空间结构(
Game.Core、Game.Player等) - 属性约定(
[Header]、[Tooltip]、[Range]) - 已使用的模式(事件、接口、状态机)
第 3 步 — 选择模式
应用上方的决策树。如有疑问,优先选择组合和简单模式。
第 4 步 — 生成 C# 代码
始终遵循以下 Unity 约定:
必需属性:
- 对 Inspector 中可编辑的字段使用
[SerializeField] private(绝不使用public) - 当脚本依赖其他组件时,使用
[RequireComponent(typeof(X))] - 使用
[Header("Section")]按逻辑分组整理 Inspector - 对不明显的字段使用
[Tooltip("Explication")] - 对有界数值使用
[Range(min, max)]
文件结构:
// 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
**命名空间:**与现有结构匹配。如果项目使用 Game.Player,不要另行创建 MyNamespace.Scripts。
第 5 步 — 生成测试
为每个生成的文件创建对应的测试:
- EditMode 测试:纯逻辑、计算、状态机、数据验证
- PlayMode 测试:MonoBehaviour 行为、组件交互、协程
测试位置:
Assets/Tests/EditMode/ → tests logique (assembly ref: Game.Core, etc.)
Assets/Tests/PlayMode/ → tests comportement (assembly ref + UnityEngine.TestRunner)
第 6 步 — 放置文件
- 遵循程序集定义和现有目录结构
- 测试放入对应的
Tests/镜像目录 - 生成内容:C# 源文件、NUnit 测试、摘要(所选模式、创建的文件)
严格规则
始终:
- 生成代码前检查现有代码库(Glob + Grep)
- 遵循项目的命名约定
- 编写代码的同时生成测试
- Inspector 字段使用
[SerializeField] private - 使用与项目结构一致的命名空间
- 添加
[Header]和[Tooltip],提升 Inspector 的可读性 - 优先使用组合,而非继承
- 在
OnDisable或OnDestroy中取消订阅事件
绝不:
- 不检查现有项目就编写代码
- 使用 MonoBehaviour 单例模式(优先使用 SO 或 Service Locator)
- 使用
public字段(使用[SerializeField] private+ 属性) - 使用带字符串参数的
Find*()或SendMessage() - 在
Update()中编写逻辑却不缓存引用 - 生成代码却不编写测试
- 创建超过 500 行的文件(应拆分模块)
- 硬编码魔法值(使用 SO 或
const)
相关技能
- 想要快速制作原型且不需要架构?使用
/proto(Unity Rapid Proto) - 想要重构现有代码?使用
/unity-refactor(Unity Refactor) - 想要为生成的组件创建自定义 Inspector?使用
/unity-editor-tools(Unity Editor Tools) - 想要生成并运行 NUnit 测试?使用
/unity-test(Unity Test) - 想要生成音频系统?使用
/unity-audio(Unity Audio) - 想要实现存档?使用
/unity-save(Unity Save System)
故障排除
| 问题 | 解决方案 |
|---|---|
| 项目中没有明确的约定 | 使用 Unity 标准约定(_camelCase、PascalCase),并建立一致的模式 |
| 没有现成的程序集定义 | 在主目录中生成代码;如果项目规模扩大,建议创建 asmdef |
| 命名空间没有对应的内容 | 使用项目名称 + 模块,例如:ProjectName.Module |
| 由于代码耦合,无法进行测试 | 将逻辑提取到可测试的纯 C# 类中,让 MonoBehaviour 仅负责“胶合” |
| 项目中到处都在使用单例 | 不要再添加新的单例;建议逐步迁移到 SO/Service Locator |
| 与第三方包发生命名冲突 | 在命名空间前加上项目名称 |
详细代码模板:参见 references/code-templates.md。
评论
支持 Markdown