227 lines
12 KiB
Markdown
227 lines
12 KiB
Markdown
# 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 Demo(Unit 同步/跨 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 / numeric(OctoberStudio 走自己的局内战斗)
|
||
- statesync / yiuistatesync(MMO Demo,仅参考代码风格)
|
||
- ui(旧 UI,已被 YIUI 替代)
|
||
- demores(Demo 美术资源)
|
||
```
|
||
|
||
---
|
||
|
||
## 设计原则(基于这份清单的检查清单)
|
||
|
||
每次新功能落地前的 3 问:
|
||
|
||
1. **现有 ET 包是否有?** → 查上表
|
||
2. **如果有但能力不全,是扩展还是重写?** → **优先扩展**,禁止重写已有内核
|
||
3. **如果没有,应该建独立业务包还是塞进现有包?** → 业务功能建新包 `cn.etetet.xxx`,**禁止塞进** `core` / `login` 等基础包
|
||
|
||
每次重大决策都需要在 `design.md` 的 D 决策表中明确"复用了哪些已有包 + 扩展点 + 新增点"。
|
||
|
||
---
|
||
|
||
## 修订记录
|
||
|
||
| 日期 | 版本 | 说明 |
|
||
|---|---|---|
|
||
| 2026-05-27 | v1.0 | 初版,38 包全量调研 |
|