# XtGameKit 基于 **ET 9.0 + YIUI** 框架的 SLG/养成业务包集合,包含:英雄系统、酒馆(抽卡)、通用背包、配置加载、数据持久化、跨模块 Invoke 契约。 本仓库**只放自研业务包与设计文档**,**不放 ET 框架本体**(用户拉到本地后请自行从 ET 框架仓库拉取 `cn.etetet.*`)。 --- ## 一、仓库目录 ``` XtGameKit/ ├── Packages/ # 8 个自研 cn.xt.* 包 │ ├── cn.xt.hero/ # 英雄系统(召唤/升级/培养) │ ├── cn.xt.heroinvoke/ # 英雄系统跨包 Invoke 契约 │ ├── cn.xt.bag/ # 通用背包(万物皆 Item) │ ├── cn.xt.baginvoke/ # 背包跨包 Invoke 契约 │ ├── cn.xt.gacha/ # 酒馆(抽卡) = Tavern │ ├── cn.xt.gachainvoke/ # 酒馆跨包 Invoke 契约 │ ├── cn.xt.config/ # 配置加载占位(Luban 接入点) │ └── cn.xt.db/ # 数据持久化(Mongo/Memory 双实现 + 脏写) │ ├── Doc/ # 设计与移植规格文档 │ ├── Hero-System-Guide.md # 英雄系统使用指南 │ ├── Bag-System-Guide.md # 背包系统使用指南 │ ├── GM-Commands.md # GM 指令一览(含 YIUI GM 面板) │ ├── Item-Design-Rule.md # Universal Item 设计准则 │ ├── Logging-Guide.md # 三层日志(Business / Audit / Error) │ ├── Luban-Guide.md # Luban 配置接入流程 │ ├── ROK-Hero-Spec.md # ROK Hero 1:1 业务规则规格 │ ├── ROK-Bag-Spec.md # ROK Bag 业务规则规格 │ ├── ROK-Equip-Spec.md # ROK 装备业务规则规格 │ ├── ROK-HeroAcquire-Spec.md # ROK 英雄获取业务规则规格 │ ├── ROK-Spec-Index.md # ROK 规格总入口 │ ├── ROK-Config-Source.md # ROK 配置来源审计 │ ├── ROK-Luban-Field-Mapping.md # ROK→Luban 字段映射 │ ├── ET-Packages-Audit.md # ET 现有包审计(避免造轮子) │ └── Server-Setup.md # 服务端部署 │ ├── openspec/ │ └── changes/ │ └── port-rok-hero-bag-system/ # OpenSpec 提案 / 设计 / specs / tasks │ └── .cursor/ └── skills/ └── et-framework-dev/ # ET 框架开发指南(分析器规则 / 程序集分层 / Proto 工作流) ``` --- ## 二、模块概览 | 包 | 作用 | 关键入口 | |---|---|---| | `cn.xt.hero` | 英雄获取/升级/属性 | `HeroComponent`, GM `Hero-召唤` | | `cn.xt.bag` | 通用 Item 仓库(万物皆 Item) | `BagComponent.AddItem / RemoveItem` | | `cn.xt.gacha` | 抽卡 = 酒馆 | `GachaComponent`, `C2G_GachaDraw` | | `cn.xt.config` | Luban 配置占位 + 加载 fallback | `cfg.Tables` | | `cn.xt.db` | 数据持久化(玩家加载/脏写/Flush) | `IDBComponent`, `MongoDBComponent`, `MemoryDBComponent`, `DBSaveComponent` | | `cn.xt.*invoke` | 跨包调用契约 | Pure interface/types,无业务逻辑 | ### 设计原则 1. **业务包不依赖框架包以外的东西**:自家包之间只允许 `cn.xt.* → cn.xt.*invoke`,禁止业务直接 ref 业务实现。 2. **Mongo 服务端 + Memory 客户端**:`MongoDBComponent` 用 `#if DOTNET || UNITY_EDITOR || UNITY_STANDALONE_*` 包住,客户端打包自动落到 `MemoryDBComponent`。 3. **持久化走脏写**:`DBSaveComponent.MarkDirty(player)` 标脏,固定节奏 Flush,玩家下线/进程退出时也 Flush。 4. **GM 双轨**:服务器 `cn.etetet.console` + 客户端 `cn.etetet.yiuigm`,所有 GM 命令都两侧可用。 --- ## 三、依赖(**框架包不在本仓库**) 8 个 `cn.xt.*` 包在 `package.json` 里都依赖了 ET 框架包;你需要在自己工程的 `Packages/` 同级目录下,从 ET 官方仓库拉到这些包: | `cn.xt.*` 需要的依赖 | 出处 | |---|---| | `cn.etetet.core` (>= 3.0.3) | ET 官方 | | `cn.etetet.login` (>= 3.0.0) | ET 官方 | | `cn.etetet.console` (>= 3.0.0) | ET 官方 | | `cn.etetet.logging` (>= 0.0.1) | ET 官方 | | `cn.etetet.yiuigm` (>= 3.0.4) | ET 官方(仅 `cn.xt.hero/bag/gacha` 需要) | > 拉取方式:建议把 ET 官方仓库整体 clone 到 `Packages/` 同级(典型路径形如 `Packages/cn.etetet.*/`),或在 `manifest.json` 里以 `file:` / git 形式引用。 ### 包间依赖(自家 → 自家) ``` cn.xt.hero ──> cn.xt.bag, cn.xt.config cn.xt.gacha ──> cn.xt.bag 其余 cn.xt.* 包 之间无依赖(含 *invoke 几个零依赖契约包) ``` --- ## 四、快速集成 1. 把整个 `Packages/` 目录的内容拷进新工程的 `Packages/`(保持目录名) 2. 从 ET 官方拉取 `cn.etetet.*` 框架包,放在同一 `Packages/` 下 3. 在 `Packages/manifest.json` 里把这些包都登记进去(或用 `file:` 引用本地路径) 4. Unity 打开工程 → 等 UPM 解析 → 编译 5. 跑工程:登录后用 `Hero-召唤` GM 命令验证 --- ## 五、文档怎么读 - **新人入门** → `Doc/Hero-System-Guide.md` + `Doc/Bag-System-Guide.md` - **改业务** → `Doc/ROK-Spec-Index.md` 进 `ROK-*-Spec.md` - **接 Luban** → `Doc/Luban-Guide.md` + `Doc/ROK-Luban-Field-Mapping.md` - **改 GM** → `Doc/GM-Commands.md` - **改持久化 / 日志** → `Doc/Logging-Guide.md` - **看决策史** → `openspec/changes/port-rok-hero-bag-system/proposal.md` 与 `design.md` - **避免 ET 踩坑** → `.cursor/skills/et-framework-dev/SKILL.md` --- ## 六、未推送内容(明确说明) - ET 框架本体 `cn.etetet.*`(请到 ET 官方 git 拉) - 服务器密钥/密码(`server_connect.md` 已**显式排除**) - 包名迁移工具 `tools/package-namespace-migrator.py`(属本机一次性脚本) - 项目工程(Unity 主工程 `Assets/`、`Library/` 等)