# 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/Query/Update/Delete` 业务封装 | | `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()` / `OpenPanelParamAsync(...)` / `OpenPanelWaitAsync(...)`(模态等待) - 数据驱动:Prefab 挂 `UIDataBind*` 组件,代码改 `u_DataXxx.SetValue(...)` 自动刷新 UI - 事件驱动:Prefab 挂 `UIEventBind*` + `[YIUIInvoke(const)]` 静态方法接线,**无需 Button.onClick.AddListener** - 跨模块解耦:`[YIUIInvokeSystem("Key")]` + `YIUIInvokeHandler` + `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()`,与 `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` 通用奖励结构 → ExcelExporter 无法表达 bean 数组 - `List` 装备属性配对 → 难表达 - 卡池权重表多列关联 → 无外键校验 - 天赋树前置依赖 → 无引用校验 **结论**:**新业务表用 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 包全量调研 |