XtGameKit/Doc/ET-Packages-Audit.md

227 lines
12 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# ET 框架包能力清单38 个)
> **目的**:避免重复造轮子。每次设计新功能前先查这份清单,确认是否有现成包可用。
> **更新时间**2026-05-27
> **范围**`My project/Packages/` 下所有 `cn.etetet.*` + `com.etetet.*` 包
---
## 速查表
| 类别 | 包 | 状态 | 关键 API/类 |
|---|---|---|---|
| **核心运行时** | cn.etetet.core | 自带可用 | `Log` / `MongoHelper` / `World` / `Entry` / `Fiber` / `TimerComponent` |
| | cn.etetet.loader | 自带可用 | `CodeLoader` / `Init` / `NLogger` / `BuildHelper` |
| | cn.etetet.sourcegenerator | 自带可用 | `[EntitySystemOf]` / `[ComponentOf]` 等属性 |
| | cn.etetet.memorypack | 自带可用 | MemoryPack 序列化 |
| | cn.etetet.mathematics | 自带可用 | float3/quaternion 等 |
| | com.etetet.init | 自带可用 | MongoDB.Driver 原生 DLL + 包依赖解析 |
| **UI 框架** | cn.etetet.yiuiframework | 自带可用 | `YIUIMgrComponent` / `PanelInfo` / `YIUILoadHelper` |
| | cn.etetet.yiui | 需扩展 | 项目级业务 UI目前仅 `CommonHeader` |
| | cn.etetet.yiuiinvoke | 自带可用 | `[YIUIInvoke]` 跨模块解耦调用 |
| | **cn.etetet.yiuigm** | **完全现成** | **`[GM]` 属性 + `IGMCommand` 接口 + GMPanel 面板** |
| | cn.etetet.yiuitips | 自带可用 | `TipsHelper` 弹窗 |
| | cn.etetet.yiuireddot | 自带可用 | 红点树 + DAG |
| | cn.etetet.yiuiloopscrollrectasync | 自带可用 | 异步无限滚动列表 |
| | cn.etetet.yiui3ddisplay | 自带可用 | UI 内嵌 3D 模型 |
| | cn.etetet.yiuieffect | 自带可用 | UI 特效(粒子/灰度) |
| | cn.etetet.yiuiyooassets | 自带可用 | YIUI ↔ YooAssets 桥接 |
| **业务样板** | cn.etetet.login | 需扩展 | `C2R_LoginHandler` / `C2G_LoginGateHandler` / `Player`(仅 Account 字段) |
| | cn.etetet.statesync | 仅参考 | MMO DemoUnit 同步/跨 Map |
| | cn.etetet.yiuistatesync | 仅参考 | YIUI Login/Lobby/Main Panel 集成样板 |
| **MMO 战斗(与本次无关)** | cn.etetet.unit | 不复用 | MMO 单位 Entity |
| | cn.etetet.numeric | 可借鉴 | KV 数值 + Buff 五段公式 + Watcher |
| | cn.etetet.move | 不复用 | MMO 寻路点移动 |
| | cn.etetet.ai | 不复用 | 行为机 AI |
| | cn.etetet.aoi | 不复用 | 九宫格视野同步 |
| | cn.etetet.recast | 不复用 | 3D 寻路 |
| | cn.etetet.ui | 已废弃 | ET 原生 UI被 YIUI 替代) |
| | cn.etetet.demores | 不复用 | StateSync Demo 资源 |
| **网络** | cn.etetet.router | 自带可用 | KCP 软路由 |
| | cn.etetet.netinner | 自带可用 | 进程间内网消息 |
| | cn.etetet.http | 自带可用 | 轻量 HTTP Server |
| | cn.etetet.actorlocation | 可选 | 分布式 Actor Location |
| **协议** | **cn.etetet.proto** | **自带可用** | **`ET/Proto/Proto2CS` 工具链 + 自动 Opcode + MemoryPack** |
| **配置** | **cn.etetet.excel** | 不够用 | Excel→C#+JSON+BSON**不支持外键/嵌套 struct** |
| | cn.etetet.startconfig | 自带可用 | 服务器拓扑配置Process/Zone/Scene/Machine |
| **资源/热更** | cn.etetet.yooassets | 自带可用 | YooAsset 资源管理(打包/热更/下载) |
| | cn.etetet.hybridclr | 自带可用 | HybridCLR C# 全平台热更 |
| | cn.etetet.referencecollector | 自带可用 | Prefab 引用收集器 |
| **工具/运维** | **cn.etetet.console** | **完全现成** | **`[ConsoleHandler]` 属性 + `IConsoleHandler` 接口 + stdin 命令循环** |
| | cn.etetet.watcher | 可选 | 多进程保活 |
---
## 关键能力GM/日志/DB/配置/协议)
### GM 命令(**完全现成,双轨**
| 维度 | `cn.etetet.console` | `cn.etetet.yiuigm` |
|---|---|---|
| 运行端 | 服务端 stdin REPL | 客户端 YIUI 面板 |
| 扩展方式 | `[ConsoleHandler("AddItem")]` + `IConsoleHandler.Run(fiber, contex, content)` | `[GM(EGMType.Test, 1, "发放道具", "...")]` + `IGMCommand.GetParams + Run(scene, paramVo)` |
| 参数类型 | 字符串自由切分 | Enum / String / Bool / Float / Int / Long 6 种 |
| 内置命令 | `R` 热更 DLL、`C ConfigName` 热更 Reload 配置、`Robot` 压测 | 示例 `GM_Test` |
| 业务 GM 接入 | 新增 `[ConsoleHandler]` 类 | 新增 `[GM]` 类 |
**结论****不需要新建 GM 框架**。每个新业务命令只需写一个 `[GM]` 类(客户端)或 `[ConsoleHandler]` 类(服务端)。
### 日志(自带 Log 类,需扩展)
```csharp
// 已有:
Log.Debug(msg); Log.Info(msg); Log.Warning(msg); Log.Error(msg);
Log.Trace(msg); Log.Console(msg);
// 已有Fiber 级 ILog 接口可替换底层(默认 NLog 服务端 + UnityLogger 客户端)
```
**缺失能力**(要在 ET Log 基础上扩展):
- jsonl 审计日志(无)
- 模块标签前缀(无,需约定 `[Hero]`/`[Bag]`/`[Gacha]` 写法)
- 按天分目录NLog 支持,需配置)
- 慢操作告警(无,需自加 AOP/手动埋点)
- reqId 全链路透传(无,需在 Handler 基类透传)
- 敏感字段脱敏(无)
- 客户端日志桥接到服务端(无)
**结论****扩展非重写**。新建 `cn.etetet.audit` 或在 `cn.etetet.logging` 加扩展方法 `Log.Audit(module, action, payload)`,底层调 NLog 输出 jsonl 到 `Logs/Audit/{module}/{date}.jsonl`
### DBComponent / 玩家持久化(基础设施现成,业务层缺)
| 已有 | 缺失 |
|---|---|
| `MongoHelper.ToJson/FromJson/Clone/CloneBytes`BSON 序列化) | `IDBComponent.Save<T>/Query<T>/Update<T>/Delete<T>` 业务封装 |
| `com.etetet.init/Plugins/MongoDB/*` 原生 DLL | 连接池/重试/慢查询 |
| `MongoRegister` 注册类型映射 | Entity 与 MongoDB Collection 的映射约定 |
**结论****新建业务包 `cn.etetet.db`** 包装这层。**不需要重写 BSON**。
### 协议生成(完全现成)
```
1. 在业务包下建 Proto/*.proto
2. Unity 菜单 ET/Proto/Proto2CS
3. 自动扫描所有 cn.etetet.* 包的 Proto/ 目录
4. 生成带 [MemoryPackable] + Opcode 的 C# 到 cn.etetet.proto/CodeMode/Model/{Client,Server,ClientServer}
```
**现有协议组占用**1000-1099 Login / 1100-1199 Router / 11001-11099 StateSync C2C / 20100-20199 ActorLocation / 21001-21099 StateSync M2C / 21100-21199 StateSync M2M。
**ROK 占用建议**3000-3099 Hero / 3100-3199 Bag/Equip / 3200-3299 Gacha。
### YIUI 框架(**深度复用UI 几乎零造轮**
**核心认知**
- 标准面板入口:`scene.YIUIRoot().OpenPanelAsync<T>()` / `OpenPanelParamAsync<T>(...)` / `OpenPanelWaitAsync<T>(...)`(模态等待)
- 数据驱动Prefab 挂 `UIDataBind*` 组件,代码改 `u_DataXxx.SetValue(...)` 自动刷新 UI
- 事件驱动Prefab 挂 `UIEventBind*` + `[YIUIInvoke(const)]` 静态方法接线,**无需 Button.onClick.AddListener**
- 跨模块解耦:`[YIUIInvokeSystem("Key")]` + `YIUIInvokeHandler<T>` + `YIUIInvokeSystem.Instance.Invoke(...)`
- CDETable = **C**omponent + **D**ata + **E**vent 三张表YIUI 自动化工具一键生成 Component/System
**15 条「YIUI 已经做了的事」速查**
| # | 不要自己做 | 用 YIUI 什么 |
|---|---|---|
| 1 | 面板打开/关闭/栈/Home 管理 | `scene.YIUIRoot().Open/ClosePanelAsync` |
| 2 | 按钮点击接线 | `UIEventBind*` + `[YIUIInvoke]` |
| 3 | Item/面板字段刷新样板 | `u_Data*` + `UIDataBind*` |
| 4 | 图标/贴图异步加载 | `UIDataBindImage`(内部走 YooAsset |
| 5 | Prefab 从 AB 加载 | 打开 Panel 即可(`cn.etetet.yiuiyooassets` 桥接) |
| 6 | 确认框 / 飘字 / 模态等待 | `TipsHelper.OpenWait/OpenSync` + `TipsMessageView/TipsTextView` |
| 7 | 红点树与父子传播 | `RedDotMgr.Inst.SetCount(key, count)` + `RedDotBind`**只写叶子,父节点自动汇总** |
| 8 | 长列表虚拟化与池化 | `YIUILoopScrollChild.SetDataRefresh(IList)` + `ReRenderer()` |
| 9 | GM/模块间零引用调用 | `YIUIInvokeSystem` + invoke 契约包 |
| 10 | 顶栏/关闭按钮 | 现成 `CommonHeader` + `YIUICloseCommon` |
| 11 | 英雄详情 3D 模型 | `YIUI3DDisplayChild.ShowAsync(resName)`,自带 RT/Camera/RawImage 池 |
| 12 | 按钮灰显/抽卡 UI 特效 | `UIDataBindGray` / `UIEffect` / `UIParticle` |
| 13 | 异步操作全屏挡点击 | `scene.YIUIMgr().BanLayerOptionForever()` |
| 14 | UI 倒计时文本 | `CountDownMgr`(在 framework |
| 15 | 列表数据变长度不变 | `Loop.ReRenderer()` 增量刷新 |
**仍需自己做YIUI 未覆盖)**
| 项 | 原因 |
|---|---|
| `BagItemTooltip` 道具浮层 | tips 包无现成 Tooltip View但容器可用 `TipsHelper.Open` 承载 |
| `BagItemUICommon` 通用道具组件 | 业务复合组件,用 YIUI 生成 + 上述绑定拼装 |
| 英雄列表三段分组 | Loop 只负责虚拟化,分组逻辑在 IList 数据层或 Header Item |
| 天赋树可视化 | 无图编辑器组件,需自绘 |
| `ErrorMessageHelper` 文案表 | 自建(**展示**用 `TipsTextView` |
| 业务 invoke Handler | 框架有机制,业务 Handler 需自写 |
**易踩坑(必读)**
1. **没有 `PanelHelper`**:标准写法是 `scene.YIUIRoot().OpenPanelAsync<T>()`,与 `yiuistatesync` 登录/大厅一致,不要自建 Helper
2. **CDETable 正式名是 `UIBindCDETable`**C+D+E = Component + Data + Event
3. **红点只能在叶子节点 `SetCount`**,给有子节点的 Key 直接 Set 会报错
4. **`cn.etetet.yiui` 几乎是空包**ROK 业务 Panel 应建在 `cn.etetet.hero/bag/gacha` 内部,不期待现成业务 UI
5. **客户端数据 → UI 优先走 `UIDataBind`,不要默认走 ET EventSystem**UIData 是"局部数据驱动"EventSystem 是"跨面板业务广播",两者职责不同
### 配置ExcelExporter 不够用,引入 Luban
`cn.etetet.excel` 能力:
- 支持类型:基本类型 + `int[]` / `string[]` / `int[][]`
- 不支持:**外键校验、嵌套 struct、复杂引用类型**(未知类型 `throw 不支持`
- 输出C# Category + JSON + BSON bytes
**对 ROK Hero/Bag 缺口**
- `List<RewardEntry>` 通用奖励结构 → ExcelExporter 无法表达 bean 数组
- `List<AttrEntry>` 装备属性配对 → 难表达
- 卡池权重表多列关联 → 无外键校验
- 天赋树前置依赖 → 无引用校验
**结论****新业务表用 Luban**(不写自定义模板,原生 API + Scene Component 包装)。**老配置StartConfig 等)保持 ExcelExporter**。
---
## ROK Hero/Bag 移植技术选型(基于本清单)
```
✅ 直接复用
- 核心运行时core/loader/sourcegenerator/memorypack
- 协议工具链proto + Proto2CS
- UI 全套yiuiframework + 各 yiui 子包)
- GM 双轨yiuigm + console
- 资源热更yooassets + hybridclr
- 登录链路login扩展 Player 字段)
🔧 扩展使用
- Log → Audit 扩展(新建 cn.etetet.logging 或 cn.etetet.audit
- login Player → 挂 HeroComponent / BagComponent / GachaComponent
- excel → 只维护 StartConfig 等 ET 基础设施表
📦 新增业务包
- cn.etetet.db # DBComponent 业务封装(基于 MongoHelper + MongoDB.Driver
- cn.etetet.hero # 英雄系统
- cn.etetet.bag # 背包/装备系统
- cn.etetet.gacha # 抽卡系统
- cn.etetet.config # Luban Tables + ConfigComponent
❌ 不复用(与本次无关)
- unit / move / ai / aoi / recast / numericOctoberStudio 走自己的局内战斗)
- statesync / yiuistatesyncMMO Demo仅参考代码风格
- ui旧 UI已被 YIUI 替代)
- demoresDemo 美术资源)
```
---
## 设计原则(基于这份清单的检查清单)
每次新功能落地前的 3 问:
1. **现有 ET 包是否有?** → 查上表
2. **如果有但能力不全,是扩展还是重写?****优先扩展**,禁止重写已有内核
3. **如果没有,应该建独立业务包还是塞进现有包?** → 业务功能建新包 `cn.etetet.xxx`**禁止塞进** `core` / `login` 等基础包
每次重大决策都需要在 `design.md` 的 D 决策表中明确"复用了哪些已有包 + 扩展点 + 新增点"。
---
## 修订记录
| 日期 | 版本 | 说明 |
|---|---|---|
| 2026-05-27 | v1.0 | 初版38 包全量调研 |