NLDClient-yudde/AGENTS.md

163 lines
8.0 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

# AGENTS.md
> **最高优先级规则**:执行大量代码修改之前,先和用户确认设计思路再继续执行。
## 项目技术栈
| 类别 | 技术 | 说明 |
|------|------|------|
| 引擎 | Unity | C# 脚本后端 |
| 热更新 | **HybridCLR** | GamePlay 代码编译为独立 DLL`GamePlay_Dll/GamePlay.dll`),支持运行时热更新 |
| 配置表 | **Luban** | 游戏参数、数值配置的数据驱动方案,配置源位于 `NLDMisc` 仓库 |
| 行为树/状态机 | **NodeCanvas** | 位于 `ProjectNLD/Assets/PhxhSDK/ThirdParty/ParadoxNotion/`,提供 BehaviourTree、FSM、DialogueTree |
| 编辑器 | **Odin Inspector** | 用于开发自定义 Inspector 和 EditorWindow |
| 动画 | **DOTween** | 补间动画库 |
| 资源管理 | **YooAsset** | 资源打包、加载、热更新 |
| 物理切割 | **BzKovSoft** | 角色/物体切片系统 |
## 核心目录速览
```
ProjectNLD/Assets/
├── Code/Scripts/
│ ├── GamePlay/ ← 核心战斗逻辑 (75+ 模块,编译为独立 DLL)
│ ├── Framework/ ← 底层框架代码
│ ├── GameWrapper/ ← 游戏外壳/入口
│ ├── HotUpdate/ ← 热更新相关代码
│ ├── UI/ ← UI 框架层(非 GamePlay UI
│ ├── Camera/ ← 相机系统
│ └── GenCode/ ← Luban 生成的配置表代码
├── PhxhSDK/
│ ├── Phxh/ ← 工作室自研框架
│ ├── ThirdParty/ ← 第三方库NodeCanvas 等)
│ ├── Plugins/ ← 原生插件
│ └── Editor/ ← 编辑器工具
├── Plugins/ ← Unity 插件
└── StreamingAssets/ ← 流式资源
```
## 规则协议Protocols
行为规则以 `.ai/protocols/` 为权威定义,包括:
- `confirm-before-act.md` — 大量修改前确认
- `git-safety.md` — Git 操作安全规范
- `no-meta-files.md` — Unity 项目约定(不生成 .meta、不主动编译
## 技能系统与同步
- 技能定义唯一源位于 `.ai/skills/`,协议源位于 `.ai/protocols/`Agent 定义源位于 `.ai/agents/`
- 通过 `.ai/sync-all.sh`macOS/Linux`.ai/sync-all.ps1`Windows将 skills、protocols、agents 一键同步到各平台目录(`.cursor/` `.claude/` `.github/` `.kiro/`
- 新增或更新任何技能、协议、Agent 后运行同步脚本即可
### 当前可用技能
| 技能 | 何时使用 |
|------|---------|
| `batch-git-ops` | 任何 Git 操作pull/push/commit/checkout必须读取并按流程执行 |
| `compile-gameplay-dll` | 修改了 `GamePlay/` 下任何代码后,需要编译 DLL |
| `luban-config` | 涉及配置表的新增/修改,或需要理解 Luban 配置结构 |
| `ui-prefab-dev` | 开发 UI 预制体、UI 界面相关功能 |
| `knowledge-base` | 查询已知的最佳实践、性能优化案例、架构决策记录 |
## 编码要求
### 设计原则
- 使用面向对象的设计思路,单个文件/模块尽可能小且功能单一
- 按要求去做,不扩展额外的功能
- 遵循 C# 标准命名:类/方法 PascalCase私有字段 `_camelCase`,常量 UPPER_SNAKE
### 行为约束
- 不要生成 Unity `.meta` 文件,留给 Unity 自己生成
- 不要主动编译项目Unity 自动编译;可以做静态代码检查)
- 图片资源处理时可自主决定是否查看图片内容,以获取尺寸、颜色、布局等信息
### 交互协议
- 编码前将计划描述给用户并获得确认(收集信息、编写 plan 不需要确认)
- 如果有疑问主动向用户确认
### 编辑器开发
- 使用 Odin Inspector 开发自定义编辑器和 Inspector 面板
### 文件落位约定
新建代码时按以下规则选择落位路径:
| 代码类型 | 落位路径 |
|---------|---------|
| 战斗/技能/Buff/AI/角色 | `ProjectNLD/Assets/Code/Scripts/GamePlay/<模块>/` |
| UI 逻辑GamePlay 相关) | `ProjectNLD/Assets/Code/Scripts/GamePlay/UI/` |
| UI 框架层 | `ProjectNLD/Assets/Code/Scripts/UI/` |
| 底层框架/工具 | `ProjectNLD/Assets/Code/Scripts/Framework/` |
| 编辑器扩展 | `ProjectNLD/Assets/PhxhSDK/Editor/` |
| 热更新相关 | `ProjectNLD/Assets/Code/Scripts/HotUpdate/` |
- 不确定归属时优先询问用户
- 不要修改 `GenCode/` 下 Luban 自动生成的文件
### 性能黄金法则(热路径必查)
以下规则在 `Update`、`LateUpdate`、`FixedUpdate` 及高频回调中强制要求:
| 禁止 | 替代方案 |
|------|---------|
| `GameObject.Find` / `FindObjectOfType` | 预先缓存引用或通过 Manager 注册 |
| `GetComponent`(每帧调用) | `Awake`/`Start` 中缓存 |
| `foreach` 遍历集合 | `for (int i = 0; i < list.Count; i++)` |
| LINQ`.Where` `.First` `.ToArray` | 手动循环或提前缓存结果 |
| lambda / 闭包 | 提取为实例方法或静态方法 |
| 字符串拼接(`+` 或 `$` | `StringBuilder`(非每帧可酌情 `$` |
| 装箱拆箱 | 避免 `object` 类型转换,使用泛型 |
| `Instantiate` / `Destroy` | 对象池复用 |
- 声明 `List`/`Dictionary`/`HashSet` 时预分配 `capacity`
- 事件订阅必须在 `OnDestroy`/`OnDisable` 中取消
### 常见反模式Agent 容易犯的错)
- ❌ 在 GamePlay 代码中直接引用 `Framework` 层类型(架构越界)
- ❌ 修改 `Assets/Code/Scripts/GenCode/` 下 Luban 自动生成的文件
- ❌ 在非主线程访问 Unity API`Transform`、`GameObject` 等)
- ❌ 忘记在 `OnDestroy`/`OnDisable` 中取消事件订阅 → 内存泄漏
- ❌ 在 `while` 循环中无 yield 导致主线程卡死
- ❌ 协程启动后未管理生命周期(对象销毁后协程继续执行)
- ❌ 对 Unity 资源使用 `new` 构造(应使用 `Instantiate``ScriptableObject.CreateInstance`
### HybridCLR 约束
GamePlay 代码编译为独立 DLL受以下限制
- **禁止** `System.Reflection.Emit` 相关 API
- 不能依赖主工程中的非 AOT 类型
- 新增外部库需检查 AOT 兼容性
- 不要在 GamePlay 代码中引用 `Assembly-CSharp` 中的类型(除非已做 AOT 预留)
- 使用 `ForceAOT.csproj` / `ScriptsAOT.csproj` 做 AOT 预留注册
- 修改 GamePlay 代码后必须通过 Unity 菜单编译生成 DLL → 读取 `compile-gameplay-dll` 技能
## Git 操作
- 除非用户要求AI 不做任何 git 提交相关操作
- 当用户让 AI 操作 git 时提醒用户 git 操作有风险
- **重要**:本项目有三个关联的 Git 仓库(见下方"项目仓库结构"),任何 git 操作pull/push/commit/checkout 等)都必须同时考虑三个仓库的同步对齐,务必读取 `batch-git-ops` skill 后按其流程执行
## 项目仓库结构
本项目包含三个独立的 Git 仓库,路径相对于 workspace 根目录:
| 仓库 | 相对路径 | 定位 |
|------|---------|------|
| **NLDClient** | `.` | 游戏客户端主仓库,包含 Unity 项目配置、资源、框架代码等 |
| **NLDMisc** | `../NLDMisc` | 配置表相关仓库,存放游戏参数、数值配置等数据 |
| **GamePlay** | `ProjectNLD/Assets/Code/Scripts/GamePlay` | 核心游戏逻辑代码仓库,编译产物为 `GamePlay_Dll/GamePlay.dll` |
- 执行 git 操作时必须明确区分当前操作的是哪个仓库,不要混淆仓库边界
- 查找或修改代码时注意文件属于哪个仓库,避免在错误的仓库中操作
## GamePlay 模块速查
`ProjectNLD/Assets/Code/Scripts/GamePlay/` 下 75+ 功能模块。完整模块索引见 `.ai/agents/default.md`,常用模块:
| 模块 | 路径 | 职责 |
|------|------|------|
| Buff | `GamePlay/Buff/` | Buff 添加/移除/叠加/属性修改 |
| Character | `GamePlay/Character/` | 角色单位、动画、状态、属性 |
| Fight | `GamePlay/Fight/` | 战斗核心、伤害计算、武器、浮字 |
| Skill | `GamePlay/Skill/` | 技能释放/充能/状态机 |
| UI | `GamePlay/UI/` | 60+ UI 控制器 |
| AI | `GamePlay/AI/` | AI 行为树/军团/目标选择 |
| Level | `GamePlay/Level/` | 关卡管理/状态/事件/引导 |
| Net | `GamePlay/Net/` | 网络消息/Proto/Actor |
| Team | `GamePlay/Team/` | 队伍编辑/派遣/战斗编队 |