12 KiB
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 类,需扩展)
// 已有:
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 = Component + Data + Event 三张表,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 需自写 |
易踩坑(必读):
- 没有
PanelHelper:标准写法是scene.YIUIRoot().OpenPanelAsync<T>(),与yiuistatesync登录/大厅一致,不要自建 Helper - CDETable 正式名是
UIBindCDETable(C+D+E = Component + Data + Event) - 红点只能在叶子节点
SetCount,给有子节点的 Key 直接 Set 会报错 cn.etetet.yiui几乎是空包,ROK 业务 Panel 应建在cn.etetet.hero/bag/gacha内部,不期待现成业务 UI- 客户端数据 → 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 问:
- 现有 ET 包是否有? → 查上表
- 如果有但能力不全,是扩展还是重写? → 优先扩展,禁止重写已有内核
- 如果没有,应该建独立业务包还是塞进现有包? → 业务功能建新包
cn.etetet.xxx,禁止塞进core/login等基础包
每次重大决策都需要在 design.md 的 D 决策表中明确"复用了哪些已有包 + 扩展点 + 新增点"。
修订记录
| 日期 | 版本 | 说明 |
|---|---|---|
| 2026-05-27 | v1.0 | 初版,38 包全量调研 |